[
  {
    "path": ".codecov.yaml",
    "content": "# https://docs.codecov.com/docs/codecovyml-reference\ncoverage:\n  precision: 2\n  round: down\n  range: 39..75\n\n  status:\n    project:\n      default:\n        target: auto # automatically calculate coverage target - should increase\n        threshold: 1% # allow for 1% reduction without failing\n        if_ci_failed: error\n        only_pulls: false\n    patch:\n      default:\n        target: auto\n        if_ci_failed: error\n        only_pulls: false\n    changes: false\nignore:\n  - \"**/zz_generated.deepcopy.go\"\n"
  },
  {
    "path": ".dockerignore",
    "content": "artifacts/\nartifacts-admin/\nbuild/\n!build/artifacts/\nhack/\npackages/\ndocs/\ntest/\nbin/\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Report a bug to help us improve Tanzu Framework\nlabels: needs-triage, kind/bug\n---\n\n**Bug description**\n\n**Affected product area (please put an X in all that apply)**\n\n- ( ) APIs\n- ( ) Addons\n- ( ) CLI\n- ( ) Docs\n- ( ) IAM\n- ( ) Installation\n- ( ) Plugin\n- ( ) Security\n- ( ) Test and Release\n- ( ) User Experience\n- ( ) Developer Experience\n\n**Expected behavior**\n\n**Steps to reproduce the bug**\n\n**Version** (include the SHA if the version is not obvious)\n\n**Environment where the bug was observed (cloud, OS, etc)**\n\n**Relevant Debug Output (Logs, manifests, etc)**\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea to improve Tanzu Framework\nlabels: needs-triage, kind/feature\n---\n<!-- This is used to request new product features -->\n\n**Describe the feature request**\n\n**Describe alternative(s) you've considered**\n\n**Affected product area (please put an X in all that apply)**\n\n- ( ) APIs\n- ( ) Addons\n- ( ) CLI\n- ( ) Docs\n- ( ) IAM\n- ( ) Installation\n- ( ) Plugin\n- ( ) Security\n- ( ) Test and Release\n- ( ) User Experience\n- ( ) Developer Experience\n\n**Additional context**\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "### What this PR does / why we need it\n\n### Which issue(s) this PR fixes\n<!--\n     Usage: Fixes #<issue number>.\n\n     Unless the PR is for a trivial change (e.g. fixing a typo), consider opening an issue first\n     (and reference it here) so that the problem the PR addresses can be discussed independently of\n     the solutions proposed by this PR.\n-->\n\nFixes #\n\n### Describe testing done for PR\n\n<!-- Example: Created vSphere workload cluster to verify change. -->\n\n### Release note\n<!--\n     Please add a short text (limit to 1 to 2 sentences if possible) in the release-note block below if\n     there is anything in this PR that is worthy of mention in the next release.\n\n     See https://github.com/vmware-tanzu/tanzu-framework/blob/main/docs/release/release-notes.md#does-my-pull-request-need-a-release-note\n     for more details.\n-->\n```release-note\n\n```\n\n<!--\n     ## PR Checklist\n\n     Please ensure the following:\n\n     - Use good commit [messages](https://github.com/vmware-tanzu/tanzu-framework/blob/main/CONTRIBUTING.md)\n     - Ensure PR contains terms all contributors can understand and links all contributors can access\n     - Squash the commits into one or a small number of logical commits\n\n       | This repository adopts a linear git history model where no merge commits are necessary. To\n       | keep the commit history tidy, it is recommended that authors be responsible for the decision\n       | whether to squash the PR's changes into a single commit (and tidy up the commit message in the\n       | process) or organizing them into a small number of self-contained and meaningful ones.\n-->\n\n### Additional information\n\n#### Special notes for your reviewer\n\n<!-- Add notes to that can aid in the review process, or leave blank -->\n\n<!--\n     If this pull request is just an idea or POC, or is not ready for review, instead of \"Create pull request\", please select\n     \"Create draft pull request\" (https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests#draft-pull-requests)\n-->\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "# Dependabot config for go mod version upgrades\n#\n# TODO(vuil):\n# All version updates being disabled with\n# 'open-pull-requests-limit: 0'\n# restoring of version updates being tracked in\n# https://github.com/vmware-tanzu/tanzu-framework/issues/4148\n\nversion: 2\nupdates:\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: \"daily\"\n    open-pull-requests-limit: 0\n\n  - package-ecosystem: \"gomod\"\n    directory: \"/\"\n    schedule:\n      interval: \"daily\"\n    open-pull-requests-limit: 0\n"
  },
  {
    "path": ".github/workflows/build.yaml",
    "content": "name: Build\n\non:\n  push:\n    branches: [main]\n  pull_request:\n\njobs:\n  build:\n    name: build\n    runs-on: ubuntu-latest\n    steps:\n      - name: Free some disk space on runner\n        run: |\n          echo \"free space before cleanup:\"\n          df -h\n          sudo rm -rf /usr/share/dotnet /opt/ghc /usr/local/share/boost /usr/lib/jvm /usr/lib/firefox /opt/microsoft/powershell /opt/hostedtoolcache\n          echo \"free space after cleanup:\"\n          df -h\n\n      - name: Set up Go 1.x\n        uses: actions/setup-go@v3\n        with:\n          go-version: 1.19\n        id: go\n\n      - name: Check out code into the Go module directory\n        uses: actions/checkout@v1\n\n      - name: go cache\n        uses: actions/cache@v3\n        with:\n          path: |\n            ~/.cache/go-build\n            ~/go/pkg/mod\n          key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}\n          restore-keys: |\n            ${{ runner.os }}-go-\n\n      - name: run make docker-build-all\n        run: |\n          make docker-build-all\n\n      - name: Upload coverage reports to Codecov with GitHub Action\n        uses: codecov/codecov-action@v3\n        with:\n          directory: ./build/\n"
  },
  {
    "path": ".github/workflows/cve-scan.yaml",
    "content": "name: CVE Scan\n\non: [pull_request]\n\npermissions:\n  contents: read\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true # Run only for latest head\n\njobs:\n  trivy_scan:\n    permissions:\n      contents: read # for actions/checkout to fetch code\n      security-events: write # for github/codeql-action/upload-sarif to upload SARIF results\n      actions: read # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status\n    name: Trivy Scan\n    runs-on: \"ubuntu-latest\"\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v3\n\n      - name: Run Trivy vulnerability scanner in repo mode\n        uses: aquasecurity/trivy-action@master\n        with:\n          scan-type: 'fs'\n          ignore-unfixed: true\n          exit-code: 1\n          format: 'sarif'\n          output: 'trivy-results.sarif'\n          severity: 'CRITICAL,HIGH'\n          skip-dirs: 'docs'\n          scanners: 'vuln'\n          limit-severities-for-sarif: true\n\n      - name: Upload Trivy scan results to GitHub Security tab\n        uses: github/codeql-action/upload-sarif@v2\n        if: always()\n        with:\n          sarif_file: 'trivy-results.sarif'\n"
  },
  {
    "path": ".github/workflows/lint-all.yaml",
    "content": "name: Lint\n\non:\n  pull_request:\n    branches: [ main, release-* ]\n\njobs:\n  lint:\n    name: lint\n    runs-on: ubuntu-latest\n    steps:\n      - name: Free some disk space on runner\n        run: |\n          echo \"free space before cleanup:\"\n          df -h\n          sudo rm -rf /usr/share/dotnet /opt/ghc /usr/local/share/boost /usr/lib/jvm /usr/lib/firefox /opt/microsoft/powershell /opt/hostedtoolcache\n          echo \"free space after cleanup:\"\n          df -h\n\n      - name: Set up Go 1.x\n        uses: actions/setup-go@v3\n        with:\n          go-version: 1.19\n        id: go\n\n      - name: Check out code into the Go module directory\n        uses: actions/checkout@v1\n\n      - name: go cache\n        uses: actions/cache@v3\n        with:\n          path: |\n            ~/.cache/go-build\n            ~/go/pkg/mod\n          key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}\n          restore-keys: |\n            ${{ runner.os }}-go-\n\n      - name: Cache linting\n        uses: actions/cache@v3\n        with:\n          path: ${{ runner.temp }}/lint_cache\n          key: ${{ runner.os }}-lint-cache-2\n\n      - name: Run lint checks\n        env:\n          GOLANGCI_LINT_CACHE: ${{ runner.temp }}/lint_cache\n        run: |\n          make lint-all\n"
  },
  {
    "path": ".github/workflows/verify-label.yaml",
    "content": "---\nname: Merge Checker\non:\n  pull_request:\n    types:\n      - opened\n      - synchronize\n      - reopened\n      - labeled\n      - unlabeled\n\njobs:\n\n  check_labels:\n    name: Check labels\n    runs-on: ubuntu-latest\n    steps:\n      - uses: docker://agilepathway/pull-request-label-checker:latest\n        with:\n          none_of: do-not-merge/hold\n          one_of: ok-to-merge\n          repo_token: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/verify.yaml",
    "content": "name: Verify\n\non:\n  pull_request:\n    branches: [ main, release-* ]\n\njobs:\n  verify:\n    name: verify\n    runs-on: ubuntu-latest\n    steps:\n    - name: Free some disk space on runner\n      run: |\n        echo \"free space before cleanup:\"\n        df -h\n        sudo rm -rf /usr/share/dotnet /opt/ghc /usr/local/share/boost /usr/lib/jvm /usr/lib/firefox /opt/microsoft/powershell /opt/hostedtoolcache\n        echo \"free space after cleanup:\"\n        df -h\n\n    - name: Set up Go 1.x\n      uses: actions/setup-go@v3\n      with:\n        go-version: 1.19\n      id: go\n\n    - name: Check out code into the Go module directory\n      uses: actions/checkout@v1\n\n    - name: go cache\n      uses: actions/cache@v3\n      with:\n        path: |\n          ~/.cache/go-build\n          ~/go/pkg/mod\n        key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}\n        restore-keys: |\n          ${{ runner.os }}-go-\n\n    - name: Run make verify\n      run: |\n        make verify\n"
  },
  {
    "path": ".github/workflows/welcome-contributors.yaml",
    "content": "name: 'Housekeeping - Welcome New Contributors'\n\non:\n  issues:\n    types: [opened]\n  pull_request_target:\n    types: [opened]\n\njobs:\n  welcome-new-contributor:\n    runs-on: ubuntu-latest\n    steps:\n      - name: 'Greet the contributor'\n        uses: garg3133/welcome-new-contributors@v1.2\n        with:\n          token: ${{ secrets.GITHUB_TOKEN }}\n          issue-message: 'Hey @contributor_name! Thanks for opening your first issue. We appreciate your contribution and welcome you to our community! We are glad to have you here and to have your input on Tanzu Framework.'\n          pr-message: 'Hi @contributor_name! And thank you for opening your first Pull Request. Someone will review it soon. Thank you for committing to making Tanzu Framework better.'\n"
  },
  {
    "path": ".gitignore",
    "content": "# NOTE: do not add IDE, editor, or OS-specific patterns here.\n# Individuals should add these to their global gitignore.\n#\n# Example:\n# git config --global core.excludesfile ~/.gitignore\n#\n# cat ~/.gitignore\n.idea\n#   .vscode\n#   *~\n\n# Binaries for programs and plugins\n*.exe\n*.exe~\n*.dll\n*.so\n*.dylib\n*.bak\nbin\nartifacts\n\n# Build artifacts that may not be cleaned up properly\n.rendered-output/\n\n# Test binary, build with `go test -c`\n*.test\n\n# Output of the go coverage tool, specifically when used with LiteIDE\ncoverage.txt\n*.out\ncoverage.txt\n\n# Kubernetes Generated files - skip generated files, except for vendored files\n\n!vendor/**/zz_generated.*\n\n# Build artifacts related to packages\n/build\n/packages/package-values-sha256.yaml\n/packages/**/.imgpkg\n"
  },
  {
    "path": ".golangci.yaml",
    "content": "linters-settings:\n  dupl:\n    threshold: 100\n  funlen:\n    lines: 100\n    statements: 50\n  goheader:\n    values:\n      const:\n       COMPANY: VMware, Inc.\n       LICENSE: Apache-2.0\n      regexp:\n       YEAR: 20\\d*-*\\d*\n    template: |-\n      Copyright {{ YEAR }} {{ COMPANY }} All Rights Reserved.\n      SPDX-License-Identifier: {{ LICENSE }}\n  goconst:\n    min-len: 2\n    min-occurrences: 2\n  gocritic:\n    enabled-tags:\n      - diagnostic\n      - experimental\n      - opinionated\n      - performance\n      - style\n    disabled-checks:\n      - dupImport # https://github.com/go-critic/go-critic/issues/845\n      - ifElseChain\n      - octalLiteral\n      - whyNoLint\n      - wrapperFunc\n  gocyclo:\n    min-complexity: 15\n  goimports:\n    local-prefixes: github.com/vmware-tanzu\n  govet:\n    check-shadowing: true\n    settings:\n      printf:\n        funcs:\n          - (github.com/aunum/log\").Infof\n          - (github.com/aunum/log\").Warnf\n          - (github.com/aunum/log\").Errorf\n          - (github.com/aunum/log\").Fatalf\n  misspell:\n    locale: US\n  nolintlint:\n    allow-leading-space: true # don't require machine-readable nolint directives (i.e. with no leading space)\n    allow-unused: false # report any unused nolint directives\n    require-explanation: false # don't require an explanation for nolint directives\n    require-specific: false # don't require nolint directives to be specific about which linter is being skipped\n  whitespace:\n    multi-func: true\n\nlinters:\n  disable-all: true\n  enable:\n    - bodyclose\n    - deadcode\n    - depguard\n    - dogsled\n    - dupl\n    - errcheck\n    - funlen\n    - goconst\n    - gocritic\n    - gocyclo\n    - goheader\n    - goimports\n    - goprintffuncname\n    - gosec\n    - gosimple\n    - govet\n    - ineffassign\n    - misspell\n    - nakedret\n    - noctx\n    - nolintlint\n    - revive\n    - rowserrcheck\n    - staticcheck\n    - structcheck\n    - stylecheck\n    - typecheck\n    - unconvert\n    - unparam\n    - unused\n    - varcheck\n    - whitespace\n\n  # don't enable:\n  # - asciicheck\n  # - exhaustive\n  # - gochecknoinits\n  # - gochecknoglobals\n  # - gocognit\n  # - godot\n  # - godox\n  # - goerr113\n  # - interfacer\n  # - lll\n  # - nestif\n  # - prealloc\n  # - testpackage\n  # - scopelint\n  # - wsl\n\nissues:\n  exclude:\n    - 'declaration of \"(err|ctx)\" shadows declaration at'\n    - 'unnamedResult: consider giving a name to these results'\n    - '(Expect directory permissions to be 0750 or less|Expect (WriteFile|file) permissions to be 0600 or less)'\n\n  exclude-rules:\n    - path: _test\\.go\n      linters:\n        - dupl\n        - gocritic\n        - funlen\n\n    # https://github.com/go-critic/go-critic/issues/926\n    - linters:\n        - gocritic\n      text: \"unnecessaryDefer:\"\n\n    - linters:\n        - revive\n      text: \"that stutters\"\n\n    - path: zz_.*\\.go\n      linters:\n        - revive\n      text: \"it will be inferred from\"\n\n  include:\n    - EXC0011 # disable excluding of issues about missing package comments from stylecheck\n\n  # Show all errors for all linters. Setting these to 0 disables limiting error reporting.\n  max-same-issues: 0\n  max-issues-per-linter: 0\n\nrun:\n  skip-dirs:\n    - test/\n    - fakes/\n  timeout: 15m\n\n# golangci.com configuration\n# https://github.com/golangci/golangci/wiki/Configuration\nservice:\n  golangci-lint-version: 1.38.0 # use the fixed version to not introduce new linters unexpectedly\n"
  },
  {
    "path": ".markdownlintrc",
    "content": "{\n  \"default\": true,\n  \"line_length\": false,\n  \"MD024\": { \"allow_different_nesting\": true },\n  \"MD026\": { \"punctuation\": \".,;:!\" },\n  \"DM046\": { \"style\": \"fenced\" },\n  \"MD033\": { \"allowed_elements\": [ \"details\", \"summary\" ] }\n}\n"
  },
  {
    "path": ".trivy.yaml",
    "content": "# Ref: https://aquasecurity.github.io/trivy/v0.33/docs/references/customization/config-file\n# Global Options\ndebug: true\n# Report Options\nexit-code: 1\nformat: 'sarif'\noutput: 'trivy-results.sarif'\nseverity:\n  - CRITICAL\n  - HIGH\n# Scan Options\nscan:\n  skip-dirs:\n    - docs\n  scanners:\n    - vuln\n# Vulnerability Options\nvulnerability:\n  ignore-unfixed: true\n"
  },
  {
    "path": ".vale/config.ini",
    "content": "StylesPath = styles\n\n[{README,CONTRIBUTING,CODE-OF-CONDUCT,docs/*}.md]\nBasedOnStyles = vmware\n"
  },
  {
    "path": ".vale/styles/vmware/inclusive.yml",
    "content": "extends: substitution\nmessage: Use '%s' instead of '%s' for inclusivity\nlevel: error\nignorecase: true\nswap:\n  blacklist: denylist\n  disable: deactivate\n  disabled: deactivated\n  disabling: deactivating\n  master: main/primary/leader/controller\n  slave: follower/replica/secondary\n  whitelist: allowlist\n"
  },
  {
    "path": "ADOPTERS.md",
    "content": "# Tanzu Framework Adopters\n\nIf you're using Tanzu Framework and want to add your organization to this list,\n[follow these directions][1]!\n\n## Solutions built with Tanzu Framework\n\nBelow is a list of solutions where Tanzu Framework is being used as a component.\n\n## Adding your organization to the list of Tanzu Framework Adopters\n\nIf you would like to be included here, please add an SVG/PNG version of your logo to the `/docs/adopters` directory in this repo and submit a pull request with your change. Name the image file something that reflects your company (e.g., if your company is called Acme, name the image acme.png).\n\n[1]: #adding-your-organization-to-the-list-of-tanzu-framework-adopters\n"
  },
  {
    "path": "CODE-OF-CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in Tanzu\nprojects and our commuity a harassment-free experience for everyone, regardless\nof age, body size, visible or invisible disability, ethnicity, sex\ncharacteristics, gender identity and expression, level of experience,\neducation, socio-economic status, nationality, personal appearance, race,\nreligion, or sexual identity and orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n* Demonstrating empathy and kindness toward other people\n* Being respectful of differing opinions, viewpoints, and experiences\n* Giving and gracefully accepting constructive feedback\n* Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n* Focusing on what is best not just for us as individuals, but for the\n  overall community\n\nExamples of unacceptable behavior include:\n\n* The use of sexualized language or imagery, and sexual attention or\n  advances of any kind\n* Trolling, insulting or derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or email\n  address, without their explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at oss-coc@vmware.com.\nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series\nof actions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or\npermanent ban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior,  harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within\nthe community.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.0, available at\n[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html](https://www.contributor-covenant.org/version/2/0/code_of_conduct.html).\n\nCommunity Impact Guidelines were inspired by [Mozilla's code of conduct\nenforcement ladder](https://github.com/mozilla/diversity).\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see the FAQ at\n[https://www.contributor-covenant.org/faq](https://www.contributor-covenant.org/faq).\nTranslations are available at\n[https://www.contributor-covenant.org/translations](https://www.contributor-covenant.org/translations).\n"
  },
  {
    "path": "CODEOWNERS",
    "content": "* @vmware-tanzu/tanzu-runtime-core-maintainers"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\n## Table of Contents\n\n* [Contributing](#contributing)\n* [Communication](#communication)\n* [Propose a Change](#propose-a-change)\n* [Contribute a Change](#contribute-a-change)\n  * [Commit Messages](#commit-messages)\n* [Pull Request Process](#pull-request-process)\n  * [Creating a Pull Request](#creating-a-pull-request)\n  * [Getting your Pull Request Reviewed, Approved, and Merged](#getting-your-pull-request-reviewed-approved-and-merged)\n  * [Merging a Pull Request](#merging-a-pull-request)\n* [Contributor License Agreement](#contributor-license-agreement)\n\n--------------\n\nWe’d love to accept your patches and contributions to this project. Please\nreview the following guidelines you'll need to follow in order to make a\ncontribution.\n\nIf you are interested in going beyond a single PR, take a look at our\n[Contribution Ladder](docs/community/contribution-ladder.md) and learn how to become a\nreviewer.\n\n## Communication\n\nWe prefer communicating asynchronously through GitHub issues. We currently do\nnot have a slack channel or email list (hopefully soon).\n\n## Propose a Change\n\nWe suggest beginning by submitting an issue so any high level feedback can be\naddressed early, particularly if significant effort will be involved.\n\nPlease submit feature requests and bug reports by using GitHub issues and filling\nin the supplied template with as much detail as you can.\n\nBefore submitting an issue, please search through open ones to ensure others\nhave not submitted something similar. If a similar issue exists, please add any\nadditional information as a comment.\n\n## Contribute a Change\n\nPull requests are welcome for all changes, whether they are improving\ndocumentation, fixing a bug, adding or enhancing a feature, or fixing a typo.\n\nChanges to the behavior of the `tanzu-framework` itself will require that you\nbuild and test your changes.\n\nWhen adding new functionality, or fixing bugs, add appropriate test coverage\nwhere possible. Different parts of the code base have different strategies and\npatterns for testing, some of which may be in flux at any point in time.\nConsider commenting on the issue to seek input or opening a draft pull\nrequest to seek feedback on approaches to testing a particular change.\n\nTo build the project from source, please consider the docs on [local development](docs/dev/build.md).\n\n### Commit Messages\n\n* Commit messages should include a short (72 chars or less) title summarizing the change.\n* They should also include a body with more detailed explanatory text, wrapped to 72 characters.\n  * The blank line separating the summary from the body is critical (unless you omit the body entirely).\n* Commit messages should be written in the imperative: \"Implement feature\" and not \"Implemented feature\".\n* Bulleted points are fine.\n* Typically a hyphen or asterisk is used for the bullet, followed by a single space.\n\n## Pull Request Process\n\n### Creating a Pull Request\n\nUse the pull request template to provide a complete description of the change.\nThe template aims to capture important information to streamline the review\nprocess, ensure your changes are captured in release notes, and update related\nissues. Your pull request description and any discussion that follows is a\ncontribution itself that will help the community and future contributors\nunderstand the project better.\n\n* Before submitting a pull request, please make sure you verify the changes\n  locally. The `Makefile` in this repository provides useful targets such as\n  `lint` and `test` to make verification easier.\n* Prefer small commits and small pull requests over large changes.\n  Small changes are easier to digest and get reviewed faster. If you find\n  that your change is getting large, break up your PR into small, logical\n  commits. Consider breaking up large PRs into smaller PRs, if each of them\n  can be useful on its own.\n* Have good commit messages. Please see the [Commit Messages](#commit-messages)\n  section for guidelines.\n* Pull requests *should* reference an existing issue and include a `Fixes #NNNN`\n  or `Updates #NNNN` comment. Remember that `Fixes` will close the associated\n  issue, and `Updates` will link the PR to it.\n* Pull requests should normally target the `main` branch.\n\n### Getting your Pull Request Reviewed, Approved, and Merged\n\nOnce a pull request has been opened, the following must take place before it is merged:\n\n* It needs the `ok-to-merge` label.\n* It needs to pass all the checks.\n* It needs to be approved by a [CODEOWNER](https://github.com/vmware-tanzu/tanzu-framework/blob/main/CODEOWNERS) for all files changed.\n\nWhile these steps will not always take place in the same order, the following describes the process for a typical pull request once it is opened:\n\n1. Review is automatically requested from CODEOWNERS.\n2. Assignee is added to pull request to ensure it gets proper attention throughout the process.\n   Typically one of the CODEOWNERS will assign themselves, but they may choose to delegate to someone else.\n3. Triage adds `ok-to-merge` if the pull request is generally aligned with product goals and does not conflict with current milestones; otherwise they may add a comment and a `do-not-merge/*` label.\n4. Assignee may request others to do an initial review; anyone else may review.\n5. Reviewers leave feedback.\n6. Contributor updates pull request to address feedback.\n7. Requested reviewer approves pull request.\n8. Assignee approves pull request.\n9. Assignee merges pull request or requests another member to merge it if necessary.\n\nDuring the review process itself, direct discussion among contributors and reviewers is encouraged.\n\nThroughout the process, and until the pull request has been merged, the following should be transparent to the contributor:\n\n* Has the pull request been assigned to anyone yet?\n* Has the pull request been labeled with `ok-to-merge` or `do-not-merge/*`?\n* Has someone been requested to review the pull request?\n* Has the PR been approved by a reviewer?\n* Has the PR been approved by the approver?\n\nIf any of the above is unclear, and there has been no new activity for 2-3 days,\nthe contributor is encouraged to seek further information by commenting and\nmentioning the assignee or @vmware-tanzu/tanzu-framework-reviewers if there is\nno assignee or they themselves are unresponsive.\n\n### Merging a Pull Request\n\nMaintainers should prefer to merge pull requests with the [Squash and merge](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-request-merges#squash-and-merge-your-pull-request-commits) option.\nThis option is preferred for a number of reasons.\nFirst, it causes GitHub to insert the pull request number in the commit subject\nwhich makes it easier to track which PR the changes landed in.\nSecond, a one-to-one correspondence between pull requests and commits makes it\neasier to manage reverting changes.\n\nAt a maintainer's discretion, pull requests with multiple commits can be merged\nwith the [Rebase and merge](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-request-merges#rebase-and-merge-your-pull-request-commits)\noption. Merging pull requests with multiple commits can make sense in cases\nwhere a change involves code generation or mechanical changes that can be\ncleanly separated from semantic changes. The maintainer should review commit\nmessages for each commit and make sure that each commit builds and passes\ntests.\n\n## Contributor License Agreement\n\nAll contributors to this project must have a signed Contributor License\nAgreement (**\"CLA\"**) on file with us. The CLA grants us the permissions we\nneed to use and redistribute your contributions as part of the project; you or\nyour employer retain the copyright to your contribution. Before a PR can pass\nall required checks, our CLA action will prompt you to accept the agreement.\nHead over to [https://cla.vmware.com/](https://cla.vmware.com/) to see your\ncurrent agreement(s) on file or to sign a new one.\n\nWe generally only need you (or your employer) to sign our CLA once and once\nsigned, you should be able to submit contributions to any VMware project.\n\nNote: a signed CLA is required even for minor updates. If you see something\ntrivial that needs to be fixed, but are unable or unwilling to sign a CLA, the\nmaintainers will be happy to make the change on your behalf. If you can\ndescribe the change in a [bug\nreport](https://github.com/vmware-tanzu/tanzu-framework/issues/new/choose),\nit would be greatly appreciated.\n"
  },
  {
    "path": "Dockerfile",
    "content": "# Copyright 2023 VMware, Inc. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\n# This Dockerfile is currently consumed by build tooling https://github.com/vmware-tanzu/build-tooling-for-integrations\n# to build components in tanzu-framework, check out build-tooling.mk to understand how this is being consumed.\n\nARG BUILDER_BASE_IMAGE=golang:1.19\nARG ENVTEST_K8S_VERSION=1.26.1\nARG TANZU_CLI_VERSION=0.90.0\n\nFROM --platform=${BUILDPLATFORM} $BUILDER_BASE_IMAGE as base\nARG COMPONENT\nARG GOPROXY_ARG\nENV GOPROXY=${GOPROXY_ARG}\nWORKDIR /workspace\nRUN --mount=target=. \\\n    --mount=type=cache,target=/go/pkg/mod \\\n    cd $COMPONENT && go mod download\n\n# Linting\nFROM golangci/golangci-lint:v1.52.2 AS lint-base\nFROM base AS lint\nRUN --mount=target=. \\\n    --mount=from=lint-base,src=/usr/bin/golangci-lint,target=/usr/bin/golangci-lint \\\n    --mount=type=cache,target=/go/pkg/mod \\\n    --mount=type=cache,target=/root/.cache/go-build \\\n    --mount=type=cache,target=/root/.cache/golangci-lint \\\n    cd $COMPONENT && golangci-lint run --config /workspace/.golangci.yaml --timeout 10m0s ./...\n\nFROM base AS fmt\nRUN --mount=target=. \\\n    --mount=type=cache,target=/go/pkg/mod \\\n    --mount=type=cache,target=/root/.cache/go-build \\\n    cd $COMPONENT && go fmt ./...\n\nFROM base AS vet\nRUN --mount=target=. \\\n    --mount=type=cache,target=/go/pkg/mod \\\n    --mount=type=cache,target=/root/.cache/go-build \\\n    cd $COMPONENT && go vet ./...\n\n# Testing\nFROM --platform=${BUILDPLATFORM} $BUILDER_BASE_IMAGE as test-base\nARG ENVTEST_K8S_VERSION\nRUN go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest\nRUN setup-envtest use ${ENVTEST_K8S_VERSION} --bin-dir /bin\n\nFROM base AS test\nARG ENVTEST_K8S_VERSION\nARG BUILDARCH\nRUN --mount=target=. \\\n    --mount=type=cache,target=/go/pkg/mod \\\n    --mount=type=cache,target=/root/.cache/go-build \\\n    --mount=from=test-base,src=/bin/k8s,target=/bin/k8s \\\n    cd $COMPONENT && mkdir /out && KUBEBUILDER_ASSETS=/bin/k8s/${ENVTEST_K8S_VERSION}-linux-${BUILDARCH} go test -v -coverprofile=/out/cover.out ./...\n\n# Build the manager binary\nFROM base as builder\nARG TARGETOS\nARG TARGETARCH\nARG LD_FLAGS\nENV LD_FLAGS=\"$LD_FLAGS \"'-extldflags \"-static\"'\nRUN --mount=target=. \\\n    --mount=type=cache,target=/go/pkg/mod \\\n    cd $COMPONENT && CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} GO111MODULE=on go build -o /out/manager ./main.go\n\n# Download and install Carvel's imgpkg program.\nFROM --platform=${BUILDPLATFORM} $BUILDER_BASE_IMAGE as carvel-base\nARG IMGPKG_VERSION\nARG BUILDARCH\nRUN wget -O /bin/imgpkg https://github.com/vmware-tanzu/carvel-imgpkg/releases/download/${IMGPKG_VERSION}/imgpkg-linux-${BUILDARCH} && \\\n    chmod +x /bin/imgpkg\n\n# Install Tanzu CLI Plugin Builder via Tanzu CLI or using Tanzu Builder binary, if it is provided.\n# Note: We are temporarily using a deactivated plugin until a bug fix is made to the plugin builder.\nFROM --platform=${BUILDPLATFORM} $BUILDER_BASE_IMAGE AS cli-plugin-builder-install\nARG TANZU_CLI_VERSION\nRUN --mount=target=. \\\n    if [ -e build/artifacts/plugins/tanzu-cli/tanzu_builder ]; then \\\n        mkdir -p /root/.local/share/tanzu-cli/builder/ && \\\n        cp build/artifacts/plugins/tanzu-cli/tanzu_builder /root/.local/share/tanzu-cli/builder/ && \\\n        chmod +x /root/.local/share/tanzu-cli/builder/tanzu_builder && \\\n        ln -s /root/.local/share/tanzu-cli/builder/tanzu_builder /usr/bin/tanzu_builder; \\\n    else \\\n        apt-get update && \\\n        apt-get install -y ca-certificates && \\\n        printf \"deb https://storage.googleapis.com/tanzu-cli-os-packages/apt tanzu-cli-jessie main\" | tee /etc/apt/sources.list.d/tanzu.list && \\\n        apt-get update --allow-insecure-repositories && \\\n        apt-get install -y tanzu-cli=\"${TANZU_CLI_VERSION}\" --allow-unauthenticated && \\\n        tanzu ceip set true && \\\n        tanzu config eula accept && \\\n        TANZU_CLI_INCLUDE_DEACTIVATED_PLUGINS_TEST_ONLY=true tanzu plugin install builder -v v0.90.0-alpha.2 && \\\n        ln -s $(find /root/.local/share/tanzu-cli/builder/ -type f -name \"v$TANZU_CLI_VERSION*\") /usr/bin/tanzu_builder; \\\n    fi\n\n# Run Tanzu plugin builder and compile all plugins in the project's cmd/cli/plugin directory.\nFROM base AS cli-plugin-build-prep\nARG CLI_PLUGIN_VERSION\nARG CLI_PLUGIN\nARG OCI_REGISTRY\nARG CLI_PLUGIN_GO_FLAGS\nRUN --mount=type=bind,readwrite \\\n    --mount=from=carvel-base,src=/bin/imgpkg,target=/bin/imgpkg \\\n    --mount=from=cli-plugin-builder-install,src=/usr/bin/tanzu_builder,target=/usr/bin/tanzu_builder \\\n    tanzu_builder plugin build \\\n        --match \"${CLI_PLUGIN}\" \\\n        --os-arch linux_amd64 --os-arch windows_amd64 --os-arch darwin_amd64 \\\n        --version \"${CLI_PLUGIN_VERSION}\" \\\n        --binary-artifacts \"./artifacts/plugins\" \\\n        --goflags \"${CLI_PLUGIN_GO_FLAGS}\" && \\\n    tanzu_builder plugin build-package \\\n        --oci-registry \"${OCI_REGISTRY}\" && \\\n    mkdir -p /out/plugin-artifacts && \\\n    cp -r artifacts /out/plugin-artifacts\n\n# Run Tanzu plugin builder and publish plugins listed in\n# build/artifacts/packages/plugin_manifest.yaml.\nFROM base AS cli-plugin-publish \nARG REPOSITORY\nARG PUBLISHER\nARG VENDOR\nARG IMGPKG_USERNAME\nARG IMGPKG_PASSWORD\nENV IMGPKG_USERNAME=${IMGPKG_USERNAME} IMGPKG_PASSWORD=${IMGPKG_PASSWORD}\nRUN --mount=type=bind,readwrite \\\n    --mount=from=carvel-base,src=/bin/imgpkg,target=/bin/imgpkg \\\n    --mount=from=cli-plugin-builder-install,src=/usr/bin/tanzu_builder,target=/bin/tanzu_builder \\\n    tanzu_builder plugin publish-package \\\n        --repository \"${REPOSITORY}\" \\\n        --publisher \"${PUBLISHER}\" \\\n        --vendor \"${VENDOR}\" \\\n        --package-artifacts \"./build/artifacts/packages\"\n\n# Use distroless as minimal base image to package the manager binary\n# Refer to https://github.com/GoogleContainerTools/distroless for more details\nFROM gcr.io/distroless/static:nonroot as image\nWORKDIR /\nCOPY --from=builder /out/manager .\nUSER nonroot:nonroot\n\nENTRYPOINT [\"/manager\"]\n\nFROM scratch AS unit-test-coverage\nCOPY --from=test /out/cover.out /cover.out\n\nFROM scratch AS bin-unix\nCOPY --from=builder /out/manager /\n\nFROM bin-unix AS bin-linux\nFROM bin-unix AS bin-darwin\n\nFROM scratch AS bin-windows\nCOPY --from=builder /out/manager /manager.exe\n\nFROM bin-${TARGETOS} as bin\n\nFROM scratch as cli-plugin-build\nCOPY --from=cli-plugin-build-prep /out/plugin-artifacts/ .\n"
  },
  {
    "path": "GOVERNANCE.md",
    "content": "# Tanzu Framework Repository Governance\n\nThis document defines the project governance for Tanzu Framework, an open source project by VMware.\n\n## Overview\n\nFramework offers an open source repository that will serve multiple Tanzu products including [Tanzu Community Edition](https://github.com/vmware-tanzu/tce).\n\n## The Framework Repository\n\nFramework exists in a single repository and is governed by VMware and maintained under the vmware-tanzu organization.\n\n* Framework: Multiple Tanzu products build atop our Framework. The Framework includes APIs, shared libraries, and\nthe Tanzu CLI and tools for integration.\n\n## Community\n\n* Users: Members who consume Framework and engage through valuable feedback and unique perspectives.\n* Contributors: Members who contribute to Framework through documentation, code reviews, responding to\n  issues, participation in proposal discussions, contributing code, etc.\n* Maintainers: Framework leaders are current employees of VMware. They are responsible for the overall\n  health and direction of the project; final reviewers of PRs and responsible for releases. Some Maintainers are\n  responsible for one or more components within Framework codebase, acting as technical leads, product managers and\n  engineering managers for that component. Maintainers are expected to contribute code and documentation, review PRs\n  including ensuring quality of code, triage issues, proactively fix bugs, and perform maintenance tasks for these\n  components. If a maintainer leaves VMware, he/she will also leave the maintainer position. The CODEOWNERS file in\n  the root directory specifies the maintainer list of people or team (via alias) for the responsibilities to the code\n  in the tree structure.\n\n## Proposal Process\n\nOne of the most important aspects in any open source community is the concept of proposals. All large changes to the\ncodebase and / or new features, including ones proposed by maintainers, should be preceded by a proposal in our\ncommunity repo. This process allows for all members of the community to weigh in on the concept (including the technical details), share their comments and ideas, and offer to help. It also ensures that members are not duplicating work or inadvertently stepping on toes by making large conflicting changes.\n\nThe project roadmap is defined by accepted proposals.\n\nProposals should cover the high-level objectives, use cases, and technical recommendations on how to implement. In general,\nthe community member(s) interested in implementing the proposal should be either deeply engaged in the proposal process or\nbe an author of the proposal.\n\nThe proposal should be documented as a separated markdown file and pushed to the [design folder](docs/design) via PR. The name of the file should follow the name pattern `<short meaningful words joined by '-'>-design.md`,\ne.g: `restore-hooks-design.md`.\n\nUse the [Proposal Template](docs/dev/_proposal.md) as a starting point.\n\n## Proposal Lifecycle\n\nThe proposal PR follows the GitHub lifecycle of the PR to indicate its status:\n\n* Open: Proposal is created and under review and discussion.\n* Accepted: Proposal has been reviewed and accepted, and labeled “accepted\" for tracking purposes.\n* Rejected: Proposal has been reviewed and rejected, and labeled “rejected” for tracking purposes.\n* Merged: Proposal has been accepted and code is merged in the repo.\n* Closed: Proposal has been finished by the lifecycle either Merged or Rejected.\n\n### Lazy Consensus\n\nTo maintain velocity in a project, the concept of Lazy Consensus is practiced. Ideas and / or proposals should be shared by\nmaintainers via GitHub with the appropriate maintainer groups (e.g., @vmware-tanzu/tanzu-framework-reviewers) tagged. Out of respect\nfor other contributors, major changes should be listed in the [ROADMAP](ROADMAP.md) to centralize the direction of the project.\nAuthor(s) of proposals, pull requests, issues, etc. will specify a time period of no less than five (5) working days for comment\nand remain cognizant of popular observed world holidays.\n\nOther maintainers may request additional time for review, but should avoid blocking progress and abstain from delaying progress\nunless absolutely needed. The expectation is that blocking progress is accompanied by a guarantee to review and respond to the\nrelevant action(s) (proposals, PRs, issues, etc.) in short order. All pull requests need to be approved by two (2) maintainers.\n"
  },
  {
    "path": "LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n"
  },
  {
    "path": "MAINTAINERS.md",
    "content": "# Tanzu Framework Maintainers\n\n## Maintainers\n\n| Maintainer   | GitHub ID                                | Affiliation                              |\n|--------------|------------------------------------------|------------------------------------------|\n| Jeff Moroski | [jmoroski](https://github.com/jmoroski ) | [VMware](https://www.github.com/vmware/) |\n\n## Framework Core Contributors and Stakeholders\n\n| Feature Area           | Lead                                                                          |\n|------------------------|-------------------------------------------------------------------------------|\n| Tech Lead              | Jeff Moroski [jmoroski](https://github.com/jmoroski)                          |\n| Engineering Management | Daniel Guo [danniel1205](https://github.com/danniel1205)                      |\n| Engineering            | Rajath Agasthya [rajathagasthya](https://github.com/rajathagasthya)           |\n| Engineering            | Harish Yayi [yharish991](https://github.com/yharish991)                       |\n| Engineering            | Frankie Gold [codegold79](https://github.com/codegold79)                      |\n| Engineering            | Sathyanarayanan Saravanamuthu [sathyanarays](https://github.com/sathyanarays) |\n| Engineering            | Avi Sharma [avi-08](https://github.com/avi-08)                                |\n| Engineering            | Vandana Pathak [Vandy-P](https://github.com/Vandy-P)                          |\n"
  },
  {
    "path": "Makefile",
    "content": "# Copyright 2021 VMware, Inc. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\ninclude ./common.mk ./build.mk ./e2e.mk\n\n.DEFAULT_GOAL:=help\n\nSHELL := /usr/bin/env bash\n\n# Produce CRDs that work back to Kubernetes 1.11 (no version conversion)\nCRD_OPTIONS ?= \"crd\"\n\nifeq ($(GOHOSTOS), linux)\nXDG_DATA_HOME := ${HOME}/.local/share\nendif\nifeq ($(GOHOSTOS), darwin)\nXDG_DATA_HOME := \"$${HOME}/Library/Application Support\"\nendif\n\n# Directories\nTOOLS_DIR := $(abspath hack/tools)\nTOOLS_BIN_DIR := $(TOOLS_DIR)/bin\nBIN_DIR := bin\nGO_MODULES=$(shell find . -path \"*/go.mod\" | xargs -I _ dirname _)\n\nifndef IS_OFFICIAL_BUILD\nIS_OFFICIAL_BUILD = \"\"\nendif\n\n# Package tooling related variables\nPACKAGE_VERSION ?= ${BUILD_VERSION}\nREPO_BUNDLE_VERSION ?= ${BUILD_VERSION}\n\n# OCI registry for hosting tanzu framework components (containers and packages)\nOCI_REGISTRY ?= projects.registry.vmware.com/tanzu_framework\nexport OCI_REGISTRY\n\n##\n## Install targets\n##\n\n.PHONY: install\n# Install CRDs into a cluster\ninstall: manifests tools\n\tkubectl apply -f apis/core/config/crd/bases\n\n.PHONY: uninstall\n# Uninstall CRDs from a cluster\nuninstall: manifests\n\tkubectl delete -f apis/core/config/crd/bases\n\n##\n## Version\n##\n\n.PHONY: version\n# Show generated build version\nversion:\n\t@echo $(BUILD_VERSION)\n\n##\n## Testing, verification, formating and cleanup\n##\n\n.PHONY: lint-all\n# Run linting and misspell checks\nlint-all: tools go-lint doc-lint misspell yamllint\n\t# Check licenses in shell scripts and Makefiles\n\thack/check-license.sh\n\n.PHONY: misspell\nmisspell:\n\thack/check/misspell.sh\n\n.PHONY: yamllint\nyamllint:\n\thack/check/check-yaml.sh\n\n\n# These are the modules that still contain issues reported by golangci-lint.\n# Once a module is updated to be lint-free, remove from list to catch lint regressions.\nMODULES_NEEDING_LINT_FIX= . ./apis/core\n\n.PHONY: go-lint\n# Run linting of go source\ngo-lint: tools\n\t@for i in $(GO_MODULES); do \\\n\t\techo \"-- Linting $$i --\"; \\\n\t\tpushd $${i} > /dev/null; \\\n\t\tif echo ${MODULES_NEEDING_LINT_FIX} | tr ' ' '\\n' | grep -q -x $$i; then \\\n\t\t\t$(GOLANGCI_LINT) run -v --timeout=10m; \\\n\t\t\tif [ $$? -eq 0 ]; then \\\n\t\t\t\techo \"****** NOTE: $$i is now lint-free. Recommend it be excluded from MODULES_NEEDING_LINT_FIX in Makefile\"; \\\n\t\t\telse \\\n\t\t\t\techo; echo \"****** WARNING: module $$i needs lint fixes\"; echo; \\\n\t\t\tfi; \\\n\t\telse \\\n\t\t\t$(GOLANGCI_LINT) run -v --timeout=10m || exit 1; \\\n\t\tfi; \\\n\t\tpopd > /dev/null; \\\n\tdone\n\n\t# Prevent use of deprecated ioutils module\n\t@CHECK=$$(grep -r --include=\"*.go\" --exclude=\"zz_generated*\" ioutil .); \\\n\tif [ -n \"$${CHECK}\" ]; then \\\n\t\techo \"ioutil is deprecated, use io or os replacements\"; \\\n\t\techo \"https://go.dev/doc/go1.16#ioutil\"; \\\n\t\techo \"$${CHECK}\"; \\\n\t\texit 1; \\\n\tfi\n\n.PHONY: doc-lint\n# Run linting checks for docs\ndoc-lint: tools\n\t$(VALE) --config=.vale/config.ini --glob='*.md' ./\n\t# mdlint rules with possible errors and fixes can be found here:\n\t# https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md\n\t# Additional configuration can be found in the .markdownlintrc file.\n\thack/check-mdlint.sh\n\n.PHONY: modules\n# Runs go mod tidy to ensure modules are up to date.\nmodules:\n\t@for i in $(GO_MODULES); do \\\n\t\techo \"-- Tidying $$i --\"; \\\n\t\tpushd $${i}; \\\n\t\t$(GO) mod tidy || exit 1; \\\n\t\tpopd; \\\n\tdone\n\n.PHONY: verify\n# Run all verification scripts\nverify: tools modules\n\t$(MAKE) smoke-build generate-go generate\n\t./hack/verify-dirty.sh\n\n.PHONY: smoke-build\n# Do a quick test that all directories can be built\nsmoke-build:\n\t@for i in $(GO_MODULES); do \\\n\t\techo \"-- Building $$i --\"; \\\n\t\tpushd $${i}; \\\n\t\t$(GO) build ./... || exit 1; \\\n\t\t$(GO) clean -i ./... || exit 1; \\\n\t\tpopd; \\\n\tdone\n\n\n##\n## Code scaffolding targets\n##\n\n.PHONY: manifests\n# Generate manifests e.g. CRD, RBAC etc.\nmanifests:\n\t$(MAKE) -C apis/config generate-manifests\n\t$(MAKE) -C apis/core generate-manifests\n\n.PHONY: generate-go\n# Generate code via go generate.\ngenerate-go: $(COUNTERFEITER)\n\t@for i in $(GO_MODULES); do \\\n\t\techo \"-- Running go generate ./... $$i --\"; \\\n\t\tpushd $${i}; \\\n\t\tPATH=$(abspath hack/tools/bin):\"$(PATH)\" go generate ./...; \\\n\t\tpopd; \\\n\tdone\n\n.PHONY: generate\n# Generate code (legacy)\ngenerate: tools generate-controller-code\n\n.PHONY: generate-fakes\n# Generate fakes for writing unit tests\ngenerate-fakes:\n\t$(GO) generate ./...\n\t$(MAKE) fmt\n\n.PHONY: clean-generated-conversions\n# Remove files generated by conversion-gen from the mentioned dirs. Example SRC_DIRS=\"./api/core/v1alpha1\"\nclean-generated-conversions:\n\t(IFS=','; for i in $(SRC_DIRS); do find $$i -type f -name 'zz_generated.conversion*' -exec rm -f {} \\;; done)\n\n.PHONY: generate-go-conversions\n# Generate conversions go code\ngenerate-go-conversions: $(CONVERSION_GEN)\n\t$(CONVERSION_GEN) \\\n\t\t-v 3 --logtostderr \\\n\t\t--input-dirs=\"./apis/core/v1alpha1,./apis/core/v1alpha2\" \\\n\t\t--build-tag=ignore_autogenerated_core \\\n\t\t--output-base ./ \\\n\t\t--output-file-base=zz_generated.conversion \\\n\t\t--go-header-file=./hack/boilerplate.go.txt\n\n.PHONY: generate-package-secret\n# Generate the default package values secret. Usage: make generate-package-secret PACKAGE=capabilities tkr=v1.23.3---vmware.1-tkg.1 iaas=vsphere\ngenerate-package-secret:\n\t@if [ -z \"$(PACKAGE)\" ]; then \\\n\t\techo \"PACKAGE argument required\"; \\\n\t\texit 1 ;\\\n\tfi\n\n\t@if [ $(PACKAGE) == 'capabilities' ]; then \\\n\t  ./capabilities/hack/generate-package-secret.sh -v tkr=${tkr} --data-value-yaml 'rbac.podSecurityPolicyNames=[${psp}]';\\\n\telse \\\n\t  echo \"invalid PACKAGE: $(PACKAGE)\" ;\\\n\t  exit 1 ;\\\n\tfi\n\n.PHONY: create-package\n# Stub out new package directories and manifests. Usage: make create-package PACKAGE_NAME=foobar\ncreate-package:\n\t@hack/packages/scripts/create-package.sh $(PACKAGE_NAME)\n"
  },
  {
    "path": "PROJECT",
    "content": "domain: tanzu.vmware.com\nmultigroup: true\nrepo: github.com/vmware-tanzu/tanzu-framework\nresources:\n- group: run\n  kind: TanzuKubernetesRelease\n  version: v1alpha1\n- group: config\n  kind: Feature\n  version: v1alpha1\n- group: run\n  kind: Capability\n  version: v1alpha1\n- group: config\n  kind: FeatureGate\n  version: v1alpha1\n- group: run\n  kind: ClusterBootstrap\n  version: v1alpha3\n- group: run\n  kind: ClusterBootstrapTemplate\n  version: v1alpha3\n- group: run\n  kind: KappControllerConfig\n  version: v1alpha3\n- group: run\n  kind: TanzuKubernetesRelease\n  version: v1alpha3\n- group: core\n  kind: Capability\n  version: v1alpha1\n- group: core\n  kind: Capability\n  version: v1alpha2\n- group: core\n  kind: FeatureGate\n  version: v1alpha2\n- group: core\n  kind: Feature\n  version: v1alpha2\n- group: core\n  kind: Readiness\n  version: v1alpha2\n- group: core\n  kind: ReadinessProvider\n  version: v1alpha2\nversion: \"2\"\n"
  },
  {
    "path": "README.md",
    "content": "# Tanzu Framework\n\n[![Go Reference](https://pkg.go.dev/badge/github.com/vmware-tanzu/tanzu-framework.svg)](https://pkg.go.dev/github.com/vmware-tanzu/tanzu-framework)\n\n## Overview\n\nTanzu Framework provides a set of building blocks to build on top of the [Tanzu](https://tanzu.vmware.com/tanzu)\nplatform.\n\nFramework provides APIs and Packages that enables Tanzu Kubernetes clusters to function in an enterprise-ready way.\n\nFramework leverages [Carvel](https://carvel.dev/) packaging and plugins to provide users with a much stronger, more\nintegrated experience than the loose coupling and stand-alone commands of the previous generation of tools.\n\n## Documentation\n\nThe [documentation](docs) provides information about the project, including user and developer guides.\n\n## Contributing\n\nThanks for taking the time to join our community and start contributing! We welcome pull requests. Feel free to dig\nthrough the [issues](https://github.com/vmware-tanzu/tanzu-framework/issues) and jump in.\n\n### Before you begin\n\n* Check out the [contribution guidelines](CONTRIBUTING.md) to learn more about how to contribute\n* Reference our [troubleshooting](docs/dev/troubleshooting.md) tips if you find yourself in need of more debug options.\n* Check out this support process document [here](docs/community/support-process.md) to learn more about the process.\n\n## Roadmap\n\nCheck out Framework's project [Roadmap](ROADMAP.md) and consider contributing!\n\n## Release Process\n\nCheck quick instructions [here](./docs/release/README.md)\n"
  },
  {
    "path": "ROADMAP.md",
    "content": "# Tanzu Framework Roadmap\n\n## About this document\n\nThis document provides an up to date description of items that are intended for future development. This should serve as a reference point for consumers of this repo and contributors alike to understand where the project is heading, and help determine if a contribution could be conflicting with a longer term plan.\n\n## How to help?\n\nDiscussion on the roadmap should take place in threads under Issues. Please comment on an issue if you want to provide suggestions and feedback to an item in the roadmap. Please review the roadmap to avoid potential duplicated efforts.\n\n### How to add an item to the roadmap?\n\nPlease open an issue to track any initiative on the roadmap of Framework. For smaller enhancements, you can just open an issue to track that initiative or feature request. We work with and rely on community feedback to focus our efforts to improve Framework and maintain a healthy roadmap.\n\n## Current Roadmap\n\nThe following table includes the current roadmap for Framework.\n\nIf you would like to contribute and don't know where to start, we are always looking for contributors that will help us reduce technical, automation, and documentation debt.\n\nPlease take the timelines & dates as proposals and goals. Priorities and requirements change based on community feedback, roadblocks encountered, etc.\n\nLast Updated: 7/8/21\n\n## Framework items\n\n|Issue|Description|\n|---|---|\n| TBD | TBD|\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Release Process\n\nFramework is both the foundation for Tanzu editions and a set of building blocks that can be used to extend Tanzu. Framework enables APIs, code, and documentation to be shared.\n\nThis model provides a few primary benefits.\n\nEnables re-use of existing work in Tanzu editions.\nImprovements to Framework benefit all editions.\nFosters cross-team collaboration.\nAllows extensions to Tanzu to be built following the same patterns as components of Tanzu.\n\nThe community has adopted this security disclosure and response policy to ensure we responsibly handle critical issues.\n\n## Supported Versions\n\nTanzu Framework is released weekly. Versions that are used in downstream Tanzu projects (such as Tanzu Community Edition) and products (such as Tanzu Kubernetes Grid) will be supported for the published lifecycle of those projects and products.\n\n## Reporting a Vulnerability - Private Disclosure Process\n\nSecurity is of the highest importance and all security vulnerabilities or suspected security vulnerabilities should be reported to Tanzu Framework privately, to minimize attacks against current users of Tanzu Framework before they are fixed. Vulnerabilities will be investigated and patched on the next patch (or minor) release as soon as possible. This information could be kept entirely internal to the project.\n\nIf you know of a publicly disclosed security vulnerability for Tanzu Framework, please **IMMEDIATELY** contact the VMware Security Team (security@vmware.com). The use of encrypted email is encouraged. The public PGP key can be found [here](https://kb.vmware.com/kb/1055). **IMPORTANT: Do not file public issues on GitHub for security vulnerabilities**\n\nTo report a vulnerability or a security-related issue, please contact the VMware email address with the details of the vulnerability. The email will be fielded by the VMware Security Team and then shared with the Tanzu Framework maintainers who have committer and release permissions. Emails will be addressed within 3 business days, including a detailed plan to investigate the issue and any potential workarounds to perform in the meantime. Do not report non-security-impacting bugs through this channel. Use [GitHub issues](https://github.com/vmware-tanzu/tanzu-framework/issues) instead.\n\n## Proposed Email Content\n\nProvide a descriptive subject line and in the body of the email include the following information:\n\n* Basic identity information, such as your name and your affiliation or company.\n* Detailed steps to reproduce the vulnerability  (POC scripts, screenshots, and logs are all helpful to us).\n* Description of the effects of the vulnerability on Tanzu Framework and the related hardware and software configurations, so that the VMware Security Team can reproduce it.\n* How the vulnerability affects Tanzu Framework usage and an estimation of the attack surface, if there is one.\n* List other projects or dependencies that were used in conjunction with Tanzu Framework to produce the vulnerability.\n\n## When to report a vulnerability\n\n* When you think Tanzu Framework has a potential security vulnerability.\n* When you suspect a potential vulnerability but you are unsure that it impacts Tanzu Framework.\n* When you know of or suspect a potential vulnerability on another project that is used by Tanzu Framework.\n\n## Patch, Release, and Disclosure\n\nThe VMware Security Team will respond to vulnerability reports as follows:\n\n1. The Security Team will investigate the vulnerability and determine its effects and criticality.\n2. If the issue is not deemed to be a vulnerability, the Security Team will follow up with a detailed reason for rejection.\n3. The Security Team will initiate a conversation with the reporter within 3 business days.\n4. If a vulnerability is acknowledged and the timeline for a fix is determined, the Security Team will work on a plan to communicate with the appropriate community, including identifying mitigating steps that affected users can take to protect themselves until the fix is rolled out.\n5. The Security Team will also create a [CVSS](https://www.first.org/cvss/specification-document) using the [CVSS Calculator](https://www.first.org/cvss/calculator/3.0). The Security Team makes the final call on the calculated CVSS; it is better to move quickly than making the CVSS perfect. Issues may also be reported to [Mitre](https://cve.mitre.org/) using this [scoring calculator](https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator). The CVE will initially be set to private.\n6. The Security Team will work on fixing the vulnerability and perform internal testing before preparing to roll out the fix.\n7. The Security Team will provide early disclosure of the vulnerability by emailing the [Tanzu Framework Distributors](tanzu-framework-distributors@googlegroups.com) mailing list. Distributors can initially plan for the vulnerability patch ahead of the fix, and later can test the fix and provide feedback to the Tanzu Framework team. See the section **Early Disclosure to Tanzu Framework Distributors List** for details about how to join this mailing list.\n8. A public disclosure date is negotiated by the VMware SecurityTeam, the bug submitter, and the distributors list. We prefer to fully disclose the bug as soon as possible once a user mitigation or patch is available. It is reasonable to delay disclosure when the bug or the fix is not yet fully understood, the solution is not well-tested, or for distributor coordination. The timeframe for disclosure is from immediate (especially if it’s already publicly known) to a few weeks. For a critical vulnerability with a straightforward mitigation, we expect the report date for the public disclosure date to be on the order of 14 business days. The VMware Security Team holds the final say when setting a public disclosure date.\n9. Once the fix is confirmed, the Security Team will patch the vulnerability in the next patch or minor release, and backport a patch release into all earlier supported releases. Upon release of the patched version of Tanzu Framework, we will follow the **Public Disclosure Process**.\n\n## Public Disclosure Process\n\nThe Security Team publishes a [public advisory](https://github.com/vmware-tanzu/tanzu-framework/security/advisories) to the Tanzu Framework community via GitHub. In most cases, additional communication via Slack, Twitter, mailing lists, blog and other channels will assist in educating Tanzu Framework users and rolling out the patched release to affected users.\n\nThe Security Team will also publish any mitigating steps users can take until the fix can be applied to their Tanzu Framework instances. Tanzu Framework distributors will handle creating and publishing their own security advisories.\n\n## Mailing lists\n\n* Use security@vmware.com to report security concerns to the VMware Security Team, who uses the list to privately discuss security issues and fixes prior to disclosure.\n* Join the [Tanzu Framework Distributors](tanzu-framework-distributors@googlegroups.com) mailing list for early private information and vulnerability disclosure. Early disclosure may include mitigating steps and additional information on security patch releases. See below for information on how Tanzu Framework distributors or vendors can apply to join this list.\n\n## Early Disclosure to Tanzu Framework Distributors List\n\nThe private list is intended to be used primarily to provide actionable information to multiple distributor projects at once. This list is not intended to inform individuals about security issues.\n\n## Membership Criteria\n\nTo be eligible to join the [Tanzu Framework Distributors](tanzu-framework-distributors@googlegroups.com) mailing list, you should:\n\n1. Be an active distributor of Tanzu Framework.\n2. Have a user base that is not limited to your own organization.\n3. Have a publicly verifiable track record up to the present day of fixing security issues.\n4. Not be a downstream or rebuild of another distributor.\n5. Be a participant and active contributor in the Tanzu Framework community.\n6. Accept the Embargo Policy that is outlined below.\n7. Have someone who is already on the list vouch for the person requesting membership on behalf of your distribution.\n\n**The terms and conditions of the Embargo Policy apply to all members of this mailing list. A request for membership represents your acceptance to the terms and conditions of the Embargo Policy.**\n\n## Embargo Policy\n\nThe information that members receive on the Tanzu Framework Distributors mailing list must not be made public, shared, or even hinted at anywhere beyond those who need to know within your specific team, unless you receive explicit approval to do so from the VMware Security Team. This remains true until the public disclosure date/time agreed upon by the list. Members of the list and others cannot use the information for any reason other than to get the issue fixed for your respective distribution's users.\n\nBefore you share any information from the list with members of your team who are required to fix the issue, these team members must agree to the same terms, and only be provided with information on a need-to-know basis.\n\nIn the unfortunate event that you share information beyond what is permitted by this policy, you must urgently inform the VMware Security Team (security@vmware.com) of exactly what information was leaked and to whom. If you continue to leak information and break the policy outlined here, you will be permanently removed from the list.\n\n## Requesting to Join\n\nSend new membership requests to tanzu-framework-distributors@googlegroups.com. In the body of your request please specify how you qualify for membership and fulfill each criterion listed in the Membership Criteria section above.\n\n## Confidentiality, integrity and availability\n\nWe consider vulnerabilities leading to the compromise of data confidentiality, elevation of privilege, or integrity to be our highest priority concerns. Availability, in particular in areas relating to DoS and resource exhaustion, is also a serious security concern. The VMware Security Team takes all vulnerabilities, potential vulnerabilities, and suspected vulnerabilities seriously and will investigate them in an urgent and expeditious manner.\n\nNote that we do not currently consider the default settings for Tanzu Framework to be secure-by-default. It is necessary for operators to explicitly configure settings, role based access control, and other resource related features in Tanzu Framework to provide a hardened Tanzu Framework environment. We will not act on any security disclosure that relates to a lack of safe defaults. Over time, we will work towards improved safe-by-default configuration, taking into account backwards compatibility.\n"
  },
  {
    "path": "apis/config/Makefile",
    "content": "# Copyright 2022 VMware, Inc. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\ninclude ../../common.mk\n"
  },
  {
    "path": "apis/config/config/crd/bases/config.tanzu.vmware.com_featuregates.yaml",
    "content": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.9.2\n  creationTimestamp: null\n  name: featuregates.config.tanzu.vmware.com\nspec:\n  group: config.tanzu.vmware.com\n  names:\n    kind: FeatureGate\n    listKind: FeatureGateList\n    plural: featuregates\n    singular: featuregate\n  scope: Cluster\n  versions:\n  - deprecated: true\n    deprecationWarning: FeatureGate API in config.tanzu.vmware.com is deprecated.\n      Use FeatureGate API from core.tanzu.vmware.com instead\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: FeatureGate is the Schema for the featuregates API\n        properties:\n          apiVersion:\n            description: 'APIVersion defines the versioned schema of this representation\n              of an object. Servers should convert recognized schemas to the latest\n              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'\n            type: string\n          kind:\n            description: 'Kind is a string value representing the REST resource this\n              object represents. Servers may infer this from the endpoint the client\n              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: Spec is the specification for gating features.\n            properties:\n              features:\n                description: Features is a slice of FeatureReference to gate features.\n                  The Feature resource specified may or may not be present in the\n                  system. If the Feature is present, the FeatureGate controller and\n                  webhook sets the specified activation state only if the Feature\n                  is discoverable and its immutability constraint is satisfied. If\n                  the Feature is not present, the activation intent is applied when\n                  the Feature resource appears in the system. The actual activation\n                  state of the Feature is reported in the status.\n                items:\n                  description: FeatureReference refers to a Feature resource and specifies\n                    its intended activation state.\n                  properties:\n                    activate:\n                      description: Activate indicates the activation intent for the\n                        feature.\n                      type: boolean\n                    name:\n                      description: Name is the name of the Feature resource, which\n                        represents a feature the system offers.\n                      type: string\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n              namespaceSelector:\n                description: NamespaceSelector is a selector to specify namespaces\n                  for which this feature gate applies. Use an empty LabelSelector\n                  to match all namespaces.\n                properties:\n                  matchExpressions:\n                    description: matchExpressions is a list of label selector requirements.\n                      The requirements are ANDed.\n                    items:\n                      description: A label selector requirement is a selector that\n                        contains values, a key, and an operator that relates the key\n                        and values.\n                      properties:\n                        key:\n                          description: key is the label key that the selector applies\n                            to.\n                          type: string\n                        operator:\n                          description: operator represents a key's relationship to\n                            a set of values. Valid operators are In, NotIn, Exists\n                            and DoesNotExist.\n                          type: string\n                        values:\n                          description: values is an array of string values. If the\n                            operator is In or NotIn, the values array must be non-empty.\n                            If the operator is Exists or DoesNotExist, the values\n                            array must be empty. This array is replaced during a strategic\n                            merge patch.\n                          items:\n                            type: string\n                          type: array\n                      required:\n                      - key\n                      - operator\n                      type: object\n                    type: array\n                  matchLabels:\n                    additionalProperties:\n                      type: string\n                    description: matchLabels is a map of {key,value} pairs. A single\n                      {key,value} in the matchLabels map is equivalent to an element\n                      of matchExpressions, whose key field is \"key\", the operator\n                      is \"In\", and the values array contains only \"value\". The requirements\n                      are ANDed.\n                    type: object\n                type: object\n                x-kubernetes-map-type: atomic\n            required:\n            - namespaceSelector\n            type: object\n          status:\n            description: Status reports activation state and availability of features\n              in the system.\n            properties:\n              activatedFeatures:\n                description: ActivatedFeatures lists the discovered features that\n                  are activated for the namespaces specified in the spec. This can\n                  include features that are not explicitly gated in the spec, but\n                  are already available in the system as Feature resources.\n                items:\n                  type: string\n                type: array\n              deactivatedFeatures:\n                description: DeactivatedFeatures lists the discovered features that\n                  are deactivated for the namespaces specified in the spec. This can\n                  include features that are not explicitly gated in the spec, but\n                  are already available in the system as Feature resources.\n                items:\n                  type: string\n                type: array\n              namespaces:\n                description: Namespaces lists the existing namespaces for which this\n                  feature gate applies. This is obtained from listing all namespaces\n                  and applying the NamespaceSelector specified in spec.\n                items:\n                  type: string\n                type: array\n              unavailableFeatures:\n                description: UnavailableFeatures lists the features that are gated\n                  in the spec, but are not available in the system as Feature resources.\n                items:\n                  type: string\n                type: array\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n"
  },
  {
    "path": "apis/config/config/crd/bases/config.tanzu.vmware.com_features.yaml",
    "content": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.9.2\n  creationTimestamp: null\n  name: features.config.tanzu.vmware.com\nspec:\n  group: config.tanzu.vmware.com\n  names:\n    kind: Feature\n    listKind: FeatureList\n    plural: features\n    singular: feature\n  scope: Cluster\n  versions:\n  - additionalPrinterColumns:\n    - jsonPath: .spec.activated\n      name: Activated\n      type: boolean\n    - jsonPath: .spec.description\n      name: Description\n      type: string\n    - jsonPath: .spec.immutable\n      name: Immutable\n      type: boolean\n    - jsonPath: .spec.maturity\n      name: Maturity\n      type: string\n    deprecated: true\n    deprecationWarning: Feature API in config.tanzu.vmware.com is deprecated. Use\n      Feature API from core.tanzu.vmware.com instead\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: Feature is the Schema for the features API\n        properties:\n          apiVersion:\n            description: 'APIVersion defines the versioned schema of this representation\n              of an object. Servers should convert recognized schemas to the latest\n              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'\n            type: string\n          kind:\n            description: 'Kind is a string value representing the REST resource this\n              object represents. Servers may infer this from the endpoint the client\n              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: FeatureSpec defines the desired state of Feature\n            properties:\n              activated:\n                description: Activated defines the default state of the features activation\n                type: boolean\n              description:\n                description: Description of the feature.\n                type: string\n              discoverable:\n                description: Discoverable indicates if clients should include consider\n                  the Feature available for their use Allowing clients to control\n                  discoverability is one of the ways the API allows gradual rollout\n                  of functionality\n                type: boolean\n              immutable:\n                description: Immutable indicates this feature cannot be toggled once\n                  set If set at creation time, this state will persist for the life\n                  of the cluster\n                type: boolean\n              maturity:\n                description: 'Maturity indicates maturity level of this feature. Maturity\n                  levels are Dev, Alpha, Beta, GA and Deprecated. - dev: the default\n                  for new resources, represents local dev. intended to be hidden and\n                  deactivated - alpha: the first milestone meant for limited wider\n                  consumption, discoverable and defaults to deactivated - beta: greater\n                  visibility for proven designs, discoverable and defaults to activated\n                  - ga: intended to be part of the mainline codebase, non-optional\n                  - deprecated: destined for future removal'\n                enum:\n                - dev\n                - alpha\n                - beta\n                - ga\n                - deprecated\n                type: string\n            required:\n            - activated\n            - discoverable\n            - immutable\n            - maturity\n            type: object\n          status:\n            description: FeatureStatus defines the observed state of Feature\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources: {}\n"
  },
  {
    "path": "apis/config/go.mod",
    "content": "module github.com/vmware-tanzu/tanzu-framework/apis/config\n\ngo 1.19\n\nrequire (\n\tgithub.com/google/go-cmp v0.5.8\n\tk8s.io/api v0.24.2\n\tk8s.io/apimachinery v0.24.2\n\tk8s.io/client-go v0.24.2\n\tsigs.k8s.io/controller-runtime v0.12.3\n)\n\nrequire (\n\tgithub.com/PuerkitoBio/purell v1.1.1 // indirect\n\tgithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.1.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.1 // indirect\n\tgithub.com/emicklei/go-restful/v3 v3.9.0 // indirect\n\tgithub.com/evanphx/json-patch v4.12.0+incompatible // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.1 // indirect\n\tgithub.com/go-logr/logr v1.2.0 // indirect\n\tgithub.com/go-openapi/jsonpointer v0.19.5 // indirect\n\tgithub.com/go-openapi/jsonreference v0.19.5 // indirect\n\tgithub.com/go-openapi/swag v0.19.14 // indirect\n\tgithub.com/gogo/protobuf v1.3.2 // indirect\n\tgithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/gnostic v0.5.7-v3refs // indirect\n\tgithub.com/google/gofuzz v1.1.0 // indirect\n\tgithub.com/google/uuid v1.1.2 // indirect\n\tgithub.com/imdario/mergo v0.3.12 // indirect\n\tgithub.com/josharian/intern v1.0.0 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/mailru/easyjson v0.7.6 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect\n\tgithub.com/pkg/errors v0.9.1 // indirect\n\tgithub.com/prometheus/client_golang v1.12.1 // indirect\n\tgithub.com/prometheus/client_model v0.2.0 // indirect\n\tgithub.com/prometheus/common v0.32.1 // indirect\n\tgithub.com/prometheus/procfs v0.7.3 // indirect\n\tgithub.com/spf13/pflag v1.0.5 // indirect\n\tgithub.com/stretchr/testify v1.8.0 // indirect\n\tgolang.org/x/net v0.8.0 // indirect\n\tgolang.org/x/oauth2 v0.3.0 // indirect\n\tgolang.org/x/sys v0.6.0 // indirect\n\tgolang.org/x/term v0.6.0 // indirect\n\tgolang.org/x/text v0.8.0 // indirect\n\tgolang.org/x/time v0.3.0 // indirect\n\tgomodules.xyz/jsonpatch/v2 v2.2.0 // indirect\n\tgoogle.golang.org/appengine v1.6.7 // indirect\n\tgoogle.golang.org/protobuf v1.28.0 // indirect\n\tgopkg.in/inf.v0 v0.9.1 // indirect\n\tgopkg.in/yaml.v2 v2.4.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tk8s.io/apiextensions-apiserver v0.24.2 // indirect\n\tk8s.io/component-base v0.24.2 // indirect\n\tk8s.io/klog/v2 v2.60.1 // indirect\n\tk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect\n\tk8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect\n\tsigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect\n\tsigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect\n\tsigs.k8s.io/yaml v1.3.0 // indirect\n)\n"
  },
  {
    "path": "apis/config/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=\ncloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=\ncloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=\ncloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=\ncloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngithub.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=\ngithub.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=\ngithub.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA=\ngithub.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M=\ngithub.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=\ngithub.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=\ngithub.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=\ngithub.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=\ngithub.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=\ngithub.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=\ngithub.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=\ngithub.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=\ngithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=\ngithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=\ngithub.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=\ngithub.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=\ngithub.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=\ngithub.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=\ngithub.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=\ngithub.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=\ngithub.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=\ngithub.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=\ngithub.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=\ngithub.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=\ngithub.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=\ngithub.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=\ngithub.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=\ngithub.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=\ngithub.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=\ngithub.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=\ngithub.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=\ngithub.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=\ngithub.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=\ngithub.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=\ngithub.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=\ngithub.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=\ngithub.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE=\ngithub.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ=\ngithub.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84=\ngithub.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=\ngithub.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=\ngithub.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=\ngithub.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=\ngithub.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=\ngithub.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI=\ngithub.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=\ngithub.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg=\ngithub.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=\ngithub.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=\ngithub.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=\ngithub.com/go-logr/logr v1.2.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE=\ngithub.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk=\ngithub.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro=\ngithub.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=\ngithub.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=\ngithub.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM=\ngithub.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg=\ngithub.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=\ngithub.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng=\ngithub.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=\ngithub.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=\ngithub.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w=\ngithub.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA=\ngithub.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=\ngithub.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=\ngithub.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=\ngithub.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=\ngithub.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=\ngithub.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=\ngithub.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=\ngithub.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=\ngithub.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=\ngithub.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=\ngithub.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=\ngithub.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=\ngithub.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=\ngithub.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=\ngithub.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=\ngithub.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=\ngithub.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=\ngithub.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=\ngithub.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=\ngithub.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=\ngithub.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=\ngithub.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=\ngithub.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=\ngithub.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=\ngithub.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=\ngithub.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=\ngithub.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=\ngithub.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=\ngithub.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=\ngithub.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=\ngithub.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=\ngithub.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=\ngithub.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=\ngithub.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=\ngithub.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=\ngithub.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=\ngithub.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=\ngithub.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY=\ngithub.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=\ngithub.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=\ngithub.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=\ngithub.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw=\ngithub.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=\ngithub.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=\ngithub.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=\ngithub.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=\ngithub.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=\ngithub.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=\ngithub.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0=\ngithub.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=\ngithub.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=\ngithub.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=\ngithub.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=\ngithub.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=\ngithub.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=\ngithub.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=\ngithub.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=\ngithub.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=\ngithub.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=\ngithub.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=\ngithub.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=\ngithub.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=\ngithub.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=\ngithub.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngo.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=\ngo.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=\ngo.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=\ngo.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=\ngo.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=\ngo.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=\ngo.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=\ngo.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0=\ngo.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q=\ngo.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE=\ngo.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc=\ngo.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=\ngo.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=\ngo.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=\ngo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E=\ngo.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=\ngo.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=\ngo.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM=\ngo.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=\ngo.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=\ngo.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=\ngo.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE=\ngo.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE=\ngo.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=\ngo.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=\ngo.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=\ngo.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=\ngo.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=\ngo.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=\ngo.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=\ngo.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=\ngo.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=\ngo.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=\ngo.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=\ngo.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=\ngo.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=\ngo.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=\ngolang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8=\ngolang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw=\ngolang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=\ngolang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=\ngolang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=\ngolang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY=\ngomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=\ngoogle.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=\ngoogle.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=\ngoogle.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=\ngoogle.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=\ngoogle.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=\ngoogle.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=\ngoogle.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=\ngoogle.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=\ngoogle.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=\ngoogle.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=\ngoogle.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\ngoogle.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\ngoogle.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=\ngopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=\ngopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=\ngopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=\ngopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=\ngopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=\ngopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=\ngotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nk8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI=\nk8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg=\nk8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k=\nk8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ=\nk8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM=\nk8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=\nk8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI=\nk8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA=\nk8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30=\nk8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w=\nk8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU=\nk8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM=\nk8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=\nk8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=\nk8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=\nk8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=\nk8s.io/klog/v2 v2.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc=\nk8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=\nk8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk=\nk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s=\nk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4=\nk8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=\nk8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc=\nk8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw=\nsigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio=\nsigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0=\nsigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y=\nsigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY=\nsigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=\nsigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=\nsigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=\nsigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=\n"
  },
  {
    "path": "apis/config/v1alpha1/feature_types.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage v1alpha1\n\nimport (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n)\n\n// FeatureSpec defines the desired state of Feature\ntype FeatureSpec struct {\n\t// Description of the feature.\n\tDescription string `json:\"description,omitempty\"`\n\t// Immutable indicates this feature cannot be toggled once set\n\t// If set at creation time, this state will persist for the life of the cluster\n\tImmutable bool `json:\"immutable\"`\n\t// Discoverable indicates if clients should include consider the Feature available for their use\n\t// Allowing clients to control discoverability is one of the ways the API allows gradual rollout of functionality\n\tDiscoverable bool `json:\"discoverable\"`\n\t// Activated defines the default state of the features activation\n\tActivated bool `json:\"activated\"`\n\t// Maturity indicates maturity level of this feature.\n\t// Maturity levels are Dev, Alpha, Beta, GA and Deprecated.\n\t// +kubebuilder:validation:Enum=dev;alpha;beta;ga;deprecated\n\t// - dev: the default for new resources, represents local dev. intended to be hidden and deactivated\n\t// - alpha: the first milestone meant for limited wider consumption, discoverable and defaults to deactivated\n\t// - beta: greater visibility for proven designs, discoverable and defaults to activated\n\t// - ga: intended to be part of the mainline codebase, non-optional\n\t// - deprecated: destined for future removal\n\tMaturity string `json:\"maturity\"`\n}\n\n// FeatureStatus defines the observed state of Feature\ntype FeatureStatus struct{}\n\n// Feature is the Schema for the features API\n// +kubebuilder:object:root=true\n// +kubebuilder:resource:scope=Cluster\n// +kubebuilder:printcolumn:name=\"Activated\",type=boolean,JSONPath=.spec.activated\n// +kubebuilder:printcolumn:name=\"Description\",type=string,JSONPath=.spec.description\n// +kubebuilder:printcolumn:name=\"Immutable\",type=boolean,JSONPath=.spec.immutable\n// +kubebuilder:printcolumn:name=\"Maturity\",type=string,JSONPath=.spec.maturity\n// +kubebuilder:deprecatedversion:warning=\"Feature API in config.tanzu.vmware.com is deprecated. Use Feature API from core.tanzu.vmware.com instead\"\ntype Feature struct {\n\tStatus            FeatureStatus `json:\"status,omitempty\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\tSpec              FeatureSpec `json:\"spec,omitempty\"`\n\tmetav1.TypeMeta   `json:\",inline\"`\n}\n\n// +kubebuilder:object:root=true\n\n// FeatureList contains a list of Feature\ntype FeatureList struct {\n\tmetav1.TypeMeta `json:\",inline\"`\n\tmetav1.ListMeta `json:\"metadata,omitempty\"`\n\tItems           []Feature `json:\"items\"`\n}\n\nfunc init() {\n\tSchemeBuilder.Register(&Feature{}, &FeatureList{})\n}\n"
  },
  {
    "path": "apis/config/v1alpha1/featuregate_types.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage v1alpha1\n\nimport (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n)\n\n// FeatureReference refers to a Feature resource and specifies its intended activation state.\ntype FeatureReference struct {\n\t// Name is the name of the Feature resource, which represents a feature the system offers.\n\t// +kubebuilder:validation:Required\n\tName string `json:\"name\"`\n\t// Activate indicates the activation intent for the feature.\n\tActivate bool `json:\"activate,omitempty\"`\n}\n\n// FeatureGateSpec defines the desired state of FeatureGate\ntype FeatureGateSpec struct {\n\t// NamespaceSelector is a selector to specify namespaces for which this feature gate applies.\n\t// Use an empty LabelSelector to match all namespaces.\n\tNamespaceSelector metav1.LabelSelector `json:\"namespaceSelector\"`\n\t// Features is a slice of FeatureReference to gate features.\n\t// The Feature resource specified may or may not be present in the system. If the Feature is present, the\n\t// FeatureGate controller and webhook sets the specified activation state only if the Feature is discoverable and\n\t// its immutability constraint is satisfied. If the Feature is not present, the activation intent is applied when\n\t// the Feature resource appears in the system. The actual activation state of the Feature is reported in the status.\n\t// +listType=map\n\t// +listMapKey=name\n\tFeatures []FeatureReference `json:\"features,omitempty\"`\n}\n\n// FeatureGateStatus defines the observed state of FeatureGate\ntype FeatureGateStatus struct {\n\t// Namespaces lists the existing namespaces for which this feature gate applies. This is obtained from listing all\n\t// namespaces and applying the NamespaceSelector specified in spec.\n\tNamespaces []string `json:\"namespaces,omitempty\"`\n\t// ActivatedFeatures lists the discovered features that are activated for the namespaces specified in the spec.\n\t// This can include features that are not explicitly gated in the spec, but are already available in the system as\n\t// Feature resources.\n\tActivatedFeatures []string `json:\"activatedFeatures,omitempty\"`\n\t// DeactivatedFeatures lists the discovered features that are deactivated for the namespaces specified in the spec.\n\t// This can include features that are not explicitly gated in the spec, but are already available in the system as\n\t// Feature resources.\n\tDeactivatedFeatures []string `json:\"deactivatedFeatures,omitempty\"`\n\t// UnavailableFeatures lists the features that are gated in the spec, but are not available in the system as\n\t// Feature resources.\n\tUnavailableFeatures []string `json:\"unavailableFeatures,omitempty\"`\n}\n\n//+kubebuilder:object:root=true\n//+kubebuilder:subresource:status\n//+kubebuilder:resource:scope=Cluster\n//+kubebuilder:deprecatedversion:warning=\"FeatureGate API in config.tanzu.vmware.com is deprecated. Use FeatureGate API from core.tanzu.vmware.com instead\"\n\n// FeatureGate is the Schema for the featuregates API\ntype FeatureGate struct {\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\n\t// Spec is the specification for gating features.\n\tSpec FeatureGateSpec `json:\"spec,omitempty\"`\n\t// Status reports activation state and availability of features in the system.\n\tStatus FeatureGateStatus `json:\"status,omitempty\"`\n}\n\n//+kubebuilder:object:root=true\n\n// FeatureGateList contains a list of FeatureGate\ntype FeatureGateList struct {\n\tmetav1.TypeMeta `json:\",inline\"`\n\tmetav1.ListMeta `json:\"metadata,omitempty\"`\n\tItems           []FeatureGate `json:\"items\"`\n}\n\nfunc init() {\n\tSchemeBuilder.Register(&FeatureGate{}, &FeatureGateList{})\n}\n"
  },
  {
    "path": "apis/config/v1alpha1/featuregate_webhook.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage v1alpha1\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"reflect\"\n\n\tcorev1 \"k8s.io/api/core/v1\"\n\tapierrors \"k8s.io/apimachinery/pkg/api/errors\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"k8s.io/apimachinery/pkg/util/sets\"\n\t\"k8s.io/apimachinery/pkg/util/validation/field\"\n\tk8sscheme \"k8s.io/client-go/kubernetes/scheme\"\n\tctrl \"sigs.k8s.io/controller-runtime\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client/config\"\n\tlogf \"sigs.k8s.io/controller-runtime/pkg/log\"\n\t\"sigs.k8s.io/controller-runtime/pkg/webhook\"\n)\n\n// log is for logging in this package.\nvar featuregatelog = logf.Log.WithName(\"featuregate-resource\").WithValues(\"apigroup\", \"config\")\n\nvar cl client.Client\n\nfunc getScheme() (*runtime.Scheme, error) {\n\ts, err := SchemeBuilder.Build()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif err := k8sscheme.AddToScheme(s); err != nil {\n\t\treturn nil, err\n\t}\n\treturn s, nil\n}\n\n// Get a cached client if it has been initiated.\nfunc (r *FeatureGate) getClient() (client.Client, error) {\n\tif cl != nil && !reflect.ValueOf(cl).IsNil() {\n\t\treturn cl, nil\n\t}\n\n\ts, err := getScheme()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tcfg, err := config.GetConfig()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn client.New(cfg, client.Options{Scheme: s})\n}\n\n// SetupWebhookWithManager adds the webhook to the manager.\nfunc (r *FeatureGate) SetupWebhookWithManager(mgr ctrl.Manager) error {\n\treturn ctrl.NewWebhookManagedBy(mgr).\n\t\tFor(r).\n\t\tComplete()\n}\n\n//+kubebuilder:webhook:verbs=create;update,path=/validate-config-tanzu-vmware-com-v1alpha1-featuregate,mutating=false,failurePolicy=fail,groups=config.tanzu.vmware.com,resources=featuregates,versions=v1alpha1,name=vfeaturegate.kb.io\n\nvar _ webhook.Validator = &FeatureGate{}\n\n// ValidateCreate implements webhook.Validator so a webhook will be registered for the type\nfunc (r *FeatureGate) ValidateCreate() error {\n\tfeaturegatelog.Info(\"validate create\", \"name\", r.Name)\n\tc, err := r.getClient()\n\tif err != nil {\n\t\treturn apierrors.NewInternalError(err)\n\t}\n\n\tctx := context.Background()\n\tvar allErrors field.ErrorList\n\n\tallErrors = append(allErrors, r.validateNamespaceConflicts(ctx, c, field.NewPath(\"spec\"))...)\n\n\tif len(allErrors) == 0 {\n\t\treturn nil\n\t}\n\treturn apierrors.NewInvalid(GroupVersion.WithKind(\"FeatureGate\").GroupKind(), r.Name, allErrors)\n}\n\n// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type\nfunc (r *FeatureGate) ValidateUpdate(old runtime.Object) error {\n\tfeaturegatelog.Info(\"validate update\", \"name\", r.Name)\n\n\toldObj, ok := old.(*FeatureGate)\n\tif !ok {\n\t\treturn apierrors.NewBadRequest(fmt.Sprintf(\"expected FeatureGate object, but got object of type %T\", old))\n\t}\n\tif oldObj == nil {\n\t\treturn nil\n\t}\n\n\tc, err := r.getClient()\n\tif err != nil {\n\t\treturn apierrors.NewInternalError(err)\n\t}\n\n\tctx := context.Background()\n\tvar allErrors field.ErrorList\n\n\tallErrors = append(allErrors, r.validateNamespaceConflicts(ctx, c, field.NewPath(\"spec\"))...)\n\tallErrors = append(allErrors, r.validateFeatureImmutability(ctx, c, oldObj, field.NewPath(\"spec\").Child(\"features\"))...)\n\n\tif len(allErrors) == 0 {\n\t\treturn nil\n\t}\n\treturn apierrors.NewInvalid(GroupVersion.WithKind(\"FeatureGate\").GroupKind(), r.Name, allErrors)\n}\n\n// validateNamespaceConflicts validates that the namespaceSelector in spec does not conflict with namespaces gated by existing feature gates.\nfunc (r *FeatureGate) validateNamespaceConflicts(ctx context.Context, c client.Client, fldPath *field.Path) field.ErrorList {\n\tvar allErrors field.ErrorList\n\n\tconflicts, err := r.computeConflictingNamespaces(ctx, c)\n\tif err != nil {\n\t\tallErrors = append(allErrors, field.InternalError(fldPath.Child(\"namespaceSelector\"), err))\n\t\treturn allErrors\n\t}\n\n\tfor fg, namespaces := range conflicts {\n\t\tif len(namespaces) == 0 {\n\t\t\tcontinue\n\t\t}\n\t\tallErrors = append(allErrors, field.Invalid(fldPath.Child(\"namespaceSelector\"), r.Spec.NamespaceSelector,\n\t\t\tfmt.Sprintf(\"namespaces %v specified by namespaceSelector are already gated by FeatureGate %q\", namespaces, fg)))\n\t}\n\treturn allErrors\n}\n\n// computeConflictingNamespaces computes the namespaces that conflict with existing feature gates.\n// This is a separate function for easier unit testing.\nfunc (r *FeatureGate) computeConflictingNamespaces(ctx context.Context, c client.Client) (map[string][]string, error) {\n\tfeatureGates := &FeatureGateList{}\n\tif err := c.List(ctx, featureGates); err != nil {\n\t\treturn nil, err\n\t}\n\n\tnamespacesInSpec, err := namespacesMatchingSelector(ctx, c, &r.Spec.NamespaceSelector)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tfeatureGateToNamespaces := make(map[string]sets.String)\n\tfor i := range featureGates.Items {\n\t\tfg := featureGates.Items[i]\n\t\t// Skip comparing the object to itself during updates.\n\t\tif fg.Name == r.Name {\n\t\t\tcontinue\n\t\t}\n\t\tfeatureGateToNamespaces[fg.Name] = sets.NewString(fg.Status.Namespaces...)\n\t}\n\n\t// Output is a map of an existing feature gate resource name and the list of namespaces that conflict with the current spec.\n\tout := make(map[string][]string)\n\tset := sets.NewString(namespacesInSpec...)\n\tfor fg, namespaces := range featureGateToNamespaces {\n\t\tintersection := namespaces.Intersection(set).List()\n\t\tif len(intersection) != 0 {\n\t\t\tout[fg] = intersection\n\t\t}\n\t}\n\treturn out, nil\n}\n\n// validateFeatureImmutability validates that immutable features are not changed.\nfunc (r *FeatureGate) validateFeatureImmutability(ctx context.Context, c client.Client, oldObject *FeatureGate, fldPath *field.Path) field.ErrorList {\n\tvar allErrors field.ErrorList\n\n\tfeatures := &FeatureList{}\n\tif err := c.List(ctx, features); err != nil {\n\t\tallErrors = append(allErrors, field.InternalError(fldPath, err))\n\t\treturn allErrors\n\t}\n\n\tinvalid := computeChangedImmutableFeatures(r.Spec, features.Items, oldObject)\n\tif len(invalid) != 0 {\n\t\tallErrors = append(allErrors, field.Invalid(fldPath, r.Spec.Features, fmt.Sprintf(\"cannot change immutable features: %v\", invalid)))\n\t}\n\treturn allErrors\n}\n\n// computeChangedImmutableFeatures returns immutable features which are changed in the current spec.\n// This is a separate function for easier unit testing.\nfunc computeChangedImmutableFeatures(spec FeatureGateSpec, currentFeatures []Feature, oldObject *FeatureGate) []string {\n\timmutable := sets.String{}\n\tfor i := range currentFeatures {\n\t\tf := currentFeatures[i]\n\t\tif f.Spec.Discoverable && f.Spec.Immutable {\n\t\t\timmutable.Insert(f.Name)\n\t\t}\n\t}\n\n\toldActivated := sets.NewString(oldObject.Status.ActivatedFeatures...)\n\toldDeactivated := sets.NewString(oldObject.Status.DeactivatedFeatures...)\n\n\tchangedFeatures := sets.String{}\n\tfor _, featureRef := range spec.Features {\n\t\tname := featureRef.Name\n\t\tif !immutable.Has(name) {\n\t\t\tcontinue\n\t\t}\n\t\t// Features that changed states from activated to deactivated or vice versa in the current update.\n\t\tif (featureRef.Activate && oldDeactivated.Has(name)) || !featureRef.Activate && oldActivated.Has(name) {\n\t\t\tchangedFeatures.Insert(name)\n\t\t}\n\t}\n\treturn immutable.Intersection(changedFeatures).List()\n}\n\n// ValidateDelete implements webhook.Validator so a webhook will be registered for the type\nfunc (r *FeatureGate) ValidateDelete() error {\n\tfeaturegatelog.Info(\"validate delete\", \"name\", r.Name)\n\treturn nil\n}\n\n// namespacesMatchingSelector returns the list of namespaces after applying the NamespaceSelector filter.\n// Note that a nil selector selects nothing, while an empty selector selects everything.\n// Callers using this function in feature gates context should be sending a pointer to an empty selector instead of nil.\nfunc namespacesMatchingSelector(ctx context.Context, c client.Client, selector *metav1.LabelSelector) ([]string, error) {\n\ts, err := metav1.LabelSelectorAsSelector(selector)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to get namespaces from NamespaceSelector: %w\", err)\n\t}\n\n\tnsList := &corev1.NamespaceList{}\n\terr = c.List(ctx, nsList, client.MatchingLabelsSelector{Selector: s})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to get namespaces from NamespaceSelector: %w\", err)\n\t}\n\n\tvar namespaces []string\n\tfor i := range nsList.Items {\n\t\tnamespaces = append(namespaces, nsList.Items[i].Name)\n\t}\n\treturn namespaces, nil\n}\n"
  },
  {
    "path": "apis/config/v1alpha1/featuregate_webhook_test.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage v1alpha1\n\nimport (\n\t\"context\"\n\t\"sort\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\tcorev1 \"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client/fake\"\n)\n\nfunc TestValidateFeatureImmutability(t *testing.T) {\n\ttestCases := []struct {\n\t\tdescription     string\n\t\tcurrentFeatures []Feature\n\t\tfeatureGateSpec FeatureGateSpec\n\t\toldObj          *FeatureGate\n\t\twant            []string\n\t}{\n\t\t{\n\t\t\tdescription: \"Multiple immutable features changed\",\n\t\t\tcurrentFeatures: []Feature{\n\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"one\"}, Spec: FeatureSpec{Activated: true, Discoverable: true, Immutable: true}},\n\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"two\"}, Spec: FeatureSpec{Activated: true, Discoverable: true, Immutable: true}},\n\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"three\"}, Spec: FeatureSpec{Activated: false, Discoverable: true, Immutable: false}},\n\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"four\"}, Spec: FeatureSpec{Activated: false, Discoverable: true, Immutable: false}},\n\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"five\"}, Spec: FeatureSpec{Activated: false, Discoverable: true, Immutable: false}},\n\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"eleven\"}, Spec: FeatureSpec{Activated: true, Discoverable: true, Immutable: true}},\n\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"twelve\"}, Spec: FeatureSpec{Activated: false, Discoverable: true, Immutable: true}},\n\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"thirteen\"}, Spec: FeatureSpec{Activated: false, Discoverable: true, Immutable: false}},\n\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"hundred\"}, Spec: FeatureSpec{Activated: false, Discoverable: false, Immutable: true}},\n\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"thousand\"}, Spec: FeatureSpec{Activated: false, Discoverable: false, Immutable: false}},\n\t\t\t},\n\t\t\tfeatureGateSpec: FeatureGateSpec{\n\t\t\t\tFeatures: []FeatureReference{\n\t\t\t\t\t// Immutable, previously activated, now deactivated (disallowed).\n\t\t\t\t\t{Name: \"one\", Activate: false},\n\t\t\t\t\t// Immutable, previously deactivated, now activated (disallowed).\n\t\t\t\t\t{Name: \"two\", Activate: true},\n\t\t\t\t\t// Non-immutable, previously activated, no state change (allowed).\n\t\t\t\t\t{Name: \"three\", Activate: true},\n\t\t\t\t\t// Non-immutable, previously deactivated, no state change (allowed).\n\t\t\t\t\t{Name: \"four\", Activate: false},\n\t\t\t\t\t// Unavailable feature, no state change (allowed).\n\t\t\t\t\t{Name: \"six\", Activate: true},\n\t\t\t\t\t// Unavailable feature, state changed (allowed).\n\t\t\t\t\t{Name: \"seven\", Activate: false},\n\t\t\t\t\t// Unavailable feature, no state change (allowed).\n\t\t\t\t\t{Name: \"eight\", Activate: false},\n\t\t\t\t\t// Unavailable feature, no state change (allowed).\n\t\t\t\t\t{Name: \"nine\", Activate: true},\n\t\t\t\t\t// Unavailable feature, no state change (allowed).\n\t\t\t\t\t{Name: \"ten\", Activate: true},\n\t\t\t\t\t// Immutable, previously activated, now deactivated (disallowed).\n\t\t\t\t\t{Name: \"eleven\", Activate: false},\n\t\t\t\t\t// Immutable, previously deactivated, no state change (allowed).\n\t\t\t\t\t// Not explicitly specified in spec.\n\t\t\t\t\t// {Name: \"twelve\", Activate: false},\n\t\t\t\t\t// Immutable, non-discoverable, no state change (allowed).\n\t\t\t\t\t// Not explicitly specified in spec.\n\t\t\t\t\t// {Name: \"hundred\", Activate: false},\n\t\t\t\t},\n\t\t\t},\n\t\t\toldObj: &FeatureGate{Status: FeatureGateStatus{\n\t\t\t\tActivatedFeatures:   []string{\"one\", \"three\", \"eleven\"},\n\t\t\t\tDeactivatedFeatures: []string{\"two\", \"four\", \"five\", \"twelve\", \"thirteen\"},\n\t\t\t}},\n\t\t\twant: []string{\"one\", \"two\", \"eleven\"},\n\t\t},\n\t}\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tgot := computeChangedImmutableFeatures(tc.featureGateSpec, tc.currentFeatures, tc.oldObj)\n\t\t\tif diff := sliceDiffIgnoreOrder(got, tc.want); diff != \"\" {\n\t\t\t\tt.Errorf(\"got immutable features %v, want %v, diff: %s\", got, tc.want, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNamespaceConflicts(t *testing.T) {\n\tscheme, err := getScheme()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tnewNamespace := func(name string) *corev1.Namespace {\n\t\treturn &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: name, Labels: map[string]string{\"kubernetes.io/metadata.name\": name}}}\n\t}\n\n\tcompareConflicts := func(got, want map[string][]string) string {\n\t\tfor k := range got {\n\t\t\tsort.Strings(got[k])\n\t\t}\n\t\tfor k := range want {\n\t\t\tsort.Strings(want[k])\n\t\t}\n\t\treturn cmp.Diff(got, want, cmpopts.SortMaps(func(x, y string) bool { return x < y }), cmpopts.EquateEmpty())\n\t}\n\n\ttestCases := []struct {\n\t\tdescription          string\n\t\texistingNamespaces   []runtime.Object\n\t\texistingFeatureGates []runtime.Object\n\t\tcreateObj            *FeatureGate\n\t\twant                 map[string][]string\n\t\terr                  string\n\t}{\n\t\t{\n\t\t\tdescription: \"Has single conflicting namespace\",\n\t\t\texistingNamespaces: []runtime.Object{\n\t\t\t\tnewNamespace(\"default\"),\n\t\t\t\tnewNamespace(\"kube-system\"),\n\t\t\t\tnewNamespace(\"kube-public\"),\n\t\t\t\tnewNamespace(\"tkg-system\"),\n\t\t\t},\n\t\t\texistingFeatureGates: []runtime.Object{\n\t\t\t\t&FeatureGate{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName: \"system-feature-gates\",\n\t\t\t\t\t},\n\t\t\t\t\tStatus: FeatureGateStatus{\n\t\t\t\t\t\tNamespaces: []string{\"tkg-system\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tcreateObj: &FeatureGate{\n\t\t\t\tObjectMeta: metav1.ObjectMeta{Name: \"foo\"},\n\t\t\t\tSpec: FeatureGateSpec{\n\t\t\t\t\tNamespaceSelector: metav1.LabelSelector{\n\t\t\t\t\t\tMatchExpressions: []metav1.LabelSelectorRequirement{\n\t\t\t\t\t\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpIn, Values: []string{\"bar\", \"baz\", \"default\", \"tkg-system\"}},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: map[string][]string{\"system-feature-gates\": {\"tkg-system\"}},\n\t\t\terr:  \"\",\n\t\t},\n\t\t{\n\t\t\tdescription: \"Multiple conflicting namespaces\",\n\t\t\texistingNamespaces: []runtime.Object{\n\t\t\t\tnewNamespace(\"default\"),\n\t\t\t\tnewNamespace(\"kube-system\"),\n\t\t\t\tnewNamespace(\"kube-public\"),\n\t\t\t\tnewNamespace(\"tkg-system\"),\n\t\t\t},\n\t\t\texistingFeatureGates: []runtime.Object{\n\t\t\t\t&FeatureGate{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName: \"system-feature-gates\",\n\t\t\t\t\t},\n\t\t\t\t\tStatus: FeatureGateStatus{\n\t\t\t\t\t\tNamespaces: []string{\"default\", \"kube-system\", \"tkg-system\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tcreateObj: &FeatureGate{\n\t\t\t\tObjectMeta: metav1.ObjectMeta{Name: \"foo\"},\n\t\t\t\tSpec: FeatureGateSpec{\n\t\t\t\t\tNamespaceSelector: metav1.LabelSelector{\n\t\t\t\t\t\tMatchExpressions: []metav1.LabelSelectorRequirement{\n\t\t\t\t\t\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpIn, Values: []string{\"bar\", \"baz\", \"default\", \"tkg-system\"}},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: map[string][]string{\"system-feature-gates\": {\"tkg-system\", \"default\"}},\n\t\t\terr:  \"\",\n\t\t},\n\t\t{\n\t\t\tdescription: \"Conflicting namespaces across multiple CRs\",\n\t\t\texistingNamespaces: []runtime.Object{\n\t\t\t\tnewNamespace(\"default\"),\n\t\t\t\tnewNamespace(\"kube-system\"),\n\t\t\t\tnewNamespace(\"kube-public\"),\n\t\t\t\tnewNamespace(\"tkg-system\"),\n\t\t\t\tnewNamespace(\"foo\"),\n\t\t\t\tnewNamespace(\"bar\"),\n\t\t\t\tnewNamespace(\"baz\"),\n\t\t\t},\n\t\t\texistingFeatureGates: []runtime.Object{\n\t\t\t\t&FeatureGate{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName: \"system-feature-gates\",\n\t\t\t\t\t},\n\t\t\t\t\tStatus: FeatureGateStatus{\n\t\t\t\t\t\tNamespaces: []string{\"default\", \"kube-system\", \"tkg-system\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t&FeatureGate{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName: \"experimental-feature-gates\",\n\t\t\t\t\t},\n\t\t\t\t\tStatus: FeatureGateStatus{\n\t\t\t\t\t\tNamespaces: []string{\"foo\", \"bar\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tcreateObj: &FeatureGate{\n\t\t\t\tObjectMeta: metav1.ObjectMeta{Name: \"foo\"},\n\t\t\t\tSpec: FeatureGateSpec{\n\t\t\t\t\tNamespaceSelector: metav1.LabelSelector{\n\t\t\t\t\t\tMatchExpressions: []metav1.LabelSelectorRequirement{\n\t\t\t\t\t\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpIn, Values: []string{\"foo\", \"bar\", \"baz\", \"default\", \"tkg-system\", \"kube-public\"}},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: map[string][]string{\"system-feature-gates\": {\"tkg-system\", \"default\"}, \"experimental-feature-gates\": {\"bar\", \"foo\"}},\n\t\t\terr:  \"\",\n\t\t},\n\t\t{\n\t\t\tdescription: \"No conflicting namespaces\",\n\t\t\texistingNamespaces: []runtime.Object{\n\t\t\t\tnewNamespace(\"default\"),\n\t\t\t\tnewNamespace(\"kube-system\"),\n\t\t\t\tnewNamespace(\"kube-public\"),\n\t\t\t\tnewNamespace(\"tkg-system\"),\n\t\t\t\tnewNamespace(\"foo\"),\n\t\t\t\tnewNamespace(\"bar\"),\n\t\t\t\tnewNamespace(\"baz\"),\n\t\t\t},\n\t\t\texistingFeatureGates: []runtime.Object{\n\t\t\t\t&FeatureGate{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName: \"system-feature-gates\",\n\t\t\t\t\t},\n\t\t\t\t\tStatus: FeatureGateStatus{\n\t\t\t\t\t\tNamespaces: []string{\"default\", \"kube-system\", \"tkg-system\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t&FeatureGate{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName: \"experimental-feature-gates\",\n\t\t\t\t\t},\n\t\t\t\t\tStatus: FeatureGateStatus{\n\t\t\t\t\t\tNamespaces: []string{\"foo\", \"bar\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tcreateObj: &FeatureGate{\n\t\t\t\tObjectMeta: metav1.ObjectMeta{Name: \"foo\"},\n\t\t\t\tSpec: FeatureGateSpec{\n\t\t\t\t\tNamespaceSelector: metav1.LabelSelector{\n\t\t\t\t\t\t// Bad label selector borrowed from kubernetes/apimachinery/pkg/apis/meta/v1/helpers_test.go\n\t\t\t\t\t\tMatchExpressions: []metav1.LabelSelectorRequirement{\n\t\t\t\t\t\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpIn, Values: []string{\"baz\", \"kube-public\"}},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: map[string][]string{},\n\t\t\terr:  \"\",\n\t\t},\n\t\t{\n\t\t\tdescription: \"Error occurred due to bad namespace selector in spec\",\n\t\t\texistingNamespaces: []runtime.Object{\n\t\t\t\tnewNamespace(\"default\"),\n\t\t\t\tnewNamespace(\"kube-system\"),\n\t\t\t\tnewNamespace(\"kube-public\"),\n\t\t\t\tnewNamespace(\"tkg-system\"),\n\t\t\t\tnewNamespace(\"foo\"),\n\t\t\t\tnewNamespace(\"bar\"),\n\t\t\t\tnewNamespace(\"baz\"),\n\t\t\t},\n\t\t\texistingFeatureGates: []runtime.Object{\n\t\t\t\t&FeatureGate{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName: \"system-feature-gates\",\n\t\t\t\t\t},\n\t\t\t\t\tStatus: FeatureGateStatus{\n\t\t\t\t\t\tNamespaces: []string{\"default\", \"kube-system\", \"tkg-system\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t&FeatureGate{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName: \"experimental-feature-gates\",\n\t\t\t\t\t},\n\t\t\t\t\tStatus: FeatureGateStatus{\n\t\t\t\t\t\tNamespaces: []string{\"foo\", \"bar\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tcreateObj: &FeatureGate{\n\t\t\t\tObjectMeta: metav1.ObjectMeta{Name: \"foo\"},\n\t\t\t\tSpec: FeatureGateSpec{\n\t\t\t\t\tNamespaceSelector: metav1.LabelSelector{\n\t\t\t\t\t\tMatchExpressions: []metav1.LabelSelectorRequirement{\n\t\t\t\t\t\t\t// Bad selector - Exists operator must have empty values.\n\t\t\t\t\t\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpExists, Values: []string{\"qux\", \"norf\"}},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: map[string][]string{},\n\t\t\terr:  \"failed to get namespaces from NamespaceSelector\",\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tvar objs []runtime.Object\n\t\t\tobjs = append(objs, tc.existingNamespaces...)\n\t\t\tobjs = append(objs, tc.existingFeatureGates...)\n\t\t\tfakeClient := fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(objs...).Build()\n\t\t\tgot, err := tc.createObj.computeConflictingNamespaces(context.Background(), fakeClient)\n\t\t\tif err != nil {\n\t\t\t\tif tc.err == \"\" {\n\t\t\t\t\tt.Errorf(\"no error string specified, but got error: %v\", err)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(err.Error(), tc.err) {\n\t\t\t\t\tt.Errorf(\"error string=%q doesn't match partial=%q\", tc.err, err)\n\t\t\t\t}\n\t\t\t} else if tc.err != \"\" {\n\t\t\t\tt.Errorf(\"error string=%q specified but error not found\", tc.err)\n\t\t\t}\n\t\t\tif diff := compareConflicts(got, tc.want); diff != \"\" {\n\t\t\t\tt.Errorf(\"got conflicts %v, want %v, diff: %s\", got, tc.want, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\n// sliceDiffIgnoreOrder returns a human-readable diff of two string slices.\n// Two slices are considered equal when they have the same length and same elements. The order of the elements is\n// ignored while comparing. Nil and empty slices are considered equal.\n//\n// This function is intended to be used in tests for comparing expected and actual values, and printing the diff for\n// users to debug:\n//\n//\tif diff := sliceDiffIgnoreOrder(got, want); diff != \"\" {\n//\t    t.Errorf(\"got: %v, want: %v, diff: %s\", got, want, diff)\n//\t}\nfunc sliceDiffIgnoreOrder(a, b []string) string {\n\treturn cmp.Diff(a, b, cmpopts.EquateEmpty(), cmpopts.SortSlices(func(x, y string) bool { return x < y }))\n}\n"
  },
  {
    "path": "apis/config/v1alpha1/groupversion_info.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package v1alpha1 contains API Schema definitions for the client v1alpha1 API group\n// +kubebuilder:object:generate=true\n// +groupName=config.tanzu.vmware.com\npackage v1alpha1\n\nimport (\n\t\"k8s.io/apimachinery/pkg/runtime/schema\"\n\t\"sigs.k8s.io/controller-runtime/pkg/scheme\"\n)\n\nvar (\n\t// GroupVersion is group version used to register these objects\n\tGroupVersion = schema.GroupVersion{Group: \"config.tanzu.vmware.com\", Version: \"v1alpha1\"}\n\n\t// SchemeBuilder is used to add go types to the GroupVersionKind scheme\n\tSchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion}\n\n\t// AddToScheme adds the types in this group-version to the given scheme.\n\tAddToScheme = SchemeBuilder.AddToScheme\n)\n"
  },
  {
    "path": "apis/config/v1alpha1/zz_generated.deepcopy.go",
    "content": "//go:build !ignore_autogenerated\n// +build !ignore_autogenerated\n\n// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Code generated by controller-gen. DO NOT EDIT.\n\npackage v1alpha1\n\nimport (\n\t\"k8s.io/apimachinery/pkg/runtime\"\n)\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Feature) DeepCopyInto(out *Feature) {\n\t*out = *in\n\tout.Status = in.Status\n\tin.ObjectMeta.DeepCopyInto(&out.ObjectMeta)\n\tout.Spec = in.Spec\n\tout.TypeMeta = in.TypeMeta\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Feature.\nfunc (in *Feature) DeepCopy() *Feature {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Feature)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *Feature) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *FeatureGate) DeepCopyInto(out *FeatureGate) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ObjectMeta.DeepCopyInto(&out.ObjectMeta)\n\tin.Spec.DeepCopyInto(&out.Spec)\n\tin.Status.DeepCopyInto(&out.Status)\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGate.\nfunc (in *FeatureGate) DeepCopy() *FeatureGate {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(FeatureGate)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *FeatureGate) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *FeatureGateList) DeepCopyInto(out *FeatureGateList) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ListMeta.DeepCopyInto(&out.ListMeta)\n\tif in.Items != nil {\n\t\tin, out := &in.Items, &out.Items\n\t\t*out = make([]FeatureGate, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGateList.\nfunc (in *FeatureGateList) DeepCopy() *FeatureGateList {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(FeatureGateList)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *FeatureGateList) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *FeatureGateSpec) DeepCopyInto(out *FeatureGateSpec) {\n\t*out = *in\n\tin.NamespaceSelector.DeepCopyInto(&out.NamespaceSelector)\n\tif in.Features != nil {\n\t\tin, out := &in.Features, &out.Features\n\t\t*out = make([]FeatureReference, len(*in))\n\t\tcopy(*out, *in)\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGateSpec.\nfunc (in *FeatureGateSpec) DeepCopy() *FeatureGateSpec {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(FeatureGateSpec)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *FeatureGateStatus) DeepCopyInto(out *FeatureGateStatus) {\n\t*out = *in\n\tif in.Namespaces != nil {\n\t\tin, out := &in.Namespaces, &out.Namespaces\n\t\t*out = make([]string, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\tif in.ActivatedFeatures != nil {\n\t\tin, out := &in.ActivatedFeatures, &out.ActivatedFeatures\n\t\t*out = make([]string, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\tif in.DeactivatedFeatures != nil {\n\t\tin, out := &in.DeactivatedFeatures, &out.DeactivatedFeatures\n\t\t*out = make([]string, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\tif in.UnavailableFeatures != nil {\n\t\tin, out := &in.UnavailableFeatures, &out.UnavailableFeatures\n\t\t*out = make([]string, len(*in))\n\t\tcopy(*out, *in)\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGateStatus.\nfunc (in *FeatureGateStatus) DeepCopy() *FeatureGateStatus {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(FeatureGateStatus)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *FeatureList) DeepCopyInto(out *FeatureList) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ListMeta.DeepCopyInto(&out.ListMeta)\n\tif in.Items != nil {\n\t\tin, out := &in.Items, &out.Items\n\t\t*out = make([]Feature, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureList.\nfunc (in *FeatureList) DeepCopy() *FeatureList {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(FeatureList)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *FeatureList) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *FeatureReference) DeepCopyInto(out *FeatureReference) {\n\t*out = *in\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureReference.\nfunc (in *FeatureReference) DeepCopy() *FeatureReference {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(FeatureReference)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *FeatureSpec) DeepCopyInto(out *FeatureSpec) {\n\t*out = *in\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureSpec.\nfunc (in *FeatureSpec) DeepCopy() *FeatureSpec {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(FeatureSpec)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *FeatureStatus) DeepCopyInto(out *FeatureStatus) {\n\t*out = *in\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureStatus.\nfunc (in *FeatureStatus) DeepCopy() *FeatureStatus {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(FeatureStatus)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n"
  },
  {
    "path": "apis/core/Makefile",
    "content": "# Copyright 2022 VMware, Inc. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\ninclude ../../common.mk\n"
  },
  {
    "path": "apis/core/config/crd/bases/core.tanzu.vmware.com_capabilities.yaml",
    "content": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.9.2\n  creationTimestamp: null\n  name: capabilities.core.tanzu.vmware.com\nspec:\n  group: core.tanzu.vmware.com\n  names:\n    kind: Capability\n    listKind: CapabilityList\n    plural: capabilities\n    singular: capability\n  scope: Namespaced\n  versions:\n  - name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: Capability is the Schema for the capabilities API\n        properties:\n          apiVersion:\n            description: 'APIVersion defines the versioned schema of this representation\n              of an object. Servers should convert recognized schemas to the latest\n              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'\n            type: string\n          kind:\n            description: 'Kind is a string value representing the REST resource this\n              object represents. Servers may infer this from the endpoint the client\n              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: Spec is the capability spec that has cluster queries.\n            properties:\n              queries:\n                description: Queries specifies set of queries that are evaluated.\n                items:\n                  description: Query is a logical grouping of GVR, Object and PartialSchema\n                    queries.\n                  properties:\n                    groupVersionResources:\n                      description: GroupVersionResources evaluates a slice of GVR\n                        queries.\n                      items:\n                        description: QueryGVR queries for an API group with the optional\n                          ability to check for API versions and resource.\n                        properties:\n                          group:\n                            description: Group is the API group to check for in the\n                              cluster.\n                            type: string\n                          name:\n                            description: Name is the unique name of the query.\n                            minLength: 1\n                            type: string\n                          resource:\n                            description: Resource is the API resource to check for\n                              given an API group and a slice of versions. Specifying\n                              a Resource requires at least one version to be specified\n                              in Versions.\n                            type: string\n                          versions:\n                            description: Versions is the slice of versions to check\n                              for in the specified API group.\n                            items:\n                              type: string\n                            type: array\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    name:\n                      description: Name is the unique name of the query.\n                      minLength: 1\n                      type: string\n                    objects:\n                      description: Objects evaluates a slice of Object queries.\n                      items:\n                        description: QueryObject represents any runtime.Object that\n                          could exist in a cluster with the ability to check for annotations.\n                        properties:\n                          name:\n                            description: Name is the unique name of the query.\n                            minLength: 1\n                            type: string\n                          objectReference:\n                            description: ObjectReference is the ObjectReference to\n                              check for in the cluster.\n                            properties:\n                              apiVersion:\n                                description: API version of the referent.\n                                type: string\n                              fieldPath:\n                                description: 'If referring to a piece of an object\n                                  instead of an entire object, this string should\n                                  contain a valid JSON/Go field access statement,\n                                  such as desiredState.manifest.containers[2]. For\n                                  example, if the object reference is to a container\n                                  within a pod, this would take on a value like: \"spec.containers{name}\"\n                                  (where \"name\" refers to the name of the container\n                                  that triggered the event) or if no container name\n                                  is specified \"spec.containers[2]\" (container with\n                                  index 2 in this pod). This syntax is chosen only\n                                  to have some well-defined way of referencing a part\n                                  of an object. TODO: this design is not final and\n                                  this field is subject to change in the future.'\n                                type: string\n                              kind:\n                                description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n                                type: string\n                              name:\n                                description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'\n                                type: string\n                              namespace:\n                                description: 'Namespace of the referent. More info:\n                                  https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'\n                                type: string\n                              resourceVersion:\n                                description: 'Specific resourceVersion to which this\n                                  reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency'\n                                type: string\n                              uid:\n                                description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids'\n                                type: string\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          withAnnotations:\n                            additionalProperties:\n                              type: string\n                            description: WithAnnotations are the annotations whose\n                              presence is checked in the object. The query succeeds\n                              only if all the annotations specified exists.\n                            type: object\n                          withoutAnnotations:\n                            additionalProperties:\n                              type: string\n                            description: WithAnnotations are the annotations whose\n                              absence is checked in the object. The query succeeds\n                              only if all the annotations specified do not exist.\n                            type: object\n                        required:\n                        - name\n                        - objectReference\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    partialSchemas:\n                      description: PartialSchemas evaluates a slice of PartialSchema\n                        queries.\n                      items:\n                        description: QueryPartialSchema queries for any OpenAPI schema\n                          that may exist on a cluster.\n                        properties:\n                          name:\n                            description: Name is the unique name of the query.\n                            minLength: 1\n                            type: string\n                          partialSchema:\n                            description: PartialSchema is the partial OpenAPI schema\n                              that will be matched in a cluster.\n                            minLength: 1\n                            type: string\n                        required:\n                        - name\n                        - partialSchema\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n              serviceAccountName:\n                description: ServiceAccountName is the name of the service account\n                  with which requests are made to the API server for evaluating queries.\n                  Service account should exist in the same namespace as this resource.\n                  When this field is not specified, a default service account with\n                  only the ability to execute GVR queries is used.\n                type: string\n            required:\n            - queries\n            type: object\n          status:\n            description: Status is the capability status that has results of cluster\n              queries.\n            properties:\n              results:\n                description: Results represents the results of all the queries specified\n                  in the spec.\n                items:\n                  description: Result represents the results of queries in Query.\n                  properties:\n                    groupVersionResources:\n                      description: GroupVersionResources represents results of GVR\n                        queries in spec.\n                      items:\n                        description: QueryResult represents the result of a single\n                          query.\n                        properties:\n                          error:\n                            description: Error indicates if an error occurred while\n                              processing the query.\n                            type: boolean\n                          errorDetail:\n                            description: ErrorDetail represents the error detail,\n                              if an error occurred.\n                            type: string\n                          found:\n                            description: Found is a boolean which indicates if the\n                              query condition succeeded.\n                            type: boolean\n                          name:\n                            description: Name is the name of the query in spec whose\n                              result this struct represents.\n                            minLength: 1\n                            type: string\n                          notFoundReason:\n                            description: NotFoundReason provides the reason if the\n                              query condition fails. This is non-empty when Found\n                              is false.\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    name:\n                      description: Name is the unique name of the query.\n                      minLength: 1\n                      type: string\n                    objects:\n                      description: Objects represents results of Object queries in\n                        spec.\n                      items:\n                        description: QueryResult represents the result of a single\n                          query.\n                        properties:\n                          error:\n                            description: Error indicates if an error occurred while\n                              processing the query.\n                            type: boolean\n                          errorDetail:\n                            description: ErrorDetail represents the error detail,\n                              if an error occurred.\n                            type: string\n                          found:\n                            description: Found is a boolean which indicates if the\n                              query condition succeeded.\n                            type: boolean\n                          name:\n                            description: Name is the name of the query in spec whose\n                              result this struct represents.\n                            minLength: 1\n                            type: string\n                          notFoundReason:\n                            description: NotFoundReason provides the reason if the\n                              query condition fails. This is non-empty when Found\n                              is false.\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    partialSchemas:\n                      description: PartialSchemas represents results of PartialSchema\n                        queries in spec.\n                      items:\n                        description: QueryResult represents the result of a single\n                          query.\n                        properties:\n                          error:\n                            description: Error indicates if an error occurred while\n                              processing the query.\n                            type: boolean\n                          errorDetail:\n                            description: ErrorDetail represents the error detail,\n                              if an error occurred.\n                            type: string\n                          found:\n                            description: Found is a boolean which indicates if the\n                              query condition succeeded.\n                            type: boolean\n                          name:\n                            description: Name is the name of the query in spec whose\n                              result this struct represents.\n                            minLength: 1\n                            type: string\n                          notFoundReason:\n                            description: NotFoundReason provides the reason if the\n                              query condition fails. This is non-empty when Found\n                              is false.\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n            required:\n            - results\n            type: object\n        type: object\n    served: false\n    storage: false\n    subresources:\n      status: {}\n  - name: v1alpha2\n    schema:\n      openAPIV3Schema:\n        description: Capability is the Schema for the capabilities API\n        properties:\n          apiVersion:\n            description: 'APIVersion defines the versioned schema of this representation\n              of an object. Servers should convert recognized schemas to the latest\n              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'\n            type: string\n          kind:\n            description: 'Kind is a string value representing the REST resource this\n              object represents. Servers may infer this from the endpoint the client\n              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: Spec is the capability spec that has cluster queries.\n            properties:\n              queries:\n                description: Queries specifies set of queries that are evaluated.\n                items:\n                  description: Query is a logical grouping of GVR, Object and PartialSchema\n                    queries.\n                  properties:\n                    groupVersionResources:\n                      description: GroupVersionResources evaluates a slice of GVR\n                        queries.\n                      items:\n                        description: QueryGVR queries for an API group with the optional\n                          ability to check for API versions and resource.\n                        properties:\n                          group:\n                            description: Group is the API group to check for in the\n                              cluster.\n                            type: string\n                          name:\n                            description: Name is the unique name of the query.\n                            minLength: 1\n                            type: string\n                          resource:\n                            description: Resource is the API resource to check for\n                              given an API group and a slice of versions. Specifying\n                              a Resource requires at least one version to be specified\n                              in Versions.\n                            type: string\n                          versions:\n                            description: Versions is the slice of versions to check\n                              for in the specified API group.\n                            items:\n                              type: string\n                            type: array\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    name:\n                      description: Name is the unique name of the query.\n                      minLength: 1\n                      type: string\n                    objects:\n                      description: Objects evaluates a slice of Object queries.\n                      items:\n                        description: QueryObject represents any runtime.Object that\n                          could exist in a cluster with the ability to check for annotations.\n                        properties:\n                          name:\n                            description: Name is the unique name of the query.\n                            minLength: 1\n                            type: string\n                          objectReference:\n                            description: ObjectReference is the ObjectReference to\n                              check for in the cluster.\n                            properties:\n                              apiVersion:\n                                description: API version of the referent.\n                                type: string\n                              fieldPath:\n                                description: 'If referring to a piece of an object\n                                  instead of an entire object, this string should\n                                  contain a valid JSON/Go field access statement,\n                                  such as desiredState.manifest.containers[2]. For\n                                  example, if the object reference is to a container\n                                  within a pod, this would take on a value like: \"spec.containers{name}\"\n                                  (where \"name\" refers to the name of the container\n                                  that triggered the event) or if no container name\n                                  is specified \"spec.containers[2]\" (container with\n                                  index 2 in this pod). This syntax is chosen only\n                                  to have some well-defined way of referencing a part\n                                  of an object. TODO: this design is not final and\n                                  this field is subject to change in the future.'\n                                type: string\n                              kind:\n                                description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n                                type: string\n                              name:\n                                description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'\n                                type: string\n                              namespace:\n                                description: 'Namespace of the referent. More info:\n                                  https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'\n                                type: string\n                              resourceVersion:\n                                description: 'Specific resourceVersion to which this\n                                  reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency'\n                                type: string\n                              uid:\n                                description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids'\n                                type: string\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          withAnnotations:\n                            additionalProperties:\n                              type: string\n                            description: WithAnnotations are the annotations whose\n                              presence is checked in the object. The query succeeds\n                              only if all the annotations specified exists.\n                            type: object\n                          withoutAnnotations:\n                            additionalProperties:\n                              type: string\n                            description: WithAnnotations are the annotations whose\n                              absence is checked in the object. The query succeeds\n                              only if all the annotations specified do not exist.\n                            type: object\n                        required:\n                        - name\n                        - objectReference\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    partialSchemas:\n                      description: PartialSchemas evaluates a slice of PartialSchema\n                        queries.\n                      items:\n                        description: QueryPartialSchema queries for any OpenAPI schema\n                          that may exist on a cluster.\n                        properties:\n                          name:\n                            description: Name is the unique name of the query.\n                            minLength: 1\n                            type: string\n                          partialSchema:\n                            description: PartialSchema is the partial OpenAPI schema\n                              that will be matched in a cluster.\n                            minLength: 1\n                            type: string\n                        required:\n                        - name\n                        - partialSchema\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n              serviceAccountName:\n                description: ServiceAccountName is the name of the service account\n                  with which requests are made to the API server for evaluating queries.\n                  Service account should exist in the same namespace as this resource.\n                  When this field is not specified, a default service account with\n                  only the ability to execute GVR queries is used.\n                type: string\n            required:\n            - queries\n            type: object\n          status:\n            description: Status is the capability status that has results of cluster\n              queries.\n            properties:\n              results:\n                description: Results represents the results of all the queries specified\n                  in the spec.\n                items:\n                  description: Result represents the results of queries in Query.\n                  properties:\n                    groupVersionResources:\n                      description: GroupVersionResources represents results of GVR\n                        queries in spec.\n                      items:\n                        description: QueryResult represents the result of a single\n                          query.\n                        properties:\n                          error:\n                            description: Error indicates if an error occurred while\n                              processing the query.\n                            type: boolean\n                          errorDetail:\n                            description: ErrorDetail represents the error detail,\n                              if an error occurred.\n                            type: string\n                          found:\n                            description: Found is a boolean which indicates if the\n                              query condition succeeded.\n                            type: boolean\n                          name:\n                            description: Name is the name of the query in spec whose\n                              result this struct represents.\n                            minLength: 1\n                            type: string\n                          notFoundReason:\n                            description: NotFoundReason provides the reason if the\n                              query condition fails. This is non-empty when Found\n                              is false.\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    name:\n                      description: Name is the unique name of the query.\n                      minLength: 1\n                      type: string\n                    objects:\n                      description: Objects represents results of Object queries in\n                        spec.\n                      items:\n                        description: QueryResult represents the result of a single\n                          query.\n                        properties:\n                          error:\n                            description: Error indicates if an error occurred while\n                              processing the query.\n                            type: boolean\n                          errorDetail:\n                            description: ErrorDetail represents the error detail,\n                              if an error occurred.\n                            type: string\n                          found:\n                            description: Found is a boolean which indicates if the\n                              query condition succeeded.\n                            type: boolean\n                          name:\n                            description: Name is the name of the query in spec whose\n                              result this struct represents.\n                            minLength: 1\n                            type: string\n                          notFoundReason:\n                            description: NotFoundReason provides the reason if the\n                              query condition fails. This is non-empty when Found\n                              is false.\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    partialSchemas:\n                      description: PartialSchemas represents results of PartialSchema\n                        queries in spec.\n                      items:\n                        description: QueryResult represents the result of a single\n                          query.\n                        properties:\n                          error:\n                            description: Error indicates if an error occurred while\n                              processing the query.\n                            type: boolean\n                          errorDetail:\n                            description: ErrorDetail represents the error detail,\n                              if an error occurred.\n                            type: string\n                          found:\n                            description: Found is a boolean which indicates if the\n                              query condition succeeded.\n                            type: boolean\n                          name:\n                            description: Name is the name of the query in spec whose\n                              result this struct represents.\n                            minLength: 1\n                            type: string\n                          notFoundReason:\n                            description: NotFoundReason provides the reason if the\n                              query condition fails. This is non-empty when Found\n                              is false.\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n            required:\n            - results\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n"
  },
  {
    "path": "apis/core/config/crd/bases/core.tanzu.vmware.com_featuregates.yaml",
    "content": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.9.2\n  creationTimestamp: null\n  name: featuregates.core.tanzu.vmware.com\nspec:\n  group: core.tanzu.vmware.com\n  names:\n    kind: FeatureGate\n    listKind: FeatureGateList\n    plural: featuregates\n    singular: featuregate\n  scope: Cluster\n  versions:\n  - name: v1alpha2\n    schema:\n      openAPIV3Schema:\n        description: FeatureGate is the Schema for the featuregates API\n        properties:\n          apiVersion:\n            description: 'APIVersion defines the versioned schema of this representation\n              of an object. Servers should convert recognized schemas to the latest\n              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'\n            type: string\n          kind:\n            description: 'Kind is a string value representing the REST resource this\n              object represents. Servers may infer this from the endpoint the client\n              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: Spec is the specification for gating features.\n            properties:\n              features:\n                description: Features is a slice of FeatureReference to gate features.\n                  Feature controller sets the specified activation state only if the\n                  Feature policy is satisfied.\n                items:\n                  description: FeatureReference refers to a Feature resource and specifies\n                    its intended activation state.\n                  properties:\n                    activate:\n                      description: Activate indicates the activation intent for the\n                        feature.\n                      type: boolean\n                    name:\n                      description: Name is the name of the Feature resource, which\n                        represents a feature the system offers.\n                      type: string\n                    permanentlyVoidAllSupportGuarantees:\n                      description: PermanentlyVoidAllSupportGuarantees when set to\n                        true permanently voids all support guarantees. Once set to\n                        true, cannot be set back to false\n                      type: boolean\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n            type: object\n          status:\n            description: Status reports activation state and availability of features\n              in the system.\n            properties:\n              featureReferenceResults:\n                description: FeatureReferenceResult represents the results of all\n                  the features specified in the FeatureGate spec.\n                items:\n                  description: FeatureReferenceResult represents the result of FeatureReference.\n                  properties:\n                    message:\n                      description: Message represents the reason for status\n                      type: string\n                    name:\n                      description: Name is the name of the feature.\n                      minLength: 1\n                      type: string\n                    status:\n                      description: 'Status represents the outcome of the feature reference\n                        operation specified in the FeatureGate spec - Applied: represents\n                        feature toggle has been successfully applied. - Invalid: represents\n                        that the intended state of the feature is invalid.'\n                      enum:\n                      - Applied\n                      - Invalid\n                      type: string\n                  required:\n                  - name\n                  - status\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n            required:\n            - featureReferenceResults\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n"
  },
  {
    "path": "apis/core/config/crd/bases/core.tanzu.vmware.com_features.yaml",
    "content": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.9.2\n  creationTimestamp: null\n  name: features.core.tanzu.vmware.com\nspec:\n  group: core.tanzu.vmware.com\n  names:\n    kind: Feature\n    listKind: FeatureList\n    plural: features\n    singular: feature\n  scope: Cluster\n  versions:\n  - additionalPrinterColumns:\n    - jsonPath: .spec.description\n      name: Description\n      type: string\n    - jsonPath: .spec.stability\n      name: Stability\n      type: string\n    - jsonPath: .status.activated\n      name: Activated?\n      type: string\n    name: v1alpha2\n    schema:\n      openAPIV3Schema:\n        description: Feature is the Schema for the features API\n        properties:\n          apiVersion:\n            description: 'APIVersion defines the versioned schema of this representation\n              of an object. Servers should convert recognized schemas to the latest\n              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'\n            type: string\n          kind:\n            description: 'Kind is a string value representing the REST resource this\n              object represents. Servers may infer this from the endpoint the client\n              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: FeatureSpec defines the desired state of Feature\n            properties:\n              description:\n                description: Description of the feature.\n                type: string\n              stability:\n                description: 'Stability indicates stability level of the feature.\n                  Stability levels are Work In Progress, Experimental, Technical Preview,\n                  Stable and Deprecated. - Work In Progress: Feature is still under\n                  development. It is not ready to be used, except by the team working\n                  on it. Activating this feature is not recommended under any circumstances.\n                  - Experimental: Feature is not ready, but may be used in pre-production\n                  environments. However, if an experimental feature has ever been\n                  used in an environment, that environment will not be supported.\n                  Activating an experimental feature requires you to permanently,\n                  irrevocably void all support guarantees for this environment by\n                  setting permanentlyVoidAllSupportGuarantees in feature reference\n                  in featuregate spec to true. You will need to recreate the environment\n                  to return to a supported state. - Technical Preview: Feature is\n                  not ready, but is not believed to be dangerous. The feature itself\n                  is unsupported, but activating a technical preview feature does\n                  not affect the support status of the environment. - Stable: Feature\n                  is ready and fully supported - Deprecated: Feature is destined for\n                  removal, usage is discouraged. Deactivate this feature prior to\n                  upgrading to a release which has removed it to validate that you\n                  are not still using it and to prevent users from introducing new\n                  usage of it.'\n                enum:\n                - Work In Progress\n                - Experimental\n                - Technical Preview\n                - Stable\n                - Deprecated\n                type: string\n            required:\n            - description\n            - stability\n            type: object\n          status:\n            description: FeatureStatus defines the observed state of Feature\n            properties:\n              activated:\n                description: Activated is a boolean which indicates whether a feature\n                  is activated or not.\n                type: boolean\n            required:\n            - activated\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources: {}\n"
  },
  {
    "path": "apis/core/config/crd/bases/core.tanzu.vmware.com_readinesses.yaml",
    "content": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.9.2\n  creationTimestamp: null\n  name: readinesses.core.tanzu.vmware.com\nspec:\n  group: core.tanzu.vmware.com\n  names:\n    kind: Readiness\n    listKind: ReadinessList\n    plural: readinesses\n    singular: readiness\n  scope: Cluster\n  versions:\n  - additionalPrinterColumns:\n    - jsonPath: .status.ready\n      name: Ready\n      type: boolean\n    - jsonPath: .metadata.creationTimestamp\n      name: Age\n      type: date\n    name: v1alpha2\n    schema:\n      openAPIV3Schema:\n        description: Readiness is the Schema for the readinesses API\n        properties:\n          apiVersion:\n            description: 'APIVersion defines the versioned schema of this representation\n              of an object. Servers should convert recognized schemas to the latest\n              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'\n            type: string\n          kind:\n            description: 'Kind is a string value representing the REST resource this\n              object represents. Servers may infer this from the endpoint the client\n              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ReadinessSpec defines the desired state of Readiness\n            properties:\n              checks:\n                description: Checks is the set of checks that are required to mark\n                  the readiness\n                items:\n                  properties:\n                    category:\n                      description: Category is the category of the check. Examples\n                        of categories are availability and security.\n                      type: string\n                    name:\n                      description: Name is the name of the check\n                      type: string\n                    type:\n                      description: Type is the type of the check. Type can be either\n                        basic or composite. The basic checks depend on its providers\n                        to be ready. The composite checks depend on the basic checks\n                        for their readiness.\n                      enum:\n                      - basic\n                      - composite\n                      type: string\n                  required:\n                  - category\n                  - name\n                  - type\n                  type: object\n                type: array\n            required:\n            - checks\n            type: object\n          status:\n            description: ReadinessStatus defines the observed state of Readiness\n            properties:\n              checkStatus:\n                description: CheckStatus presents the status of check defined in the\n                  spec\n                items:\n                  properties:\n                    name:\n                      description: Name is the name of the check\n                      type: string\n                    providers:\n                      description: Providers is the list of providers available for\n                        the given check\n                      items:\n                        properties:\n                          isActive:\n                            description: IsActive is the boolean flag indicating if\n                              the provider is active\n                            type: boolean\n                          name:\n                            description: Name is the name of the provider\n                            type: string\n                        required:\n                        - isActive\n                        - name\n                        type: object\n                      type: array\n                    status:\n                      description: Ready is the boolean flag indicating if the check\n                        is ready\n                      type: boolean\n                  required:\n                  - name\n                  - providers\n                  - status\n                  type: object\n                type: array\n              ready:\n                description: Ready is the flag that denotes if the defined readiness\n                  is ready. The readiness is marked ready if all the checks are satisfied.\n                type: boolean\n            required:\n            - checkStatus\n            - ready\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n"
  },
  {
    "path": "apis/core/config/crd/bases/core.tanzu.vmware.com_readinessproviders.yaml",
    "content": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.9.2\n  creationTimestamp: null\n  name: readinessproviders.core.tanzu.vmware.com\nspec:\n  group: core.tanzu.vmware.com\n  names:\n    kind: ReadinessProvider\n    listKind: ReadinessProviderList\n    plural: readinessproviders\n    singular: readinessprovider\n  scope: Cluster\n  versions:\n  - additionalPrinterColumns:\n    - jsonPath: .status.state\n      name: State\n      type: string\n    - jsonPath: .spec.checkRefs\n      name: Checks\n      priority: 1\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: Age\n      type: date\n    name: v1alpha2\n    schema:\n      openAPIV3Schema:\n        description: ReadinessProvider is the Schema for the readinessproviders API\n        properties:\n          apiVersion:\n            description: 'APIVersion defines the versioned schema of this representation\n              of an object. Servers should convert recognized schemas to the latest\n              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'\n            type: string\n          kind:\n            description: 'Kind is a string value representing the REST resource this\n              object represents. Servers may infer this from the endpoint the client\n              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ReadinessProviderSpec defines the desired state of ReadinessProvider\n            properties:\n              checkRefs:\n                description: CheckRefs contains names of the checks that the current\n                  provider satisfies\n                items:\n                  type: string\n                type: array\n              conditions:\n                description: Conditions is the set of checks that must be evaluated\n                  to true to mark the provider as ready\n                items:\n                  description: ReadinessProviderCondition defines the readiness provider\n                    condition\n                  properties:\n                    name:\n                      description: Name is the name of the condition\n                      type: string\n                    resourceExistenceCondition:\n                      description: ResourceExistenceCondition is the condition that\n                        checks for the presence of a certain resource in the cluster\n                      properties:\n                        apiVersion:\n                          description: 'APIVersion is the API version of the resource\n                            that is being checked. This should be provided in <group>/<version>\n                            format. More info: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#resources'\n                          type: string\n                        kind:\n                          description: 'Kind is the API kind of the resource that\n                            is being checked More info: More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n                          type: string\n                        name:\n                          type: string\n                        namespace:\n                          description: Namespace is the namespace of the resource\n                            that is being checked; if the Namespace is nil, the resource\n                            is assumed to be cluster scoped. Empty string for the\n                            namespace will throw error.\n                          type: string\n                      required:\n                      - apiVersion\n                      - kind\n                      - name\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n              serviceAccountRef:\n                description: ServiceAccountRef represents the service account to be\n                  used to make requests to the API server for evaluating conditions.\n                  If not provided, it uses the default service account of the readiness\n                  provider controller, which may not have appropriate RBAC for evaluating\n                  conditions.\n                properties:\n                  name:\n                    description: Name is the name of the service account to be used\n                      to make requests to the API server for evaluating conditions.\n                    type: string\n                  namespace:\n                    description: Namespace is the namespace containing the service\n                      account.\n                    type: string\n                required:\n                - name\n                - namespace\n                type: object\n            required:\n            - checkRefs\n            - conditions\n            type: object\n          status:\n            description: ReadinessProviderStatus defines the observed state of ReadinessProvider\n            properties:\n              conditions:\n                description: Conditions is the set of ReadinessConditions that are\n                  being evaluated\n                items:\n                  properties:\n                    message:\n                      description: Message is the field that provides information\n                        about the condition evaluation\n                      type: string\n                    name:\n                      description: Name is the name of the readiness condition\n                      type: string\n                    state:\n                      description: State is the computed state of the condition\n                      enum:\n                      - success\n                      - failure\n                      - inprogress\n                      type: string\n                  required:\n                  - message\n                  - name\n                  - state\n                  type: object\n                type: array\n              message:\n                description: Message provides information about the ReadinessProvider\n                  state\n                type: string\n              state:\n                description: State is the computed state of the provider. The state\n                  will be success if all the conditions pass; The state will be failure\n                  if any of the conditions fail. Otherwise, the state will be in-progress.\n                enum:\n                - success\n                - failure\n                - inprogress\n                type: string\n            required:\n            - conditions\n            - message\n            - state\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n"
  },
  {
    "path": "apis/core/go.mod",
    "content": "module github.com/vmware-tanzu/tanzu-framework/apis/core\n\ngo 1.19\n\nrequire (\n\tgithub.com/google/go-cmp v0.5.8\n\tk8s.io/api v0.24.2\n\tk8s.io/apimachinery v0.24.2\n\tk8s.io/client-go v0.24.2\n\tsigs.k8s.io/controller-runtime v0.12.3\n)\n\nrequire (\n\tgithub.com/PuerkitoBio/purell v1.1.1 // indirect\n\tgithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.1.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.1 // indirect\n\tgithub.com/emicklei/go-restful/v3 v3.9.0 // indirect\n\tgithub.com/evanphx/json-patch v5.6.0+incompatible // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/go-logr/logr v1.2.3 // indirect\n\tgithub.com/go-openapi/jsonpointer v0.19.5 // indirect\n\tgithub.com/go-openapi/jsonreference v0.19.6 // indirect\n\tgithub.com/go-openapi/swag v0.21.1 // indirect\n\tgithub.com/gogo/protobuf v1.3.2 // indirect\n\tgithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/gnostic v0.5.7-v3refs // indirect\n\tgithub.com/google/gofuzz v1.2.0 // indirect\n\tgithub.com/google/uuid v1.3.0 // indirect\n\tgithub.com/imdario/mergo v0.3.12 // indirect\n\tgithub.com/josharian/intern v1.0.0 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/mailru/easyjson v0.7.7 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect\n\tgithub.com/pkg/errors v0.9.1 // indirect\n\tgithub.com/prometheus/client_golang v1.12.2 // indirect\n\tgithub.com/prometheus/client_model v0.2.0 // indirect\n\tgithub.com/prometheus/common v0.32.1 // indirect\n\tgithub.com/prometheus/procfs v0.7.3 // indirect\n\tgithub.com/spf13/pflag v1.0.5 // indirect\n\tgithub.com/stretchr/testify v1.8.0 // indirect\n\tgolang.org/x/net v0.8.0 // indirect\n\tgolang.org/x/oauth2 v0.3.0 // indirect\n\tgolang.org/x/sys v0.6.0 // indirect\n\tgolang.org/x/term v0.6.0 // indirect\n\tgolang.org/x/text v0.8.0 // indirect\n\tgolang.org/x/time v0.3.0 // indirect\n\tgomodules.xyz/jsonpatch/v2 v2.2.0 // indirect\n\tgoogle.golang.org/appengine v1.6.7 // indirect\n\tgoogle.golang.org/protobuf v1.28.1 // indirect\n\tgopkg.in/inf.v0 v0.9.1 // indirect\n\tgopkg.in/yaml.v2 v2.4.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tk8s.io/apiextensions-apiserver v0.24.2 // indirect\n\tk8s.io/component-base v0.24.2 // indirect\n\tk8s.io/klog/v2 v2.70.1 // indirect\n\tk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect\n\tk8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect\n\tsigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect\n\tsigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect\n\tsigs.k8s.io/yaml v1.3.0 // indirect\n)\n"
  },
  {
    "path": "apis/core/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=\ncloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=\ncloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=\ncloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=\ncloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngithub.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=\ngithub.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=\ngithub.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA=\ngithub.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M=\ngithub.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=\ngithub.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=\ngithub.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=\ngithub.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=\ngithub.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=\ngithub.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=\ngithub.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=\ngithub.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=\ngithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=\ngithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=\ngithub.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=\ngithub.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=\ngithub.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=\ngithub.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=\ngithub.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=\ngithub.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=\ngithub.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=\ngithub.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=\ngithub.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=\ngithub.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=\ngithub.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=\ngithub.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=\ngithub.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=\ngithub.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=\ngithub.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=\ngithub.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=\ngithub.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=\ngithub.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=\ngithub.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=\ngithub.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=\ngithub.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=\ngithub.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=\ngithub.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE=\ngithub.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ=\ngithub.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=\ngithub.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U=\ngithub.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=\ngithub.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=\ngithub.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=\ngithub.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=\ngithub.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg=\ngithub.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=\ngithub.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=\ngithub.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=\ngithub.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=\ngithub.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk=\ngithub.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro=\ngithub.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=\ngithub.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=\ngithub.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg=\ngithub.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs=\ngithub.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns=\ngithub.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=\ngithub.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=\ngithub.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU=\ngithub.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=\ngithub.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=\ngithub.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w=\ngithub.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA=\ngithub.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=\ngithub.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=\ngithub.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=\ngithub.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=\ngithub.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=\ngithub.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=\ngithub.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=\ngithub.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=\ngithub.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=\ngithub.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=\ngithub.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=\ngithub.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=\ngithub.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=\ngithub.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=\ngithub.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=\ngithub.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=\ngithub.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=\ngithub.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=\ngithub.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=\ngithub.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=\ngithub.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=\ngithub.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=\ngithub.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=\ngithub.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=\ngithub.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=\ngithub.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=\ngithub.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=\ngithub.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=\ngithub.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=\ngithub.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=\ngithub.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=\ngithub.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=\ngithub.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=\ngithub.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=\ngithub.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=\ngithub.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=\ngithub.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=\ngithub.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=\ngithub.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=\ngithub.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY=\ngithub.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=\ngithub.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=\ngithub.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=\ngithub.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw=\ngithub.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=\ngithub.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34=\ngithub.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=\ngithub.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=\ngithub.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=\ngithub.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=\ngithub.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=\ngithub.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0=\ngithub.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=\ngithub.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=\ngithub.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=\ngithub.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=\ngithub.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=\ngithub.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=\ngithub.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=\ngithub.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=\ngithub.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=\ngithub.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=\ngithub.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=\ngithub.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=\ngithub.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=\ngithub.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=\ngithub.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngo.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=\ngo.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=\ngo.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=\ngo.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=\ngo.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=\ngo.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=\ngo.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=\ngo.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0=\ngo.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q=\ngo.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE=\ngo.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc=\ngo.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=\ngo.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=\ngo.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=\ngo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E=\ngo.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=\ngo.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=\ngo.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM=\ngo.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=\ngo.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=\ngo.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=\ngo.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE=\ngo.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE=\ngo.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=\ngo.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=\ngo.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=\ngo.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=\ngo.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=\ngo.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=\ngo.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=\ngo.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=\ngo.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=\ngo.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=\ngo.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=\ngo.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=\ngo.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=\ngo.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=\ngolang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8=\ngolang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw=\ngolang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=\ngolang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=\ngolang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=\ngolang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY=\ngomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=\ngoogle.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=\ngoogle.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=\ngoogle.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=\ngoogle.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=\ngoogle.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=\ngoogle.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=\ngoogle.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=\ngoogle.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=\ngoogle.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=\ngoogle.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=\ngoogle.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\ngoogle.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\ngoogle.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=\ngopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=\ngopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=\ngopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=\ngopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=\ngopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=\ngopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=\ngotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nk8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI=\nk8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg=\nk8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k=\nk8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ=\nk8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM=\nk8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=\nk8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI=\nk8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA=\nk8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30=\nk8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w=\nk8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU=\nk8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM=\nk8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=\nk8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=\nk8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=\nk8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=\nk8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=\nk8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ=\nk8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=\nk8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk=\nk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s=\nk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4=\nk8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=\nk8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc=\nk8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw=\nsigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio=\nsigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0=\nsigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y=\nsigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY=\nsigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=\nsigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=\nsigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=\nsigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=\n"
  },
  {
    "path": "apis/core/v1alpha1/capabilities_types.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage v1alpha1\n\nimport (\n\tcorev1 \"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n)\n\n// CapabilitySpec defines the desired state of Capability.\ntype CapabilitySpec struct {\n\t// ServiceAccountName is the name of the service account with which requests\n\t// are made to the API server for evaluating queries.\n\t// Service account should exist in the same namespace as this resource.\n\t// When this field is not specified, a default service account with only the\n\t// ability to execute GVR queries is used.\n\t// +optional\n\tServiceAccountName string `json:\"serviceAccountName\"`\n\t// Queries specifies set of queries that are evaluated.\n\t// +listType=map\n\t// +listMapKey=name\n\tQueries []Query `json:\"queries\"`\n}\n\n// Query is a logical grouping of GVR, Object and PartialSchema queries.\ntype Query struct {\n\t// Name is the unique name of the query.\n\t// +kubebuilder:validation:Required\n\t// +kubebuilder:validation:MinLength:=1\n\tName string `json:\"name\"`\n\t// GroupVersionResources evaluates a slice of GVR queries.\n\t// +listType=map\n\t// +listMapKey=name\n\t// +optional\n\tGroupVersionResources []QueryGVR `json:\"groupVersionResources,omitempty\"`\n\t// Objects evaluates a slice of Object queries.\n\t// +listType=map\n\t// +listMapKey=name\n\t// +optional\n\tObjects []QueryObject `json:\"objects,omitempty\"`\n\t// PartialSchemas evaluates a slice of PartialSchema queries.\n\t// +listType=map\n\t// +listMapKey=name\n\t// +optional\n\tPartialSchemas []QueryPartialSchema `json:\"partialSchemas,omitempty\"`\n}\n\n// QueryObject represents any runtime.Object that could exist in a cluster with the ability to check for annotations.\ntype QueryObject struct {\n\t// Name is the unique name of the query.\n\t// +kubebuilder:validation:Required\n\t// +kubebuilder:validation:MinLength:=1\n\tName string `json:\"name\"`\n\t// ObjectReference is the ObjectReference to check for in the cluster.\n\t// +kubebuilder:validation:Required\n\tObjectReference corev1.ObjectReference `json:\"objectReference\"`\n\t// WithAnnotations are the annotations whose presence is checked in the object.\n\t// The query succeeds only if all the annotations specified exists.\n\t// +optional\n\tWithAnnotations map[string]string `json:\"withAnnotations,omitempty\"`\n\t// WithAnnotations are the annotations whose absence is checked in the object.\n\t// The query succeeds only if all the annotations specified do not exist.\n\t// +optional\n\tWithoutAnnotations map[string]string `json:\"withoutAnnotations,omitempty\"`\n}\n\n// QueryGVR queries for an API group with the optional ability to check for API versions and resource.\ntype QueryGVR struct {\n\t// Name is the unique name of the query.\n\t// +kubebuilder:validation:Required\n\t// +kubebuilder:validation:MinLength:=1\n\tName string `json:\"name\"`\n\t// Group is the API group to check for in the cluster.\n\t// +optional\n\tGroup string `json:\"group\"`\n\t// Versions is the slice of versions to check for in the specified API group.\n\t// +optional\n\tVersions []string `json:\"versions,omitempty\"`\n\t// Resource is the API resource to check for given an API group and a slice of versions.\n\t// Specifying a Resource requires at least one version to be specified in Versions.\n\t// +optional\n\tResource string `json:\"resource,omitempty\"`\n}\n\n// QueryPartialSchema queries for any OpenAPI schema that may exist on a cluster.\ntype QueryPartialSchema struct {\n\t// Name is the unique name of the query.\n\t// +kubebuilder:validation:Required\n\t// +kubebuilder:validation:MinLength:=1\n\tName string `json:\"name\"`\n\t// PartialSchema is the partial OpenAPI schema that will be matched in a cluster.\n\t// +kubebuilder:validation:Required\n\t// +kubebuilder:validation:MinLength:=1\n\tPartialSchema string `json:\"partialSchema\"`\n}\n\n// CapabilityStatus defines the observed state of Capability\ntype CapabilityStatus struct {\n\t// Results represents the results of all the queries specified in the spec.\n\t// +listType=map\n\t// +listMapKey=name\n\tResults []Result `json:\"results\"`\n}\n\n// QueryResult represents the result of a single query.\ntype QueryResult struct {\n\t// Name is the name of the query in spec whose result this struct represents.\n\t// +kubebuilder:validation:Required\n\t// +kubebuilder:validation:MinLength:=1\n\tName string `json:\"name\"`\n\t// Found is a boolean which indicates if the query condition succeeded.\n\t// +optional\n\tFound bool `json:\"found\"`\n\t// Error indicates if an error occurred while processing the query.\n\t// +optional\n\tError bool `json:\"error,omitempty\"`\n\t// ErrorDetail represents the error detail, if an error occurred.\n\t// +optional\n\tErrorDetail string `json:\"errorDetail,omitempty\"`\n\t// NotFoundReason provides the reason if the query condition fails.\n\t// This is non-empty when Found is false.\n\t// +optional\n\tNotFoundReason string `json:\"notFoundReason,omitempty\"`\n}\n\n// Result represents the results of queries in Query.\ntype Result struct {\n\t// Name is the unique name of the query.\n\t// +kubebuilder:validation:Required\n\t// +kubebuilder:validation:MinLength:=1\n\tName string `json:\"name\"`\n\t// GroupVersionResources represents results of GVR queries in spec.\n\t// +listType=map\n\t// +listMapKey=name\n\t// +optional\n\tGroupVersionResources []QueryResult `json:\"groupVersionResources,omitempty\"`\n\t// Objects represents results of Object queries in spec.\n\t// +listType=map\n\t// +listMapKey=name\n\t// +optional\n\tObjects []QueryResult `json:\"objects,omitempty\"`\n\t// PartialSchemas represents results of PartialSchema queries in spec.\n\t// +listType=map\n\t// +listMapKey=name\n\t// +optional\n\tPartialSchemas []QueryResult `json:\"partialSchemas,omitempty\"`\n}\n\n//+kubebuilder:object:root=true\n//+kubebuilder:subresource:status\n//+kubebuilder:unservedversion\n\n// Capability is the Schema for the capabilities API\ntype Capability struct {\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\t// Spec is the capability spec that has cluster queries.\n\tSpec CapabilitySpec `json:\"spec,omitempty\"`\n\t// Status is the capability status that has results of cluster queries.\n\tStatus CapabilityStatus `json:\"status,omitempty\"`\n}\n\n//+kubebuilder:object:root=true\n\n// CapabilityList contains a list of Capability\ntype CapabilityList struct {\n\tmetav1.TypeMeta `json:\",inline\"`\n\tmetav1.ListMeta `json:\"metadata,omitempty\"`\n\tItems           []Capability `json:\"items\"`\n}\n\nfunc init() {\n\tSchemeBuilder.Register(&Capability{}, &CapabilityList{})\n}\n"
  },
  {
    "path": "apis/core/v1alpha1/groupversion_info.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package v1alpha1 contains API Schema definitions for the core v1alpha1 API group\n// +kubebuilder:object:generate=true\n// +groupName=core.tanzu.vmware.com\npackage v1alpha1\n\nimport (\n\t\"k8s.io/apimachinery/pkg/runtime/schema\"\n\t\"sigs.k8s.io/controller-runtime/pkg/scheme\"\n)\n\nvar (\n\t// GroupVersion is group version used to register these objects\n\tGroupVersion = schema.GroupVersion{Group: \"core.tanzu.vmware.com\", Version: \"v1alpha1\"}\n\n\t// SchemeBuilder is used to add go types to the GroupVersionKind scheme\n\tSchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion}\n\n\t// AddToScheme adds the types in this group-version to the given scheme.\n\tAddToScheme = SchemeBuilder.AddToScheme\n)\n"
  },
  {
    "path": "apis/core/v1alpha1/zz_generated.deepcopy.go",
    "content": "//go:build !ignore_autogenerated\n// +build !ignore_autogenerated\n\n// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Code generated by controller-gen. DO NOT EDIT.\n\npackage v1alpha1\n\nimport (\n\truntime \"k8s.io/apimachinery/pkg/runtime\"\n)\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Capability) DeepCopyInto(out *Capability) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ObjectMeta.DeepCopyInto(&out.ObjectMeta)\n\tin.Spec.DeepCopyInto(&out.Spec)\n\tin.Status.DeepCopyInto(&out.Status)\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Capability.\nfunc (in *Capability) DeepCopy() *Capability {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Capability)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *Capability) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *CapabilityList) DeepCopyInto(out *CapabilityList) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ListMeta.DeepCopyInto(&out.ListMeta)\n\tif in.Items != nil {\n\t\tin, out := &in.Items, &out.Items\n\t\t*out = make([]Capability, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CapabilityList.\nfunc (in *CapabilityList) DeepCopy() *CapabilityList {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(CapabilityList)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *CapabilityList) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *CapabilitySpec) DeepCopyInto(out *CapabilitySpec) {\n\t*out = *in\n\tif in.Queries != nil {\n\t\tin, out := &in.Queries, &out.Queries\n\t\t*out = make([]Query, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CapabilitySpec.\nfunc (in *CapabilitySpec) DeepCopy() *CapabilitySpec {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(CapabilitySpec)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *CapabilityStatus) DeepCopyInto(out *CapabilityStatus) {\n\t*out = *in\n\tif in.Results != nil {\n\t\tin, out := &in.Results, &out.Results\n\t\t*out = make([]Result, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CapabilityStatus.\nfunc (in *CapabilityStatus) DeepCopy() *CapabilityStatus {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(CapabilityStatus)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Query) DeepCopyInto(out *Query) {\n\t*out = *in\n\tif in.GroupVersionResources != nil {\n\t\tin, out := &in.GroupVersionResources, &out.GroupVersionResources\n\t\t*out = make([]QueryGVR, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.Objects != nil {\n\t\tin, out := &in.Objects, &out.Objects\n\t\t*out = make([]QueryObject, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.PartialSchemas != nil {\n\t\tin, out := &in.PartialSchemas, &out.PartialSchemas\n\t\t*out = make([]QueryPartialSchema, len(*in))\n\t\tcopy(*out, *in)\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Query.\nfunc (in *Query) DeepCopy() *Query {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Query)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *QueryGVR) DeepCopyInto(out *QueryGVR) {\n\t*out = *in\n\tif in.Versions != nil {\n\t\tin, out := &in.Versions, &out.Versions\n\t\t*out = make([]string, len(*in))\n\t\tcopy(*out, *in)\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QueryGVR.\nfunc (in *QueryGVR) DeepCopy() *QueryGVR {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(QueryGVR)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *QueryObject) DeepCopyInto(out *QueryObject) {\n\t*out = *in\n\tout.ObjectReference = in.ObjectReference\n\tif in.WithAnnotations != nil {\n\t\tin, out := &in.WithAnnotations, &out.WithAnnotations\n\t\t*out = make(map[string]string, len(*in))\n\t\tfor key, val := range *in {\n\t\t\t(*out)[key] = val\n\t\t}\n\t}\n\tif in.WithoutAnnotations != nil {\n\t\tin, out := &in.WithoutAnnotations, &out.WithoutAnnotations\n\t\t*out = make(map[string]string, len(*in))\n\t\tfor key, val := range *in {\n\t\t\t(*out)[key] = val\n\t\t}\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QueryObject.\nfunc (in *QueryObject) DeepCopy() *QueryObject {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(QueryObject)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *QueryPartialSchema) DeepCopyInto(out *QueryPartialSchema) {\n\t*out = *in\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QueryPartialSchema.\nfunc (in *QueryPartialSchema) DeepCopy() *QueryPartialSchema {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(QueryPartialSchema)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *QueryResult) DeepCopyInto(out *QueryResult) {\n\t*out = *in\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QueryResult.\nfunc (in *QueryResult) DeepCopy() *QueryResult {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(QueryResult)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Result) DeepCopyInto(out *Result) {\n\t*out = *in\n\tif in.GroupVersionResources != nil {\n\t\tin, out := &in.GroupVersionResources, &out.GroupVersionResources\n\t\t*out = make([]QueryResult, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\tif in.Objects != nil {\n\t\tin, out := &in.Objects, &out.Objects\n\t\t*out = make([]QueryResult, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\tif in.PartialSchemas != nil {\n\t\tin, out := &in.PartialSchemas, &out.PartialSchemas\n\t\t*out = make([]QueryResult, len(*in))\n\t\tcopy(*out, *in)\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Result.\nfunc (in *Result) DeepCopy() *Result {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Result)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n"
  },
  {
    "path": "apis/core/v1alpha2/capability_types.go",
    "content": "// Copyright YEAR VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage v1alpha2\n\nimport (\n\tcorev1 \"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n)\n\n// CapabilitySpec defines the desired state of Capability.\ntype CapabilitySpec struct {\n\t// ServiceAccountName is the name of the service account with which requests\n\t// are made to the API server for evaluating queries.\n\t// Service account should exist in the same namespace as this resource.\n\t// When this field is not specified, a default service account with only the\n\t// ability to execute GVR queries is used.\n\t// +optional\n\tServiceAccountName string `json:\"serviceAccountName\"`\n\t// Queries specifies set of queries that are evaluated.\n\t// +listType=map\n\t// +listMapKey=name\n\tQueries []Query `json:\"queries\"`\n}\n\n// Query is a logical grouping of GVR, Object and PartialSchema queries.\ntype Query struct {\n\t// Name is the unique name of the query.\n\t// +kubebuilder:validation:Required\n\t// +kubebuilder:validation:MinLength:=1\n\tName string `json:\"name\"`\n\t// GroupVersionResources evaluates a slice of GVR queries.\n\t// +listType=map\n\t// +listMapKey=name\n\t// +optional\n\tGroupVersionResources []QueryGVR `json:\"groupVersionResources,omitempty\"`\n\t// Objects evaluates a slice of Object queries.\n\t// +listType=map\n\t// +listMapKey=name\n\t// +optional\n\tObjects []QueryObject `json:\"objects,omitempty\"`\n\t// PartialSchemas evaluates a slice of PartialSchema queries.\n\t// +listType=map\n\t// +listMapKey=name\n\t// +optional\n\tPartialSchemas []QueryPartialSchema `json:\"partialSchemas,omitempty\"`\n}\n\n// QueryObject represents any runtime.Object that could exist in a cluster with the ability to check for annotations.\ntype QueryObject struct {\n\t// Name is the unique name of the query.\n\t// +kubebuilder:validation:Required\n\t// +kubebuilder:validation:MinLength:=1\n\tName string `json:\"name\"`\n\t// ObjectReference is the ObjectReference to check for in the cluster.\n\t// +kubebuilder:validation:Required\n\tObjectReference corev1.ObjectReference `json:\"objectReference\"`\n\t// WithAnnotations are the annotations whose presence is checked in the object.\n\t// The query succeeds only if all the annotations specified exists.\n\t// +optional\n\tWithAnnotations map[string]string `json:\"withAnnotations,omitempty\"`\n\t// WithAnnotations are the annotations whose absence is checked in the object.\n\t// The query succeeds only if all the annotations specified do not exist.\n\t// +optional\n\tWithoutAnnotations map[string]string `json:\"withoutAnnotations,omitempty\"`\n}\n\n// QueryGVR queries for an API group with the optional ability to check for API versions and resource.\ntype QueryGVR struct {\n\t// Name is the unique name of the query.\n\t// +kubebuilder:validation:Required\n\t// +kubebuilder:validation:MinLength:=1\n\tName string `json:\"name\"`\n\t// Group is the API group to check for in the cluster.\n\t// +optional\n\tGroup string `json:\"group\"`\n\t// Versions is the slice of versions to check for in the specified API group.\n\t// +optional\n\tVersions []string `json:\"versions,omitempty\"`\n\t// Resource is the API resource to check for given an API group and a slice of versions.\n\t// Specifying a Resource requires at least one version to be specified in Versions.\n\t// +optional\n\tResource string `json:\"resource,omitempty\"`\n}\n\n// QueryPartialSchema queries for any OpenAPI schema that may exist on a cluster.\ntype QueryPartialSchema struct {\n\t// Name is the unique name of the query.\n\t// +kubebuilder:validation:Required\n\t// +kubebuilder:validation:MinLength:=1\n\tName string `json:\"name\"`\n\t// PartialSchema is the partial OpenAPI schema that will be matched in a cluster.\n\t// +kubebuilder:validation:Required\n\t// +kubebuilder:validation:MinLength:=1\n\tPartialSchema string `json:\"partialSchema\"`\n}\n\n// CapabilityStatus defines the observed state of Capability\ntype CapabilityStatus struct {\n\t// Results represents the results of all the queries specified in the spec.\n\t// +listType=map\n\t// +listMapKey=name\n\tResults []Result `json:\"results\"`\n}\n\n// QueryResult represents the result of a single query.\ntype QueryResult struct {\n\t// Name is the name of the query in spec whose result this struct represents.\n\t// +kubebuilder:validation:Required\n\t// +kubebuilder:validation:MinLength:=1\n\tName string `json:\"name\"`\n\t// Found is a boolean which indicates if the query condition succeeded.\n\t// +optional\n\tFound bool `json:\"found\"`\n\t// Error indicates if an error occurred while processing the query.\n\t// +optional\n\tError bool `json:\"error,omitempty\"`\n\t// ErrorDetail represents the error detail, if an error occurred.\n\t// +optional\n\tErrorDetail string `json:\"errorDetail,omitempty\"`\n\t// NotFoundReason provides the reason if the query condition fails.\n\t// This is non-empty when Found is false.\n\t// +optional\n\tNotFoundReason string `json:\"notFoundReason,omitempty\"`\n}\n\n// Result represents the results of queries in Query.\ntype Result struct {\n\t// Name is the unique name of the query.\n\t// +kubebuilder:validation:Required\n\t// +kubebuilder:validation:MinLength:=1\n\tName string `json:\"name\"`\n\t// GroupVersionResources represents results of GVR queries in spec.\n\t// +listType=map\n\t// +listMapKey=name\n\t// +optional\n\tGroupVersionResources []QueryResult `json:\"groupVersionResources,omitempty\"`\n\t// Objects represents results of Object queries in spec.\n\t// +listType=map\n\t// +listMapKey=name\n\t// +optional\n\tObjects []QueryResult `json:\"objects,omitempty\"`\n\t// PartialSchemas represents results of PartialSchema queries in spec.\n\t// +listType=map\n\t// +listMapKey=name\n\t// +optional\n\tPartialSchemas []QueryResult `json:\"partialSchemas,omitempty\"`\n}\n\n//+kubebuilder:object:root=true\n//+kubebuilder:subresource:status\n//+kubebuilder:storageversion\n\n// Capability is the Schema for the capabilities API\ntype Capability struct {\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\t// Spec is the capability spec that has cluster queries.\n\tSpec CapabilitySpec `json:\"spec,omitempty\"`\n\t// Status is the capability status that has results of cluster queries.\n\tStatus CapabilityStatus `json:\"status,omitempty\"`\n}\n\n//+kubebuilder:object:root=true\n\n// CapabilityList contains a list of Capability\ntype CapabilityList struct {\n\tmetav1.TypeMeta `json:\",inline\"`\n\tmetav1.ListMeta `json:\"metadata,omitempty\"`\n\tItems           []Capability `json:\"items\"`\n}\n\nfunc init() {\n\tSchemeBuilder.Register(&Capability{}, &CapabilityList{})\n}\n"
  },
  {
    "path": "apis/core/v1alpha2/feature_stability_policies.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage v1alpha2\n\n// Policy represents Stability level policy\ntype Policy struct {\n\t// DefaultActivation is the default activation state of the Feature. When a new Feature resource is added to the\n\t// cluster, the state of that Feature is expected to be in the default activation state defined by the stability\n\t// level that Feature uses.\n\tDefaultActivation bool\n\t// Immutable defines the Feature state immutability. When set to true for a stability level, the Feature with that\n\t// stability level cannot be toggled.\n\tImmutable bool\n\t// VoidsWarranty is for defining the warranty support for the environment where a Feature with that stability level\n\t// is activated. When set to true, activating the Feature using that stability level will void the warranty for that\n\t// environment.\n\tVoidsWarranty bool\n\t// Discoverable is for defining the Feature discoverability. When set to true, the Feature with that stability level\n\t// is discoverable\n\tDiscoverable bool\n}\n\n// StabilityPolicies is map that holds the policies for different stability levels\nvar StabilityPolicies = map[StabilityLevel]Policy{\n\tWorkInProgress: {\n\t\tDefaultActivation: false,\n\t\tImmutable:         false,\n\t\tVoidsWarranty:     true,\n\t\tDiscoverable:      false,\n\t},\n\tExperimental: {\n\t\tDefaultActivation: false,\n\t\tImmutable:         false,\n\t\tVoidsWarranty:     true,\n\t\tDiscoverable:      true,\n\t},\n\tTechnicalPreview: {\n\t\tDefaultActivation: false,\n\t\tImmutable:         false,\n\t\tVoidsWarranty:     false,\n\t\tDiscoverable:      true,\n\t},\n\tStable: {\n\t\tDefaultActivation: true,\n\t\tImmutable:         true,\n\t\tVoidsWarranty:     false,\n\t\tDiscoverable:      true,\n\t},\n\tDeprecated: {\n\t\tDefaultActivation: true,\n\t\tImmutable:         false,\n\t\tVoidsWarranty:     false,\n\t\tDiscoverable:      true,\n\t},\n}\n\n// GetPolicyForStabilityLevel returns policy for stability level\nfunc GetPolicyForStabilityLevel(stability StabilityLevel) Policy {\n\treturn StabilityPolicies[stability]\n}\n"
  },
  {
    "path": "apis/core/v1alpha2/feature_types.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage v1alpha2\n\nimport (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n)\n\n// StabilityLevel indicates stability level of the feature.\ntype StabilityLevel string\n\nconst (\n\tWorkInProgress   StabilityLevel = \"Work In Progress\"\n\tExperimental     StabilityLevel = \"Experimental\"\n\tTechnicalPreview StabilityLevel = \"Technical Preview\"\n\tStable           StabilityLevel = \"Stable\"\n\tDeprecated       StabilityLevel = \"Deprecated\"\n)\n\n// FeatureSpec defines the desired state of Feature\ntype FeatureSpec struct {\n\t// Description of the feature.\n\tDescription string `json:\"description\"`\n\t// Stability indicates stability level of the feature.\n\t// Stability levels are Work In Progress, Experimental, Technical Preview, Stable and Deprecated.\n\t// +kubebuilder:validation:Enum=Work In Progress;Experimental;Technical Preview;Stable;Deprecated\n\t// - Work In Progress: Feature is still under development. It is not ready to be used, except by the team working on it. Activating this feature is not recommended under any circumstances.\n\t// - Experimental: Feature is not ready, but may be used in pre-production environments. However, if an experimental feature has ever been used in an environment, that environment will not be supported. Activating an experimental feature requires you to permanently, irrevocably void all support guarantees for this environment by setting permanentlyVoidAllSupportGuarantees in feature reference in featuregate spec to true. You will need to recreate the environment to return to a supported state.\n\t// - Technical Preview: Feature is not ready, but is not believed to be dangerous. The feature itself is unsupported, but activating a technical preview feature does not affect the support status of the environment.\n\t// - Stable: Feature is ready and fully supported\n\t// - Deprecated: Feature is destined for removal, usage is discouraged. Deactivate this feature prior to upgrading to a release which has removed it to validate that you are not still using it and to prevent users from introducing new usage of it.\n\tStability StabilityLevel `json:\"stability\"`\n}\n\n// FeatureStatus defines the observed state of Feature\ntype FeatureStatus struct {\n\t// Activated is a boolean which indicates whether a feature is activated or not.\n\tActivated bool `json:\"activated\"`\n}\n\n// Feature is the Schema for the features API\n// +kubebuilder:object:root=true\n// +kubebuilder:resource:scope=Cluster\n// +kubebuilder:storageversion\n// +kubebuilder:printcolumn:name=\"Description\",type=string,JSONPath=.spec.description\n// +kubebuilder:printcolumn:name=\"Stability\",type=string,JSONPath=.spec.stability\n// +kubebuilder:printcolumn:name=\"Activated?\",type=string,JSONPath=.status.activated\ntype Feature struct {\n\tStatus            FeatureStatus `json:\"status,omitempty\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\tSpec              FeatureSpec `json:\"spec,omitempty\"`\n\tmetav1.TypeMeta   `json:\",inline\"`\n}\n\n// +kubebuilder:object:root=true\n\n// FeatureList contains a list of Feature\ntype FeatureList struct {\n\tmetav1.TypeMeta `json:\",inline\"`\n\tmetav1.ListMeta `json:\"metadata,omitempty\"`\n\tItems           []Feature `json:\"items\"`\n}\n\nfunc init() {\n\tSchemeBuilder.Register(&Feature{}, &FeatureList{})\n}\n"
  },
  {
    "path": "apis/core/v1alpha2/featuregate_types.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage v1alpha2\n\nimport (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n)\n\n// FeatureReference refers to a Feature resource and specifies its intended activation state.\ntype FeatureReference struct {\n\t// Name is the name of the Feature resource, which represents a feature the system offers.\n\t// +kubebuilder:validation:Required\n\tName string `json:\"name\"`\n\t// Activate indicates the activation intent for the feature.\n\tActivate bool `json:\"activate,omitempty\"`\n\t// PermanentlyVoidAllSupportGuarantees when set to true permanently voids all support guarantees.\n\t// Once set to true, cannot be set back to false\n\tPermanentlyVoidAllSupportGuarantees bool `json:\"permanentlyVoidAllSupportGuarantees,omitempty\"`\n}\n\n// FeatureGateSpec defines the desired state of FeatureGate\ntype FeatureGateSpec struct {\n\t// Features is a slice of FeatureReference to gate features.\n\t// Feature controller sets the specified activation state only if the Feature policy is satisfied.\n\t// +listType=map\n\t// +listMapKey=name\n\tFeatures []FeatureReference `json:\"features,omitempty\"`\n}\n\n// FeatureGateStatus defines the observed state of FeatureGate\ntype FeatureGateStatus struct {\n\t// FeatureReferenceResult represents the results of all the features specified in the FeatureGate spec.\n\t// +listType=map\n\t// +listMapKey=name\n\tFeatureReferenceResults []FeatureReferenceResult `json:\"featureReferenceResults\"`\n}\n\n// FeatureReferenceStatus represents the status of the feature reference in the FeatureGate spec\ntype FeatureReferenceStatus string\n\nconst (\n\tAppliedReferenceStatus FeatureReferenceStatus = \"Applied\"\n\tInvalidReferenceStatus FeatureReferenceStatus = \"Invalid\"\n)\n\n// FeatureReferenceResult represents the result of FeatureReference.\ntype FeatureReferenceResult struct {\n\t// Name is the name of the feature.\n\t// +kubebuilder:validation:Required\n\t// +kubebuilder:validation:MinLength:=1\n\tName string `json:\"name\"`\n\t// Status represents the outcome of the feature reference operation specified in the FeatureGate spec\n\t// +kubebuilder:validation:Required\n\t// +kubebuilder:validation:Enum=Applied;Invalid\n\t// - Applied: represents feature toggle has been successfully applied.\n\t// - Invalid: represents that the intended state of the feature is invalid.\n\tStatus FeatureReferenceStatus `json:\"status\"`\n\t// Message represents the reason for status\n\t// +optional\n\tMessage string `json:\"message,omitempty\"`\n}\n\n// +kubebuilder:object:root=true\n// +kubebuilder:subresource:status\n// +kubebuilder:resource:scope=Cluster\n// +kubebuilder:storageversion\n\n// FeatureGate is the Schema for the featuregates API\ntype FeatureGate struct {\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\n\t// Spec is the specification for gating features.\n\tSpec FeatureGateSpec `json:\"spec,omitempty\"`\n\t// Status reports activation state and availability of features in the system.\n\tStatus FeatureGateStatus `json:\"status,omitempty\"`\n}\n\n// +kubebuilder:object:root=true\n\n// FeatureGateList contains a list of FeatureGate\ntype FeatureGateList struct {\n\tmetav1.TypeMeta `json:\",inline\"`\n\tmetav1.ListMeta `json:\"metadata,omitempty\"`\n\tItems           []FeatureGate `json:\"items\"`\n}\n\nfunc init() {\n\tSchemeBuilder.Register(&FeatureGate{}, &FeatureGateList{})\n}\n"
  },
  {
    "path": "apis/core/v1alpha2/featuregate_webhook.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage v1alpha2\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"reflect\"\n\n\tapierrors \"k8s.io/apimachinery/pkg/api/errors\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"k8s.io/apimachinery/pkg/util/sets\"\n\t\"k8s.io/apimachinery/pkg/util/validation/field\"\n\tk8sscheme \"k8s.io/client-go/kubernetes/scheme\"\n\tctrl \"sigs.k8s.io/controller-runtime\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client/config\"\n\tlogf \"sigs.k8s.io/controller-runtime/pkg/log\"\n\t\"sigs.k8s.io/controller-runtime/pkg/webhook\"\n)\n\n// log is for logging in this package.\nvar featuregatelog = logf.Log.WithName(\"featuregate-resource\").WithValues(\"apigroup\", \"core\")\n\nvar cl client.Client\n\nfunc getScheme() (*runtime.Scheme, error) {\n\ts, err := SchemeBuilder.Build()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif err := k8sscheme.AddToScheme(s); err != nil {\n\t\treturn nil, err\n\t}\n\treturn s, nil\n}\n\n// Get a cached client.\nfunc (r *FeatureGate) getClient() (client.Client, error) {\n\tif cl != nil && !reflect.ValueOf(cl).IsNil() {\n\t\treturn cl, nil\n\t}\n\n\ts, err := getScheme()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tcfg, err := config.GetConfig()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn client.New(cfg, client.Options{Scheme: s})\n}\n\n// SetupWebhookWithManager adds the webhook to the manager.\nfunc (r *FeatureGate) SetupWebhookWithManager(mgr ctrl.Manager) error {\n\ts, err := getScheme()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tcl, err = client.New(mgr.GetConfig(), client.Options{Scheme: s})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn ctrl.NewWebhookManagedBy(mgr).\n\t\tFor(r).\n\t\tComplete()\n}\n\n//+kubebuilder:webhook:verbs=create;update,path=/validate-core-tanzu-vmware-com-v1alpha2-featuregate,mutating=false,failurePolicy=fail,groups=core.tanzu.vmware.com,resources=featuregates,versions=v1alpha2,name=vfeaturegate.kb.io\n\nvar _ webhook.Validator = &FeatureGate{}\n\n// ValidateCreate implements webhook.Validator so a webhook will be registered for the type\nfunc (r *FeatureGate) ValidateCreate() error {\n\tfeaturegatelog.Info(\"validate create\", \"name\", r.Name)\n\n\tctx := context.Background()\n\tvar allErrors field.ErrorList\n\n\tc, err := r.getClient()\n\tif err != nil {\n\t\treturn apierrors.NewInternalError(err)\n\t}\n\n\tallErrors = append(allErrors, r.validateFeatureExists(ctx, c)...)\n\tallErrors = append(allErrors, r.validateConflictingFeaturesInFeatureGate(ctx, c)...)\n\tallErrors = append(allErrors, r.validateFeatureForStabilityPolicyViolation(ctx, c)...)\n\tif len(allErrors) == 0 {\n\t\treturn nil\n\t}\n\n\treturn apierrors.NewInvalid(GroupVersion.WithKind(\"FeatureGate\").GroupKind(), r.Name, allErrors)\n}\n\n// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type\nfunc (r *FeatureGate) ValidateUpdate(old runtime.Object) error {\n\tfeaturegatelog.Info(\"validate update\", \"name\", r.Name)\n\n\toldObj, ok := old.(*FeatureGate)\n\tif !ok {\n\t\treturn apierrors.NewBadRequest(fmt.Sprintf(\"expected FeatureGate object, but got object of type %T\", old))\n\t}\n\tif oldObj == nil {\n\t\treturn nil\n\t}\n\n\tc, err := r.getClient()\n\tif err != nil {\n\t\treturn apierrors.NewInternalError(err)\n\t}\n\n\tctx := context.Background()\n\tvar allErrors field.ErrorList\n\n\tallErrors = append(allErrors, r.validateFeatureExists(ctx, c)...)\n\tallErrors = append(allErrors, r.validateConflictingFeaturesInFeatureGate(ctx, c)...)\n\tallErrors = append(allErrors, r.validateWarrantyVoidOverride(oldObj)...)\n\tallErrors = append(allErrors, r.validateFeatureForStabilityPolicyViolation(ctx, c)...)\n\n\tif len(allErrors) == 0 {\n\t\treturn nil\n\t}\n\treturn apierrors.NewInvalid(GroupVersion.WithKind(\"FeatureGate\").GroupKind(), r.Name, allErrors)\n}\n\n// ValidateDelete implements webhook.Validator so a webhook will be registered for the type\nfunc (r *FeatureGate) ValidateDelete() error {\n\tfeaturegatelog.Info(\"validate delete\", \"name\", r.Name)\n\treturn nil\n}\n\n// validateFeatureForStabilityPolicyViolation validates features for any stability policy violation in a FeatureGate\n// resource\nfunc (r *FeatureGate) validateFeatureForStabilityPolicyViolation(ctx context.Context, c client.Client) field.ErrorList {\n\tvar allErrors field.ErrorList\n\n\tfeatures := &FeatureList{}\n\tif err := c.List(ctx, features); err != nil {\n\t\tallErrors = append(allErrors, field.InternalError(field.NewPath(\"spec\").Child(\"features\"), err))\n\t\treturn allErrors\n\t}\n\n\tfeaturesThatVoidWarranty := computeFeaturesThatVoidSupportWarranty(r.Spec, features)\n\timmutableFeatures := computeImmutableFeatures(r.Spec, features)\n\n\tif len(featuresThatVoidWarranty) > 0 {\n\t\tallErrors = append(allErrors, field.Invalid(field.NewPath(\"spec\").Child(\"features\"),\n\t\t\tr.Spec.Features, fmt.Sprintf(\"cannot toggle features %v as the the stability level of the \"+\n\t\t\t\t\"features indicate that it should not be activated in production environments. To activate the \"+\n\t\t\t\t\"feature, you must agree to permanently void all support guarantees for this environment by setting \"+\n\t\t\t\t\"featureRef.permanentlyVoidAllSupportGuarantees to true\", featuresThatVoidWarranty)))\n\t}\n\n\tif len(immutableFeatures) > 0 {\n\t\tallErrors = append(allErrors, field.Invalid(field.NewPath(\"spec\").Child(\"features\"),\n\t\t\tr.Spec.Features, fmt.Sprintf(\"cannot toggle immutable features: %v\", immutableFeatures)))\n\t}\n\n\treturn allErrors\n}\n\n// computeFeaturesThatVoidSupportWarranty computes and returns features that voids the support warranty in a FeatureGate\n// resource spec\nfunc computeFeaturesThatVoidSupportWarranty(spec FeatureGateSpec, features *FeatureList) []string {\n\tinvalidFeatures := sets.String{}\n\tfor _, featureRef := range spec.Features {\n\t\tstabilityLevel, found := getFeatureStabilityLevel(features, featureRef.Name)\n\t\tif !found {\n\t\t\t// Feature doesn't exist and is validated in validateFeatureExistence method\n\t\t\tcontinue\n\t\t}\n\t\tpolicy := GetPolicyForStabilityLevel(stabilityLevel)\n\t\t// checks for invalid features that voids warranty of the environment when activating it, ie if the intent for\n\t\t// the feature is different from default feature state and the stability policy for the feature says it voids\n\t\t// warranty, then that feature is considered as invalid.\n\t\tif policy.VoidsWarranty && !featureRef.PermanentlyVoidAllSupportGuarantees &&\n\t\t\tpolicy.DefaultActivation != featureRef.Activate {\n\t\t\tinvalidFeatures.Insert(featureRef.Name)\n\t\t}\n\t}\n\treturn invalidFeatures.List()\n}\n\n// computeImmutableFeatures computes and returns features that are immutable in a FeatureGate resource spec\nfunc computeImmutableFeatures(spec FeatureGateSpec, features *FeatureList) []string {\n\tinvalidFeatures := sets.String{}\n\tfor _, featureRef := range spec.Features {\n\t\tstabilityLevel, found := getFeatureStabilityLevel(features, featureRef.Name)\n\t\tif !found {\n\t\t\t// Feature doesn't exist and is validated in validateFeatureExistence method\n\t\t\tcontinue\n\t\t}\n\t\tpolicy := GetPolicyForStabilityLevel(stabilityLevel)\n\t\tif policy.Immutable && policy.DefaultActivation != featureRef.Activate {\n\t\t\tinvalidFeatures.Insert(featureRef.Name)\n\t\t}\n\t}\n\treturn invalidFeatures.List()\n}\n\n// validateWarrantyVoidOverride determines if permanentlyVoidAllSupportGuarantees field for a feature in FeatureGate\n// resource is set to false after setting it to true initially\nfunc (r *FeatureGate) validateWarrantyVoidOverride(oldObject *FeatureGate) field.ErrorList {\n\tvar allErrors field.ErrorList\n\n\tinvalidFeatures := computeFeaturesThatOverridedWarranyVoidOverride(r.Spec, oldObject)\n\tif len(invalidFeatures) > 0 {\n\t\tallErrors = append(allErrors, field.Invalid(field.NewPath(\"spec\").Child(\"features\"),\n\t\t\tr.Spec.Features, fmt.Sprintf(\"cannot toggle features due to policy violation: %v.\"+\n\t\t\t\t\"Set feature.skipStabilityPolicyValidation to true to override policy.\"+\n\t\t\t\t\"Once set to true, cannot be set back to false.\", invalidFeatures)))\n\t}\n\treturn allErrors\n}\n\n// computeFeaturesThatOverridedWarranyVoidOverride computes and returns features that have overrided the warranty void\n// override in FeatureGate resource\nfunc computeFeaturesThatOverridedWarranyVoidOverride(spec FeatureGateSpec, oldObject *FeatureGate) []string {\n\tinvalidFeatures := sets.String{}\n\tfor _, featureRef := range spec.Features {\n\t\tpermanentlyVoidAllSupportGuaranteesFieldFromOldObj, found :=\n\t\t\tgetPermanentlyVoidAllSupportGuaranteesFieldForFeature(oldObject, featureRef.Name)\n\t\tif !found {\n\t\t\t// Feature doesn't exist in old object and need not be validated\n\t\t\tcontinue\n\t\t}\n\t\tif !featureRef.PermanentlyVoidAllSupportGuarantees && permanentlyVoidAllSupportGuaranteesFieldFromOldObj {\n\t\t\tinvalidFeatures.Insert(featureRef.Name)\n\t\t}\n\t}\n\treturn invalidFeatures.List()\n}\n\n// validateFeatureExists checks if features that are part of FeatureGate resource exist in the cluster\nfunc (r *FeatureGate) validateFeatureExists(ctx context.Context, c client.Client) field.ErrorList {\n\tvar allErrors field.ErrorList\n\n\tfeatures := &FeatureList{}\n\tif err := c.List(ctx, features); err != nil {\n\t\tallErrors = append(allErrors, field.InternalError(field.NewPath(\"spec\").Child(\"features\"), err))\n\t\treturn allErrors\n\t}\n\n\tinvalidFeatures := computeFeaturesThatDoNotExist(r.Spec, features)\n\n\tif len(invalidFeatures) > 0 {\n\t\tallErrors = append(allErrors, field.Invalid(field.NewPath(\"spec\").Child(\"features\"),\n\t\t\tr.Spec.Features,\n\t\t\tfmt.Sprintf(\"some features in the FeatureGate spec do not exist in cluster: %v\", invalidFeatures)))\n\t}\n\treturn allErrors\n}\n\n// computeFeaturesThatDoNotExist computes and returns features that do not exist in cluster and are part of FeatureGate\n// resource spec\nfunc computeFeaturesThatDoNotExist(spec FeatureGateSpec, features *FeatureList) []string {\n\tallFeaturesInSpec := sets.String{}\n\tfor _, feature := range spec.Features {\n\t\tallFeaturesInSpec.Insert(feature.Name)\n\t}\n\n\tallFeaturesInCluster := sets.String{}\n\tfor i := range features.Items {\n\t\tallFeaturesInCluster.Insert(features.Items[i].Name)\n\t}\n\tinvalidFeatures := allFeaturesInSpec.Difference(allFeaturesInCluster)\n\treturn invalidFeatures.List()\n}\n\n// validateConflictingFeaturesInFeatureGate validates that the features in FeatureGate resource does not conflict\n// with features gated by other FeatureGate resources.\nfunc (r *FeatureGate) validateConflictingFeaturesInFeatureGate(ctx context.Context, c client.Client) field.ErrorList {\n\tvar allErrors field.ErrorList\n\n\tfeatureGates := &FeatureGateList{}\n\tif err := c.List(ctx, featureGates); err != nil {\n\t\tallErrors = append(allErrors, field.InternalError(field.NewPath(\"spec\").Child(\"features\"), err))\n\t\treturn allErrors\n\t}\n\n\tconflicts := computeConflictingFeatures(r, featureGates)\n\n\tif len(conflicts) > 0 {\n\t\tallErrors = append(allErrors, field.Invalid(field.NewPath(\"spec\").Child(\"features\"),\n\t\t\tr.Spec.Features, fmt.Sprintf(\"features %v cannot be gated by multiple featuregates\", conflicts)))\n\t}\n\treturn allErrors\n}\n\n// computeConflictingFeatures computes and returns features in FeatureGate resource that conflict with features in\n// other FeatureGate resources\nfunc computeConflictingFeatures(featureGate *FeatureGate, featureGates *FeatureGateList) []string {\n\tallFeaturesInSpec := sets.String{}\n\n\tfor _, feature := range featureGate.Spec.Features {\n\t\tallFeaturesInSpec.Insert(feature.Name)\n\t}\n\n\t// Gather all the gated features in the cluster\n\tallGatedFeaturesInCluster := sets.String{}\n\tfor i := range featureGates.Items {\n\t\tfg := featureGates.Items[i]\n\t\t// Skip comparing the object to itself during updates.\n\t\tif fg.Name == featureGate.Name {\n\t\t\tcontinue\n\t\t}\n\t\tfor _, feat := range fg.Spec.Features {\n\t\t\tallGatedFeaturesInCluster.Insert(feat.Name)\n\t\t}\n\t}\n\n\t// Intersection gives us the features that are already being gated by other FeatureGate resources\n\tconflicts := allGatedFeaturesInCluster.Intersection(allFeaturesInSpec)\n\treturn conflicts.List()\n}\n\n// getPermanentlyVoidAllSupportGuaranteesFieldForFeature returns permanentlyVoidAllSupportGuarantees field's value\n// for a feature from the FeatureGate resource\nfunc getPermanentlyVoidAllSupportGuaranteesFieldForFeature(featureGate *FeatureGate, featureName string) (bool, bool) {\n\tfor _, featureRef := range featureGate.Spec.Features {\n\t\tif featureRef.Name == featureName {\n\t\t\treturn featureRef.PermanentlyVoidAllSupportGuarantees, true\n\t\t}\n\t}\n\treturn false, false\n}\n\n// getFeatureStabilityLevel returns feature stability level for a feature from a list of Features\nfunc getFeatureStabilityLevel(list *FeatureList, featureName string) (StabilityLevel, bool) {\n\tfor i := range list.Items {\n\t\tfeature := list.Items[i]\n\t\tif featureName == feature.Name {\n\t\t\treturn feature.Spec.Stability, true\n\t\t}\n\t}\n\treturn \"\", false\n}\n"
  },
  {
    "path": "apis/core/v1alpha2/featuregate_webhook_test.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage v1alpha2\n\nimport (\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n)\n\nfunc TestComputeFeaturesThatVoidSupportWarranty(t *testing.T) {\n\ttestCases := []struct {\n\t\tdescription     string\n\t\tfeatureList     *FeatureList\n\t\tfeatureGateSpec FeatureGateSpec\n\t\twant            []string\n\t}{\n\t\t{\n\t\t\tdescription: \"Multiple features in featuregate void support warranty\",\n\t\t\tfeatureList: &FeatureList{\n\t\t\t\tItems: []Feature{\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"foo\"}, Spec: FeatureSpec{Description: \"foo\", Stability: \"Experimental\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"bar\"}, Spec: FeatureSpec{Description: \"bar\", Stability: \"Experimental\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"baz\"}, Spec: FeatureSpec{Description: \"baz\", Stability: \"Technical Preview\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"bax\"}, Spec: FeatureSpec{Description: \"bax\", Stability: \"Stable\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"qux\"}, Spec: FeatureSpec{Description: \"qux\", Stability: \"Experimental\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"quux\"}, Spec: FeatureSpec{Description: \"quux\", Stability: \"Stable\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"corge\"}, Spec: FeatureSpec{Description: \"corge\", Stability: \"Experimental\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"grault\"}, Spec: FeatureSpec{Description: \"grault\", Stability: \"Stable\"}},\n\t\t\t\t},\n\t\t\t},\n\t\t\tfeatureGateSpec: FeatureGateSpec{\n\t\t\t\tFeatures: []FeatureReference{\n\t\t\t\t\t// voids warranty and violates policy\n\t\t\t\t\t{Name: \"foo\", Activate: true},\n\t\t\t\t\t// voids warranty and violates policy\n\t\t\t\t\t{Name: \"bar\", Activate: true},\n\t\t\t\t\t// Doesn't void warranty\n\t\t\t\t\t{Name: \"baz\", Activate: true},\n\t\t\t\t\t// Doesn't violate policy\n\t\t\t\t\t{Name: \"bax\", Activate: true},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: []string{\"foo\", \"bar\"},\n\t\t},\n\t\t{\n\t\t\tdescription: \"No features in featuregate void support warranty\",\n\t\t\tfeatureList: &FeatureList{\n\t\t\t\tItems: []Feature{\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"foo\"}, Spec: FeatureSpec{Description: \"foo\", Stability: \"Experimental\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"bar\"}, Spec: FeatureSpec{Description: \"bar\", Stability: \"Experimental\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"baz\"}, Spec: FeatureSpec{Description: \"baz\", Stability: \"Technical Preview\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"bax\"}, Spec: FeatureSpec{Description: \"bax\", Stability: \"Stable\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"qux\"}, Spec: FeatureSpec{Description: \"qux\", Stability: \"Experimental\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"quux\"}, Spec: FeatureSpec{Description: \"quux\", Stability: \"Stable\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"corge\"}, Spec: FeatureSpec{Description: \"corge\", Stability: \"Experimental\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"grault\"}, Spec: FeatureSpec{Description: \"grault\", Stability: \"Stable\"}},\n\t\t\t\t},\n\t\t\t},\n\t\t\tfeatureGateSpec: FeatureGateSpec{\n\t\t\t\tFeatures: []FeatureReference{\n\t\t\t\t\t{Name: \"bax\", Activate: true},\n\t\t\t\t\t{Name: \"quux\", Activate: true},\n\t\t\t\t\t{Name: \"grault\", Activate: true},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: []string{},\n\t\t},\n\t}\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tgot := computeFeaturesThatVoidSupportWarranty(tc.featureGateSpec, tc.featureList)\n\t\t\tif diff := sliceDiffIgnoreOrder(got, tc.want); diff != \"\" {\n\t\t\t\tt.Errorf(\"got invalid features %v, want %v, diff: %s\", got, tc.want, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestComputeImmutableFeatures(t *testing.T) {\n\ttestCases := []struct {\n\t\tdescription     string\n\t\tfeatureList     *FeatureList\n\t\tfeatureGateSpec FeatureGateSpec\n\t\twant            []string\n\t}{\n\t\t{\n\t\t\tdescription: \"Multiple features in featuregate are immutable\",\n\t\t\tfeatureList: &FeatureList{\n\t\t\t\tItems: []Feature{\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"foo\"}, Spec: FeatureSpec{Description: \"foo\", Stability: \"Stable\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"bar\"}, Spec: FeatureSpec{Description: \"bar\", Stability: \"Experimental\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"baz\"}, Spec: FeatureSpec{Description: \"baz\", Stability: \"Technical Preview\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"bax\"}, Spec: FeatureSpec{Description: \"bax\", Stability: \"Stable\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"qux\"}, Spec: FeatureSpec{Description: \"qux\", Stability: \"Experimental\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"quux\"}, Spec: FeatureSpec{Description: \"quux\", Stability: \"Stable\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"corge\"}, Spec: FeatureSpec{Description: \"corge\", Stability: \"Experimental\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"grault\"}, Spec: FeatureSpec{Description: \"grault\", Stability: \"Stable\"}},\n\t\t\t\t},\n\t\t\t},\n\t\t\tfeatureGateSpec: FeatureGateSpec{\n\t\t\t\tFeatures: []FeatureReference{\n\t\t\t\t\t// immutable and cannot be toggled\n\t\t\t\t\t{Name: \"foo\", Activate: false},\n\t\t\t\t\t// immutable and cannot be toggled\n\t\t\t\t\t{Name: \"bax\", Activate: false},\n\t\t\t\t\t// immutable, but set to default activation state\n\t\t\t\t\t{Name: \"quux\", Activate: true},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: []string{\"foo\", \"bax\"},\n\t\t},\n\t\t{\n\t\t\tdescription: \"No features in featuregate are immutable\",\n\t\t\tfeatureList: &FeatureList{\n\t\t\t\tItems: []Feature{\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"foo\"}, Spec: FeatureSpec{Description: \"foo\", Stability: \"Stable\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"bar\"}, Spec: FeatureSpec{Description: \"bar\", Stability: \"Experimental\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"baz\"}, Spec: FeatureSpec{Description: \"baz\", Stability: \"Technical Preview\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"bax\"}, Spec: FeatureSpec{Description: \"bax\", Stability: \"Stable\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"qux\"}, Spec: FeatureSpec{Description: \"qux\", Stability: \"Experimental\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"quux\"}, Spec: FeatureSpec{Description: \"quux\", Stability: \"Stable\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"corge\"}, Spec: FeatureSpec{Description: \"corge\", Stability: \"Experimental\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"grault\"}, Spec: FeatureSpec{Description: \"grault\", Stability: \"Stable\"}},\n\t\t\t\t},\n\t\t\t},\n\t\t\tfeatureGateSpec: FeatureGateSpec{\n\t\t\t\tFeatures: []FeatureReference{\n\t\t\t\t\t// immutable and cannot be toggled\n\t\t\t\t\t{Name: \"bar\", Activate: true},\n\t\t\t\t\t// immutable and cannot be toggled\n\t\t\t\t\t{Name: \"baz\", Activate: true},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: []string{},\n\t\t},\n\t}\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tgot := computeImmutableFeatures(tc.featureGateSpec, tc.featureList)\n\t\t\tif diff := sliceDiffIgnoreOrder(got, tc.want); diff != \"\" {\n\t\t\t\tt.Errorf(\"got invalid features %v, want %v, diff: %s\", got, tc.want, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestComputeInvalidStabilityPolicyOverridedFeatures(t *testing.T) {\n\ttestCases := []struct {\n\t\tdescription     string\n\t\tfeatureGateSpec FeatureGateSpec\n\t\toldFeatureGate  *FeatureGate\n\t\twant            []string\n\t}{\n\t\t{\n\t\t\tdescription: \"Multiple features in featuregate set PermanentlyVoidAllSupportGuarantees to false after setting it to true initially\",\n\t\t\tfeatureGateSpec: FeatureGateSpec{\n\t\t\t\tFeatures: []FeatureReference{\n\t\t\t\t\t{Name: \"foo\", Activate: false},\n\t\t\t\t\t{Name: \"bar\", Activate: true},\n\t\t\t\t\t{Name: \"baz\", Activate: true},\n\t\t\t\t},\n\t\t\t},\n\t\t\toldFeatureGate: &FeatureGate{\n\t\t\t\tTypeMeta:   metav1.TypeMeta{},\n\t\t\t\tObjectMeta: metav1.ObjectMeta{},\n\t\t\t\tSpec: FeatureGateSpec{\n\t\t\t\t\tFeatures: []FeatureReference{\n\t\t\t\t\t\t{Name: \"foo\", Activate: false},\n\t\t\t\t\t\t{Name: \"bar\", Activate: true, PermanentlyVoidAllSupportGuarantees: true},\n\t\t\t\t\t\t{Name: \"baz\", Activate: true, PermanentlyVoidAllSupportGuarantees: true},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: []string{\"bar\", \"baz\"},\n\t\t},\n\t\t{\n\t\t\tdescription: \"No features in featuregate set PermanentlyVoidAllSupportGuarantees to false after setting it to true initially\",\n\t\t\tfeatureGateSpec: FeatureGateSpec{\n\t\t\t\tFeatures: []FeatureReference{\n\t\t\t\t\t{Name: \"foo\", Activate: false},\n\t\t\t\t\t{Name: \"bar\", Activate: true},\n\t\t\t\t},\n\t\t\t},\n\t\t\toldFeatureGate: &FeatureGate{\n\t\t\t\tTypeMeta:   metav1.TypeMeta{},\n\t\t\t\tObjectMeta: metav1.ObjectMeta{},\n\t\t\t\tSpec: FeatureGateSpec{\n\t\t\t\t\tFeatures: []FeatureReference{\n\t\t\t\t\t\t{Name: \"foo\", Activate: false},\n\t\t\t\t\t\t{Name: \"bar\", Activate: true},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: []string{},\n\t\t},\n\t}\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tgot := computeFeaturesThatOverridedWarranyVoidOverride(tc.featureGateSpec, tc.oldFeatureGate)\n\t\t\tif diff := sliceDiffIgnoreOrder(got, tc.want); diff != \"\" {\n\t\t\t\tt.Errorf(\"got invalid features %v, want %v, diff: %s\", got, tc.want, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestComputeConflictingFeatures(t *testing.T) {\n\ttestCases := []struct {\n\t\tdescription     string\n\t\tfeatureGate     *FeatureGate\n\t\tfeatureGateList *FeatureGateList\n\t\twant            []string\n\t}{\n\t\t{\n\t\t\tdescription: \"Multiple conflicting features in featuregate\",\n\t\t\tfeatureGate: &FeatureGate{\n\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\tName: \"my-featuregate\",\n\t\t\t\t},\n\t\t\t\tSpec: FeatureGateSpec{\n\t\t\t\t\tFeatures: []FeatureReference{\n\t\t\t\t\t\t{Name: \"foo\", Activate: false},\n\t\t\t\t\t\t{Name: \"bar\", Activate: true},\n\t\t\t\t\t\t{Name: \"baz\", Activate: true},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tfeatureGateList: &FeatureGateList{\n\t\t\t\tTypeMeta: metav1.TypeMeta{},\n\t\t\t\tListMeta: metav1.ListMeta{},\n\t\t\t\tItems: []FeatureGate{\n\t\t\t\t\t{\n\t\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\t\tName: \"my-featuregate\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tSpec: FeatureGateSpec{\n\t\t\t\t\t\t\tFeatures: []FeatureReference{\n\t\t\t\t\t\t\t\t{Name: \"foo\", Activate: false},\n\t\t\t\t\t\t\t\t{Name: \"bar\", Activate: true},\n\t\t\t\t\t\t\t\t{Name: \"baz\", Activate: true},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\t\tName: \"my-other-featuregate\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tSpec: FeatureGateSpec{\n\t\t\t\t\t\t\tFeatures: []FeatureReference{\n\t\t\t\t\t\t\t\t{Name: \"foo\", Activate: false},\n\t\t\t\t\t\t\t\t{Name: \"bar\", Activate: true},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: []string{\"foo\", \"bar\"},\n\t\t},\n\t\t{\n\t\t\tdescription: \"No conflicting features in featuregate\",\n\t\t\tfeatureGate: &FeatureGate{\n\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\tName: \"my-featuregate\",\n\t\t\t\t},\n\t\t\t\tSpec: FeatureGateSpec{\n\t\t\t\t\tFeatures: []FeatureReference{\n\t\t\t\t\t\t{Name: \"foo\", Activate: false},\n\t\t\t\t\t\t{Name: \"bar\", Activate: true},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tfeatureGateList: &FeatureGateList{\n\t\t\t\tTypeMeta: metav1.TypeMeta{},\n\t\t\t\tListMeta: metav1.ListMeta{},\n\t\t\t\tItems: []FeatureGate{\n\t\t\t\t\t{\n\t\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\t\tName: \"my-featuregate\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tSpec: FeatureGateSpec{\n\t\t\t\t\t\t\tFeatures: []FeatureReference{\n\t\t\t\t\t\t\t\t{Name: \"foo\", Activate: false},\n\t\t\t\t\t\t\t\t{Name: \"bar\", Activate: true},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\t\tName: \"my-other-featuregate\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tSpec: FeatureGateSpec{\n\t\t\t\t\t\t\tFeatures: []FeatureReference{\n\t\t\t\t\t\t\t\t{Name: \"baz\", Activate: true},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: []string{},\n\t\t},\n\t}\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tgot := computeConflictingFeatures(tc.featureGate, tc.featureGateList)\n\t\t\tif diff := sliceDiffIgnoreOrder(got, tc.want); diff != \"\" {\n\t\t\t\tt.Errorf(\"got invalid features %v, want %v, diff: %s\", got, tc.want, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestComputeFeaturesThatDoNotExist(t *testing.T) {\n\ttestCases := []struct {\n\t\tdescription     string\n\t\tfeatureGateSpec FeatureGateSpec\n\t\tfeatureList     *FeatureList\n\t\twant            []string\n\t}{\n\t\t{\n\t\t\tdescription: \"Multiple features do not exist in cluster\",\n\t\t\tfeatureGateSpec: FeatureGateSpec{\n\t\t\t\tFeatures: []FeatureReference{\n\t\t\t\t\t{Name: \"foo\", Activate: false},\n\t\t\t\t\t{Name: \"bar\", Activate: true},\n\t\t\t\t\t{Name: \"baz\", Activate: true},\n\t\t\t\t},\n\t\t\t},\n\t\t\tfeatureList: &FeatureList{\n\t\t\t\tTypeMeta: metav1.TypeMeta{},\n\t\t\t\tListMeta: metav1.ListMeta{},\n\t\t\t\tItems: []Feature{\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"bar\"}, Spec: FeatureSpec{Description: \"bar\", Stability: \"Technical Preview\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"bax\"}, Spec: FeatureSpec{Description: \"bax\", Stability: \"Stable\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"qux\"}, Spec: FeatureSpec{Description: \"qux\", Stability: \"Stable\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"quux\"}, Spec: FeatureSpec{Description: \"one\", Stability: \"Stable\"}},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: []string{\"foo\", \"baz\"},\n\t\t},\n\t\t{\n\t\t\tdescription: \"All features exist in cluster\",\n\t\t\tfeatureGateSpec: FeatureGateSpec{\n\t\t\t\tFeatures: []FeatureReference{\n\t\t\t\t\t{Name: \"foo\", Activate: false},\n\t\t\t\t\t{Name: \"bar\", Activate: true},\n\t\t\t\t\t{Name: \"baz\", Activate: true},\n\t\t\t\t},\n\t\t\t},\n\t\t\tfeatureList: &FeatureList{\n\t\t\t\tTypeMeta: metav1.TypeMeta{},\n\t\t\t\tListMeta: metav1.ListMeta{},\n\t\t\t\tItems: []Feature{\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"foo\"}, Spec: FeatureSpec{Description: \"foo\", Stability: \"Technical Preview\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"bar\"}, Spec: FeatureSpec{Description: \"bar\", Stability: \"Stable\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"baz\"}, Spec: FeatureSpec{Description: \"baz\", Stability: \"Stable\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"bax\"}, Spec: FeatureSpec{Description: \"bax\", Stability: \"Stable\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"qux\"}, Spec: FeatureSpec{Description: \"qux\", Stability: \"Deprecated\"}},\n\t\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"quux\"}, Spec: FeatureSpec{Description: \"one\", Stability: \"Stable\"}},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: []string{},\n\t\t},\n\t}\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tgot := computeFeaturesThatDoNotExist(tc.featureGateSpec, tc.featureList)\n\t\t\tif diff := sliceDiffIgnoreOrder(got, tc.want); diff != \"\" {\n\t\t\t\tt.Errorf(\"got invalid features %v, want %v, diff: %s\", got, tc.want, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\n// sliceDiffIgnoreOrder returns a human-readable diff of two string slices.\n// Two slices are considered equal when they have the same length and same elements. The order of the elements is\n// ignored while comparing. Nil and empty slices are considered equal.\n//\n// This function is intended to be used in tests for comparing expected and actual values, and printing the diff for\n// users to debug:\n//\n//\tif diff := sliceDiffIgnoreOrder(got, want); diff != \"\" {\n//\t    t.Errorf(\"got: %v, want: %v, diff: %s\", got, want, diff)\n//\t}\nfunc sliceDiffIgnoreOrder(a, b []string) string {\n\treturn cmp.Diff(a, b, cmpopts.EquateEmpty(), cmpopts.SortSlices(func(x, y string) bool { return x < y }))\n}\n"
  },
  {
    "path": "apis/core/v1alpha2/groupversion_info.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package v1alpha2 contains API Schema definitions for the core v1alpha2 API group\n// +kubebuilder:object:generate=true\n// +groupName=core.tanzu.vmware.com\npackage v1alpha2\n\nimport (\n\t\"k8s.io/apimachinery/pkg/runtime/schema\"\n\t\"sigs.k8s.io/controller-runtime/pkg/scheme\"\n)\n\nvar (\n\t// GroupVersion is group version used to register these objects\n\tGroupVersion = schema.GroupVersion{Group: \"core.tanzu.vmware.com\", Version: \"v1alpha2\"}\n\n\t// SchemeBuilder is used to add go types to the GroupVersionKind scheme\n\tSchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion}\n\n\t// AddToScheme adds the types in this group-version to the given scheme.\n\tAddToScheme = SchemeBuilder.AddToScheme\n)\n"
  },
  {
    "path": "apis/core/v1alpha2/readiness_types.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage v1alpha2\n\nimport (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n)\n\n// ReadinessCheckType defines the current state of the provider\ntype ReadinessCheckType string\n\nconst (\n\t// BasicReadinessCheck depends directly on the ReadinessProviders to be ready\n\tBasicReadinessCheck = ReadinessCheckType(\"basic\")\n\n\t// CompositeReadinessCheck depends on other basic checks to be ready\n\tCompositeReadinessCheck = ReadinessCheckType(\"composite\")\n)\n\n// ReadinessSpec defines the desired state of Readiness\ntype ReadinessSpec struct {\n\t// Checks is the set of checks that are required to mark the readiness\n\tChecks []Check `json:\"checks\"`\n}\n\ntype Check struct {\n\t// Name is the name of the check\n\tName string `json:\"name\"`\n\n\t// Type is the type of the check. Type can be either basic or composite.\n\t// The basic checks depend on its providers to be ready.\n\t// The composite checks depend on the basic checks for their readiness.\n\t// +kubebuilder:validation:Enum=basic;composite\n\tType ReadinessCheckType `json:\"type\"`\n\n\t// Category is the category of the check. Examples of categories are availability and security.\n\tCategory string `json:\"category\"`\n}\n\n// ReadinessStatus defines the observed state of Readiness\ntype ReadinessStatus struct {\n\t// CheckStatus presents the status of check defined in the spec\n\tCheckStatus []CheckStatus `json:\"checkStatus\"`\n\n\t// Ready is the flag that denotes if the defined readiness is ready.\n\t// The readiness is marked ready if all the checks are satisfied.\n\tReady bool `json:\"ready\"`\n}\n\ntype CheckStatus struct {\n\t// Name is the name of the check\n\tName string `json:\"name\"`\n\n\t// Ready is the boolean flag indicating if the check is ready\n\tReady bool `json:\"status\"`\n\n\t// Providers is the list of providers available for the given check\n\tProviders []Provider `json:\"providers\"`\n}\n\ntype Provider struct {\n\t// Name is the name of the provider\n\tName string `json:\"name\"`\n\n\t// IsActive is the boolean flag indicating if the provider is active\n\tIsActive bool `json:\"isActive\"`\n}\n\n//+kubebuilder:object:root=true\n//+kubebuilder:subresource:status\n//+kubebuilder:resource:scope=Cluster\n//+kubebuilder:printcolumn:name=\"Ready\",type=boolean,JSONPath=`.status.ready`\n//+kubebuilder:printcolumn:name=\"Age\",type=date,JSONPath=`.metadata.creationTimestamp`\n\n// Readiness is the Schema for the readinesses API\ntype Readiness struct {\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\n\tSpec   ReadinessSpec   `json:\"spec,omitempty\"`\n\tStatus ReadinessStatus `json:\"status,omitempty\"`\n}\n\n//+kubebuilder:object:root=true\n\n// ReadinessList contains a list of Readiness\ntype ReadinessList struct {\n\tmetav1.TypeMeta `json:\",inline\"`\n\tmetav1.ListMeta `json:\"metadata,omitempty\"`\n\tItems           []Readiness `json:\"items\"`\n}\n\nfunc init() {\n\tSchemeBuilder.Register(&Readiness{}, &ReadinessList{})\n}\n"
  },
  {
    "path": "apis/core/v1alpha2/readinessprovider_types.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage v1alpha2\n\nimport (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n)\n\n// ReadinessProviderState defines the current state of the provider\ntype ReadinessProviderState string\n\nconst (\n\t// ProviderSuccessState is a ReadinessProviderState that denotes success state\n\tProviderSuccessState = ReadinessProviderState(\"success\")\n\n\t// ProviderFailureState is a ReadinessProviderState that denotes failure state\n\tProviderFailureState = ReadinessProviderState(\"failure\")\n\n\t// ProviderInProgressState is a ReadinessProviderState that denotes in-progress state\n\tProviderInProgressState = ReadinessProviderState(\"inprogress\")\n)\n\n// ReadinessConditionState defines the state of indvidual conditions in a readiness provider\ntype ReadinessConditionState string\n\nconst (\n\t// ConditionSuccessState is a ReadinessConditionState that denotes success state\n\tConditionSuccessState = ReadinessConditionState(\"success\")\n\n\t// ConditionFailureState is a ReadinessConditionState that denotes failure state\n\tConditionFailureState = ReadinessConditionState(\"failure\")\n\n\t// ConditionInProgressState is a ReadinessConditionState that denotes in-progress state\n\tConditionInProgressState = ReadinessConditionState(\"inprogress\")\n)\n\n// ReadinessProviderSpec defines the desired state of ReadinessProvider\ntype ReadinessProviderSpec struct {\n\t// CheckRefs contains names of the checks that the current provider satisfies\n\tCheckRefs []string `json:\"checkRefs\"`\n\n\t// Conditions is the set of checks that must be evaluated to true to mark the provider as ready\n\tConditions []ReadinessProviderCondition `json:\"conditions\"`\n\n\t// ServiceAccountRef represents the service account to be used\n\t// to make requests to the API server for evaluating conditions.\n\t// If not provided, it uses the default service account\n\t// of the readiness provider controller,\n\t// which may not have appropriate RBAC for evaluating conditions.\n\t//+kubebuilder:validation:Optional\n\tServiceAccountRef *ServiceAccountRef `json:\"serviceAccountRef\"`\n}\n\ntype ServiceAccountRef struct {\n\t// Namespace is the namespace containing the service account.\n\tNamespace string `json:\"namespace\"`\n\n\t// Name is the name of the service account to be used\n\t// to make requests to the API server for evaluating conditions.\n\tName string `json:\"name\"`\n}\n\n// ReadinessProviderCondition defines the readiness provider condition\ntype ReadinessProviderCondition struct {\n\t// Name is the name of the condition\n\tName string `json:\"name\"`\n\n\t// ResourceExistenceCondition is the condition that checks for the presence of a certain resource in the cluster\n\t//+kubebuilder:validation:Optional\n\tResourceExistenceCondition *ResourceExistenceCondition `json:\"resourceExistenceCondition\"`\n}\n\n// ResourceExistenceCondition is a type of readiness provider condition that checks for existence of given resource\ntype ResourceExistenceCondition struct {\n\t// APIVersion is the API version of the resource that is being checked.\n\t// This should be provided in <group>/<version> format.\n\t// More info: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#resources\n\tAPIVersion string `json:\"apiVersion\"`\n\n\t// Kind is the API kind of the resource that is being checked\n\t// More info: More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n\tKind string `json:\"kind\"`\n\n\t// Namespace is the namespace of the resource that is being checked; if the Namespace is nil,\n\t// the resource is assumed to be cluster scoped. Empty string for the namespace will throw error.\n\t//+kubebuilder:validation:Optional\n\tNamespace *string `json:\"namespace\"`\n\tName      string  `json:\"name\"`\n}\n\n// ReadinessProviderStatus defines the observed state of ReadinessProvider\ntype ReadinessProviderStatus struct {\n\t// State is the computed state of the provider. The state will be success if all the conditions pass;\n\t// The state will be failure if any of the conditions fail. Otherwise, the state will be in-progress.\n\t// +kubebuilder:validation:Enum=success;failure;inprogress\n\tState ReadinessProviderState `json:\"state\"`\n\n\t// Message provides information about the ReadinessProvider state\n\tMessage string `json:\"message\"`\n\n\t// Conditions is the set of ReadinessConditions that are being evaluated\n\tConditions []ReadinessConditionStatus `json:\"conditions\"`\n}\n\ntype ReadinessConditionStatus struct {\n\t// Name is the name of the readiness condition\n\tName string `json:\"name\"`\n\n\t// State is the computed state of the condition\n\t// +kubebuilder:validation:Enum=success;failure;inprogress\n\tState ReadinessConditionState `json:\"state\"`\n\n\t// Message is the field that provides information about the condition evaluation\n\tMessage string `json:\"message\"`\n}\n\n//+kubebuilder:object:root=true\n//+kubebuilder:subresource:status\n//+kubebuilder:resource:scope=Cluster\n//+kubebuilder:printcolumn:name=\"State\",type=string,JSONPath=`.status.state`\n//+kubebuilder:printcolumn:name=\"Checks\",priority=1,type=string,JSONPath=`.spec.checkRefs`\n//+kubebuilder:printcolumn:name=\"Age\",type=date,JSONPath=`.metadata.creationTimestamp`\n\n// ReadinessProvider is the Schema for the readinessproviders API\ntype ReadinessProvider struct {\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\n\tSpec   ReadinessProviderSpec   `json:\"spec,omitempty\"`\n\tStatus ReadinessProviderStatus `json:\"status,omitempty\"`\n}\n\n//+kubebuilder:object:root=true\n\n// ReadinessProviderList contains a list of ReadinessProvider\ntype ReadinessProviderList struct {\n\tmetav1.TypeMeta `json:\",inline\"`\n\tmetav1.ListMeta `json:\"metadata,omitempty\"`\n\tItems           []ReadinessProvider `json:\"items\"`\n}\n\nfunc init() {\n\tSchemeBuilder.Register(&ReadinessProvider{}, &ReadinessProviderList{})\n}\n"
  },
  {
    "path": "apis/core/v1alpha2/readinessprovider_webhook.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage v1alpha2\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"reflect\"\n\n\tcorev1 \"k8s.io/api/core/v1\"\n\tapierrors \"k8s.io/apimachinery/pkg/api/errors\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"k8s.io/apimachinery/pkg/util/validation/field\"\n\tctrl \"sigs.k8s.io/controller-runtime\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client/config\"\n\tlogf \"sigs.k8s.io/controller-runtime/pkg/log\"\n\t\"sigs.k8s.io/controller-runtime/pkg/webhook\"\n)\n\nvar (\n\t// log is for logging in this package.\n\treadinessproviderlog = logf.Log.WithName(\"readinessprovider-resource\").WithValues(\"apigroup\", \"core\")\n\t// kubeClient is the client used for making calls to the k8s API server.\n\tkubeClient client.Client\n)\n\n// SetupWebhookWithManager adds the webhook to the manager.\nfunc (r *ReadinessProvider) SetupWebhookWithManager(mgr ctrl.Manager) error {\n\ts, err := getScheme()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tkubeClient, err = client.New(mgr.GetConfig(), client.Options{Scheme: s})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn ctrl.NewWebhookManagedBy(mgr).\n\t\tFor(r).\n\t\tComplete()\n}\n\nvar _ webhook.Validator = &ReadinessProvider{}\n\n// Get a cached client.\nfunc (r *ReadinessProvider) getClient() (client.Client, error) {\n\tif kubeClient != nil && !reflect.ValueOf(kubeClient).IsNil() {\n\t\treturn kubeClient, nil\n\t}\n\n\ts, err := getScheme()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tcfg, err := config.GetConfig()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn client.New(cfg, client.Options{Scheme: s})\n}\n\n// ValidateCreate implements webhook.Validator so a webhook will be registered for the type\nfunc (r *ReadinessProvider) ValidateCreate() error {\n\treadinessproviderlog.Info(\"validate create\", \"name\", r.Name)\n\tctx := context.Background()\n\n\tc, err := r.getClient()\n\tif err != nil {\n\t\treturn apierrors.NewInternalError(err)\n\t}\n\n\treturn r.validateObject(ctx, c)\n}\n\n// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type\nfunc (r *ReadinessProvider) ValidateUpdate(_ runtime.Object) error {\n\treadinessproviderlog.Info(\"validate update\", \"name\", r.Name)\n\n\tctx := context.Background()\n\n\tc, err := r.getClient()\n\tif err != nil {\n\t\treturn apierrors.NewInternalError(err)\n\t}\n\n\treturn r.validateObject(ctx, c)\n}\n\n// ValidateDelete implements webhook.Validator so a webhook will be registered for the type\nfunc (r *ReadinessProvider) ValidateDelete() error {\n\treadinessproviderlog.Info(\"validate delete\", \"name\", r.Name)\n\treturn nil\n}\n\nfunc (r *ReadinessProvider) validateObject(ctx context.Context, k8sClient client.Client) error {\n\tvar allErrors field.ErrorList\n\tspecPath := field.NewPath(\"spec\")\n\n\tsaRef := r.Spec.ServiceAccountRef\n\tif saRef != nil {\n\t\tif saRef.Name == \"\" {\n\t\t\tallErrors = append(allErrors, field.Required(specPath.Child(\"serviceAccount\").Child(\"Name\"), \"missing required field\"))\n\t\t}\n\n\t\tif saRef.Namespace == \"\" {\n\t\t\tallErrors = append(allErrors, field.Required(specPath.Child(\"serviceAccount\").Child(\"Namespace\"), \"missing required field\"))\n\t\t}\n\t}\n\n\t// Checking if provided serviceaccount is valid\n\tif saRef != nil && len(allErrors) == 0 {\n\t\tsa := &corev1.ServiceAccount{}\n\t\treadinessproviderlog.Info(\"checking if service account is present\", \"source\", saRef)\n\t\terr := k8sClient.Get(ctx, client.ObjectKey{\n\t\t\tNamespace: saRef.Namespace,\n\t\t\tName:      saRef.Name,\n\t\t}, sa)\n\n\t\tif err != nil {\n\t\t\tallErrors = append(allErrors, field.Invalid(specPath.Child(\"serviceAccount\"), saRef, err.Error()))\n\t\t}\n\t}\n\n\t// Validate conditions\n\tfor _, condition := range r.Spec.Conditions {\n\t\tif condition.ResourceExistenceCondition == nil {\n\t\t\tallErrors = append(\n\t\t\t\tallErrors,\n\t\t\t\tfield.Invalid(\n\t\t\t\t\tspecPath.Child(\"conditions\"),\n\t\t\t\t\tr.Spec.Conditions, fmt.Sprintf(\"Expected condition %s to have exactly one type defined\", condition.Name)))\n\t\t}\n\t}\n\n\tif len(allErrors) == 0 {\n\t\treturn nil\n\t}\n\n\treturn apierrors.NewInvalid(GroupVersion.WithKind(\"ReadinessProvider\").GroupKind(), r.Name, allErrors)\n}\n"
  },
  {
    "path": "apis/core/v1alpha2/zz_generated.deepcopy.go",
    "content": "//go:build !ignore_autogenerated\n// +build !ignore_autogenerated\n\n// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Code generated by controller-gen. DO NOT EDIT.\n\npackage v1alpha2\n\nimport (\n\t\"k8s.io/apimachinery/pkg/runtime\"\n)\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Capability) DeepCopyInto(out *Capability) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ObjectMeta.DeepCopyInto(&out.ObjectMeta)\n\tin.Spec.DeepCopyInto(&out.Spec)\n\tin.Status.DeepCopyInto(&out.Status)\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Capability.\nfunc (in *Capability) DeepCopy() *Capability {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Capability)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *Capability) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *CapabilityList) DeepCopyInto(out *CapabilityList) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ListMeta.DeepCopyInto(&out.ListMeta)\n\tif in.Items != nil {\n\t\tin, out := &in.Items, &out.Items\n\t\t*out = make([]Capability, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CapabilityList.\nfunc (in *CapabilityList) DeepCopy() *CapabilityList {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(CapabilityList)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *CapabilityList) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *CapabilitySpec) DeepCopyInto(out *CapabilitySpec) {\n\t*out = *in\n\tif in.Queries != nil {\n\t\tin, out := &in.Queries, &out.Queries\n\t\t*out = make([]Query, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CapabilitySpec.\nfunc (in *CapabilitySpec) DeepCopy() *CapabilitySpec {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(CapabilitySpec)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *CapabilityStatus) DeepCopyInto(out *CapabilityStatus) {\n\t*out = *in\n\tif in.Results != nil {\n\t\tin, out := &in.Results, &out.Results\n\t\t*out = make([]Result, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CapabilityStatus.\nfunc (in *CapabilityStatus) DeepCopy() *CapabilityStatus {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(CapabilityStatus)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Check) DeepCopyInto(out *Check) {\n\t*out = *in\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Check.\nfunc (in *Check) DeepCopy() *Check {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Check)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *CheckStatus) DeepCopyInto(out *CheckStatus) {\n\t*out = *in\n\tif in.Providers != nil {\n\t\tin, out := &in.Providers, &out.Providers\n\t\t*out = make([]Provider, len(*in))\n\t\tcopy(*out, *in)\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CheckStatus.\nfunc (in *CheckStatus) DeepCopy() *CheckStatus {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(CheckStatus)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Feature) DeepCopyInto(out *Feature) {\n\t*out = *in\n\tout.Status = in.Status\n\tin.ObjectMeta.DeepCopyInto(&out.ObjectMeta)\n\tout.Spec = in.Spec\n\tout.TypeMeta = in.TypeMeta\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Feature.\nfunc (in *Feature) DeepCopy() *Feature {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Feature)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *Feature) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *FeatureGate) DeepCopyInto(out *FeatureGate) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ObjectMeta.DeepCopyInto(&out.ObjectMeta)\n\tin.Spec.DeepCopyInto(&out.Spec)\n\tin.Status.DeepCopyInto(&out.Status)\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGate.\nfunc (in *FeatureGate) DeepCopy() *FeatureGate {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(FeatureGate)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *FeatureGate) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *FeatureGateList) DeepCopyInto(out *FeatureGateList) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ListMeta.DeepCopyInto(&out.ListMeta)\n\tif in.Items != nil {\n\t\tin, out := &in.Items, &out.Items\n\t\t*out = make([]FeatureGate, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGateList.\nfunc (in *FeatureGateList) DeepCopy() *FeatureGateList {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(FeatureGateList)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *FeatureGateList) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *FeatureGateSpec) DeepCopyInto(out *FeatureGateSpec) {\n\t*out = *in\n\tif in.Features != nil {\n\t\tin, out := &in.Features, &out.Features\n\t\t*out = make([]FeatureReference, len(*in))\n\t\tcopy(*out, *in)\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGateSpec.\nfunc (in *FeatureGateSpec) DeepCopy() *FeatureGateSpec {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(FeatureGateSpec)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *FeatureGateStatus) DeepCopyInto(out *FeatureGateStatus) {\n\t*out = *in\n\tif in.FeatureReferenceResults != nil {\n\t\tin, out := &in.FeatureReferenceResults, &out.FeatureReferenceResults\n\t\t*out = make([]FeatureReferenceResult, len(*in))\n\t\tcopy(*out, *in)\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGateStatus.\nfunc (in *FeatureGateStatus) DeepCopy() *FeatureGateStatus {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(FeatureGateStatus)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *FeatureList) DeepCopyInto(out *FeatureList) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ListMeta.DeepCopyInto(&out.ListMeta)\n\tif in.Items != nil {\n\t\tin, out := &in.Items, &out.Items\n\t\t*out = make([]Feature, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureList.\nfunc (in *FeatureList) DeepCopy() *FeatureList {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(FeatureList)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *FeatureList) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *FeatureReference) DeepCopyInto(out *FeatureReference) {\n\t*out = *in\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureReference.\nfunc (in *FeatureReference) DeepCopy() *FeatureReference {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(FeatureReference)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *FeatureReferenceResult) DeepCopyInto(out *FeatureReferenceResult) {\n\t*out = *in\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureReferenceResult.\nfunc (in *FeatureReferenceResult) DeepCopy() *FeatureReferenceResult {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(FeatureReferenceResult)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *FeatureSpec) DeepCopyInto(out *FeatureSpec) {\n\t*out = *in\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureSpec.\nfunc (in *FeatureSpec) DeepCopy() *FeatureSpec {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(FeatureSpec)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *FeatureStatus) DeepCopyInto(out *FeatureStatus) {\n\t*out = *in\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureStatus.\nfunc (in *FeatureStatus) DeepCopy() *FeatureStatus {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(FeatureStatus)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Policy) DeepCopyInto(out *Policy) {\n\t*out = *in\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Policy.\nfunc (in *Policy) DeepCopy() *Policy {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Policy)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Provider) DeepCopyInto(out *Provider) {\n\t*out = *in\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Provider.\nfunc (in *Provider) DeepCopy() *Provider {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Provider)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Query) DeepCopyInto(out *Query) {\n\t*out = *in\n\tif in.GroupVersionResources != nil {\n\t\tin, out := &in.GroupVersionResources, &out.GroupVersionResources\n\t\t*out = make([]QueryGVR, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.Objects != nil {\n\t\tin, out := &in.Objects, &out.Objects\n\t\t*out = make([]QueryObject, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.PartialSchemas != nil {\n\t\tin, out := &in.PartialSchemas, &out.PartialSchemas\n\t\t*out = make([]QueryPartialSchema, len(*in))\n\t\tcopy(*out, *in)\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Query.\nfunc (in *Query) DeepCopy() *Query {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Query)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *QueryGVR) DeepCopyInto(out *QueryGVR) {\n\t*out = *in\n\tif in.Versions != nil {\n\t\tin, out := &in.Versions, &out.Versions\n\t\t*out = make([]string, len(*in))\n\t\tcopy(*out, *in)\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QueryGVR.\nfunc (in *QueryGVR) DeepCopy() *QueryGVR {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(QueryGVR)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *QueryObject) DeepCopyInto(out *QueryObject) {\n\t*out = *in\n\tout.ObjectReference = in.ObjectReference\n\tif in.WithAnnotations != nil {\n\t\tin, out := &in.WithAnnotations, &out.WithAnnotations\n\t\t*out = make(map[string]string, len(*in))\n\t\tfor key, val := range *in {\n\t\t\t(*out)[key] = val\n\t\t}\n\t}\n\tif in.WithoutAnnotations != nil {\n\t\tin, out := &in.WithoutAnnotations, &out.WithoutAnnotations\n\t\t*out = make(map[string]string, len(*in))\n\t\tfor key, val := range *in {\n\t\t\t(*out)[key] = val\n\t\t}\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QueryObject.\nfunc (in *QueryObject) DeepCopy() *QueryObject {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(QueryObject)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *QueryPartialSchema) DeepCopyInto(out *QueryPartialSchema) {\n\t*out = *in\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QueryPartialSchema.\nfunc (in *QueryPartialSchema) DeepCopy() *QueryPartialSchema {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(QueryPartialSchema)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *QueryResult) DeepCopyInto(out *QueryResult) {\n\t*out = *in\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QueryResult.\nfunc (in *QueryResult) DeepCopy() *QueryResult {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(QueryResult)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Readiness) DeepCopyInto(out *Readiness) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ObjectMeta.DeepCopyInto(&out.ObjectMeta)\n\tin.Spec.DeepCopyInto(&out.Spec)\n\tin.Status.DeepCopyInto(&out.Status)\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Readiness.\nfunc (in *Readiness) DeepCopy() *Readiness {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Readiness)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *Readiness) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *ReadinessConditionStatus) DeepCopyInto(out *ReadinessConditionStatus) {\n\t*out = *in\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ReadinessConditionStatus.\nfunc (in *ReadinessConditionStatus) DeepCopy() *ReadinessConditionStatus {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(ReadinessConditionStatus)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *ReadinessList) DeepCopyInto(out *ReadinessList) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ListMeta.DeepCopyInto(&out.ListMeta)\n\tif in.Items != nil {\n\t\tin, out := &in.Items, &out.Items\n\t\t*out = make([]Readiness, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ReadinessList.\nfunc (in *ReadinessList) DeepCopy() *ReadinessList {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(ReadinessList)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *ReadinessList) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *ReadinessProvider) DeepCopyInto(out *ReadinessProvider) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ObjectMeta.DeepCopyInto(&out.ObjectMeta)\n\tin.Spec.DeepCopyInto(&out.Spec)\n\tin.Status.DeepCopyInto(&out.Status)\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ReadinessProvider.\nfunc (in *ReadinessProvider) DeepCopy() *ReadinessProvider {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(ReadinessProvider)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *ReadinessProvider) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *ReadinessProviderCondition) DeepCopyInto(out *ReadinessProviderCondition) {\n\t*out = *in\n\tif in.ResourceExistenceCondition != nil {\n\t\tin, out := &in.ResourceExistenceCondition, &out.ResourceExistenceCondition\n\t\t*out = new(ResourceExistenceCondition)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ReadinessProviderCondition.\nfunc (in *ReadinessProviderCondition) DeepCopy() *ReadinessProviderCondition {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(ReadinessProviderCondition)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *ReadinessProviderList) DeepCopyInto(out *ReadinessProviderList) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ListMeta.DeepCopyInto(&out.ListMeta)\n\tif in.Items != nil {\n\t\tin, out := &in.Items, &out.Items\n\t\t*out = make([]ReadinessProvider, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ReadinessProviderList.\nfunc (in *ReadinessProviderList) DeepCopy() *ReadinessProviderList {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(ReadinessProviderList)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *ReadinessProviderList) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *ReadinessProviderSpec) DeepCopyInto(out *ReadinessProviderSpec) {\n\t*out = *in\n\tif in.CheckRefs != nil {\n\t\tin, out := &in.CheckRefs, &out.CheckRefs\n\t\t*out = make([]string, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\tif in.Conditions != nil {\n\t\tin, out := &in.Conditions, &out.Conditions\n\t\t*out = make([]ReadinessProviderCondition, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.ServiceAccountRef != nil {\n\t\tin, out := &in.ServiceAccountRef, &out.ServiceAccountRef\n\t\t*out = new(ServiceAccountRef)\n\t\t**out = **in\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ReadinessProviderSpec.\nfunc (in *ReadinessProviderSpec) DeepCopy() *ReadinessProviderSpec {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(ReadinessProviderSpec)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *ReadinessProviderStatus) DeepCopyInto(out *ReadinessProviderStatus) {\n\t*out = *in\n\tif in.Conditions != nil {\n\t\tin, out := &in.Conditions, &out.Conditions\n\t\t*out = make([]ReadinessConditionStatus, len(*in))\n\t\tcopy(*out, *in)\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ReadinessProviderStatus.\nfunc (in *ReadinessProviderStatus) DeepCopy() *ReadinessProviderStatus {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(ReadinessProviderStatus)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *ReadinessSpec) DeepCopyInto(out *ReadinessSpec) {\n\t*out = *in\n\tif in.Checks != nil {\n\t\tin, out := &in.Checks, &out.Checks\n\t\t*out = make([]Check, len(*in))\n\t\tcopy(*out, *in)\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ReadinessSpec.\nfunc (in *ReadinessSpec) DeepCopy() *ReadinessSpec {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(ReadinessSpec)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *ReadinessStatus) DeepCopyInto(out *ReadinessStatus) {\n\t*out = *in\n\tif in.CheckStatus != nil {\n\t\tin, out := &in.CheckStatus, &out.CheckStatus\n\t\t*out = make([]CheckStatus, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ReadinessStatus.\nfunc (in *ReadinessStatus) DeepCopy() *ReadinessStatus {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(ReadinessStatus)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *ResourceExistenceCondition) DeepCopyInto(out *ResourceExistenceCondition) {\n\t*out = *in\n\tif in.Namespace != nil {\n\t\tin, out := &in.Namespace, &out.Namespace\n\t\t*out = new(string)\n\t\t**out = **in\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceExistenceCondition.\nfunc (in *ResourceExistenceCondition) DeepCopy() *ResourceExistenceCondition {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(ResourceExistenceCondition)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Result) DeepCopyInto(out *Result) {\n\t*out = *in\n\tif in.GroupVersionResources != nil {\n\t\tin, out := &in.GroupVersionResources, &out.GroupVersionResources\n\t\t*out = make([]QueryResult, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\tif in.Objects != nil {\n\t\tin, out := &in.Objects, &out.Objects\n\t\t*out = make([]QueryResult, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\tif in.PartialSchemas != nil {\n\t\tin, out := &in.PartialSchemas, &out.PartialSchemas\n\t\t*out = make([]QueryResult, len(*in))\n\t\tcopy(*out, *in)\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Result.\nfunc (in *Result) DeepCopy() *Result {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Result)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *ServiceAccountRef) DeepCopyInto(out *ServiceAccountRef) {\n\t*out = *in\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceAccountRef.\nfunc (in *ServiceAccountRef) DeepCopy() *ServiceAccountRef {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(ServiceAccountRef)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n"
  },
  {
    "path": "build.mk",
    "content": "# Copyright 2023 VMware, Inc. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\n.DEFAULT_GOAL := help\n\nREGISTRY_PORT := 8000\nREGISTRY_ENDPOINT := localhost:$(REGISTRY_PORT)\nPACKAGE_PREFIX := $(REGISTRY_ENDPOINT)\nREGISTRY_NAME := tanzu-integration-registry\n\nDOCKER := DOCKER_BUILDKIT=1 docker\nMAKE := make\n\nIMG_DEFAULT_TAG := latest\nIMG_VERSION_OVERRIDE ?= $(IMG_DEFAULT_TAG)\nGOPROXY ?= \"https://proxy.golang.org,direct\"\nPLATFORM=local\n# Step 2 in the [Build Tooling For Integrations documentation](https://github.com/vmware-tanzu/build-tooling-for-integrations/blob/main/docs/build-tooling-getting-started.md)\n# explains how to set the COMPONENTS variable.\nCOMPONENTS ?= capabilities/client \\\ncapabilities/controller.capabilities-controller-manager.capabilities \\\nfeaturegates/client \\\nfeaturegates/controller.featuregates-controller-manager.featuregates \\\nreadiness/controller.readiness-controller-manager.readiness\n\nBUILD_TOOLING_CONTAINER_IMAGE ?= ghcr.io/vmware-tanzu/build-tooling\nPACKAGING_CONTAINER_IMAGE ?= ghcr.io/vmware-tanzu/package-tooling\nVERSION ?= v0.2.0\n\nCLI_PLUGIN_VERSION ?= v0.0.1\nIMGPKG_VERSION ?= v0.11.0\n\n# Utility functions check for main.go in component path.\nfind_main_go = $(shell find $(1) -name main.go)\ncheck_main_go = $(if $(call find_main_go,$(1)),Found,NotFound)\n\n##\n## Project Initialization Targets\n##\n\n# Bootstraps a project by creating a copy of the Tanzu build container Dockerfile\n# into the project's root directory (alongside Makefile).\n# This target also installs a local registry if the build is being done in a\n# non-CI environment and it makes sure that the Tanzu packaging container is up to date.\nbootstrap: install-registry check-copy-build-container install-package-container\n\ninstall-registry:\nifneq ($(IS_CI),)\n\t@echo \"Running in CI mode. Skipping local registry setup.\"\nelse\nifeq ($(shell $(DOCKER) ps -q -f name=$(REGISTRY_NAME) 2> /dev/null),)\n\t@echo \"Deploying a local Docker registry for Tanzu Integrations\"\n\t$(DOCKER) run -d -p $(REGISTRY_PORT):5000 --restart=always --name $(REGISTRY_NAME) registry:2\n\t@echo\nendif\n\t@echo \"Registry for Tanzu Integrations available at $(REGISTRY_ENDPOINT)\"\nendif\n\ncheck-copy-build-container:\nifneq (\"$(wildcard Dockerfile)\",\"\")\n\t$(eval COPY_BUILD_CONTAINER := $(shell bash -c 'read -p \"There is already a Dockerfile in this project. Overwrite? [y/N]: \" do_copy; echo $$do_copy'))\nelse\n\t$(eval COPY_BUILD_CONTAINER := Y)\nendif\n\t@$(MAKE) -s COPY_BUILD_CONTAINER=$(COPY_BUILD_CONTAINER) copy-build-container\n\ncopy-build-container:\nifneq ($(filter y Y, $(COPY_BUILD_CONTAINER)),)\n\t@$(DOCKER) run --name tanzu-build-tooling $(BUILD_TOOLING_CONTAINER_IMAGE):$(VERSION)\n\t@$(DOCKER) cp tanzu-build-tooling:/Dockerfile ./Dockerfile\n\t@$(DOCKER) cp tanzu-build-tooling:/.golangci.yaml ./.golangci.yaml\n\t@echo Added Dockerfile for containerize build to $(PWD)\n\t@$(DOCKER) rm tanzu-build-tooling 1> /dev/null\nendif\n\ninstall-package-container:\n\t@$(DOCKER) pull $(PACKAGING_CONTAINER_IMAGE):$(VERSION)\n\n.PHONY: bootstrap install-registry check-copy-build-container copy-build-container install-package-container\n\n\n.PHONY: init\n# Fetch the Dockerfile and pull image needed to build packages\ninit:\n\t$(DOCKER) run --rm -v ${PWD}:/workspace --entrypoint /bin/sh $(BUILD_TOOLING_CONTAINER_IMAGE):$(VERSION) -c \"cp Dockerfile /workspace && cp .golangci.yaml /workspace\"\n\t$(DOCKER) pull $(PACKAGING_CONTAINER_IMAGE):$(VERSION)\n\n##\n## Other Targets\n##\n\n.PHONY: docker-build-all\n# Run linter, tests and build images\ndocker-build-all: $(COMPONENTS)\n\n.PHONY: docker-publish-all\n# Push images of all components\ndocker-publish-all: PUBLISH_IMAGES:=true\ndocker-publish-all: $(COMPONENTS)\n\n.PHONY: build-all cli-plugin-build\n# Run linter, tests and build binaries\nbuild-all: BUILD_BIN:=true\nbuild-all: $(COMPONENTS)\n\n.PHONY: package-all\n# Generate package bundles and push them to a registry\npackage-all: package-bundle-generate-all package-bundle-push-all\n\n.PHONY: $(COMPONENTS)\n$(COMPONENTS):\n\t$(eval COMPONENT_PATH = $(word 1,$(subst ., ,$@)))\n\t$(eval IMAGE_NAME = $(word 2,$(subst ., ,$@)))\n\t$(eval PACKAGE_PATH = $(word 3,$(subst ., ,$@)))\n\t$(eval IMAGE = $(IMAGE_NAME):$(IMG_VERSION_OVERRIDE))\n\t$(eval DEFAULT_IMAGE = $(IMAGE_NAME):$(IMG_DEFAULT_TAG))\n\t$(eval IMAGE = $(shell if [ ! -z \"$(OCI_REGISTRY)\" ]; then echo $(OCI_REGISTRY)/$(IMAGE_NAME):$(IMG_VERSION_OVERRIDE); else echo $(IMAGE); fi))\n\t$(eval COMPONENT = $(shell if [ -z \"$(COMPONENT_PATH)\" ]; then echo \".\"; else echo $(COMPONENT_PATH); fi))\n\t@if [ \"$(PUBLISH_IMAGES)\" = \"true\" ]; then \\\n\t\tif [ \"$(call check_main_go,$(COMPONENT))\" = \"Found\" ]; then \\\n\t\t\t$(MAKE) validate-component IMAGE_NAME=$(IMAGE_NAME) PACKAGE_PATH=$(PACKAGE_PATH) || exit 1; \\\n\t\t\t$(MAKE) publish IMAGE=$(IMAGE) DEFAULT_IMAGE=$(DEFAULT_IMAGE) PACKAGE_PATH=$(PACKAGE_PATH) BUILD_BIN=$(BUILD_BIN); \\\n\t\tfi \\\n\telse \\\n\t\t$(MAKE) build COMPONENT=$(COMPONENT) IMAGE_NAME=$(IMAGE_NAME) IMAGE=$(IMAGE) PACKAGE_PATH=$(PACKAGE_PATH) BUILD_BIN=$(BUILD_BIN); \\\n\tfi\n\n.PHONY: validate-component\nvalidate-component:\nifeq ($(strip $(IMAGE_NAME)),)\n\t$(error Image name of the component is not set in COMPONENTS variable, check https://github.com/vmware-tanzu/build-tooling-for-integrations/blob/main/docs/build-tooling-getting-started.md#steps-to-use-the-build-tooling for more help)\nelse ifeq ($(strip $(PACKAGE_PATH)),)\n\t$(error Path to the package of the component is not set in COMPONENTS variable, check https://github.com/vmware-tanzu/build-tooling-for-integrations/blob/main/docs/build-tooling-getting-started.md#steps-to-use-the-build-tooling for more help)\nendif\n\n.PHONY: build\nbuild:\n\t$(MAKE) COMPONENT=$(COMPONENT) lint\n\t$(MAKE) COMPONENT=$(COMPONENT) test\n\t@if [ \"$(call check_main_go,$(COMPONENT))\" = \"Found\" ]; then \\\n\t\tif [ \"$(BUILD_BIN)\" = \"true\" ]; then \\\n\t\t\t$(MAKE) COMPONENT=$(COMPONENT) binary-build; \\\n\t\telse \\\n\t\t\t$(MAKE) validate-component IMAGE_NAME=$(IMAGE_NAME) PACKAGE_PATH=$(PACKAGE_PATH) || exit 1; \\\n\t\t\t$(MAKE) docker-build IMAGE=$(IMAGE) COMPONENT=$(COMPONENT); \\\n\t\tfi \\\n\tfi\n\n.PHONY: publish\npublish:\n\t$(MAKE) IMAGE=$(IMAGE) docker-publish\n\t$(MAKE) KBLD_CONFIG_FILE_PATH=packages/$(PACKAGE_PATH)/kbld-config.yaml DEFAULT_IMAGE=$(DEFAULT_IMAGE) IMAGE=$(IMAGE) kbld-image-replace\n\n.PHONY: lint\n# Run linting\nlint:\nifneq ($(strip $(COMPONENT)),.)\n\tcp .golangci.yaml $(COMPONENT)\n\t$(DOCKER) build . -f Dockerfile --target lint --build-arg COMPONENT=$(COMPONENT) --build-arg GOPROXY_ARG=$(GOPROXY)\n\trm -rf $(COMPONENT)/.golangci.yaml\nelse\n\t$(DOCKER) build . -f Dockerfile --target lint --build-arg COMPONENT=$(COMPONENT) --build-arg GOPROXY_ARG=$(GOPROXY)\nendif\n\n.PHONY: fmt\n# Run go fmt against code\nfmt:\n\t$(DOCKER) build . -f Dockerfile --target fmt --build-arg COMPONENT=$(COMPONENT) --build-arg GOPROXY_ARG=$(GOPROXY)\n\n.PHONY: vet\n# Perform static analysis of code\nvet:\n\t$(DOCKER) build . -f Dockerfile --target vet --build-arg COMPONENT=$(COMPONENT) --build-arg GOPROXY_ARG=$(GOPROXY)\n\n.PHONY: test\n# Run tests\ntest: fmt vet\n\t$(DOCKER) build . -f Dockerfile --target test --build-arg COMPONENT=$(COMPONENT) --build-arg GOPROXY_ARG=$(GOPROXY)\n\t@$(DOCKER) build . -f Dockerfile --target unit-test-coverage --build-arg COMPONENT=$(COMPONENT) --build-arg GOPROXY_ARG=$(GOPROXY) --output build/$(COMPONENT)/coverage\n\n.PHONY: binary-build\n# Build the binary\nbinary-build:\n\t$(DOCKER) build . -f Dockerfile --build-arg LD_FLAGS=\"$(LD_FLAGS)\" --target bin --output build/$(COMPONENT)/bin --platform ${PLATFORM} --build-arg COMPONENT=$(COMPONENT) --build-arg GOPROXY_ARG=$(GOPROXY)\n\n.PHONY: docker-build\n# Build docker image\ndocker-build:\n\t$(DOCKER) build . -t $(IMAGE) -f Dockerfile --target image --platform linux/amd64 --build-arg LD_FLAGS=\"$(LD_FLAGS)\" --build-arg COMPONENT=$(COMPONENT) --build-arg GOPROXY_ARG=$(GOPROXY)\n\n.PHONY: docker-publish\n# Publish docker image\ndocker-publish:\n\t$(DOCKER) push $(IMAGE)\n\n# Tanzu CLI Plugin Builder is used to compile and publish Tanzu CLI plugins.\n# https://github.com/vmware-tanzu/tanzu-cli/tree/main/cmd/plugin/builder\n.PHONY: cli-plugin-builder-install\nplugin-builder-install:\n\tdocker build . -f Dockerfile --target cli-plugin-builder-install\n\n.PHONY: cli-plugin-build\nCLI_PLUGIN_TARGETS := $(addprefix cli-plugin-build-, $(shell if [ -z \"$(CLI_PLUGINS)\" ]; then printf \"$(shell [ -d \"cmd/plugin\" ] && cd cmd/plugin && printf \"%s\" */ | sed 's/\\// /g' && cd ../..)\"; else printf \"$(CLI_PLUGINS)\"; fi))\ncli-plugin-build: install-registry cli-plugin-builder-install\n\t$(MAKE) $(CLI_PLUGIN_TARGETS)\n\n.PHONY: cli-plugin-build-%\ncli-plugin-build-%:\n\t$(MAKE) COMPONENT=cmd/plugin/$* lint\n\t$(MAKE) COMPONENT=cmd/plugin/$* test\n\t$(DOCKER) build --network=host . -f Dockerfile \\\n\t--target cli-plugin-build \\\n\t--output build \\\n\t--build-arg IMGPKG_VERSION=$(IMGPKG_VERSION) \\\n\t--build-arg CLI_PLUGIN_VERSION=$(CLI_PLUGIN_VERSION) \\\n\t--build-arg OCI_REGISTRY=$(REGISTRY_ENDPOINT) \\\n\t--build-arg CLI_PLUGIN=$* \\\n\t--build-arg COMPONENT=cmd/plugin/$* \\\n\t--build-arg CLI_PLUGIN_GO_FLAGS=$(CLI_PLUGIN_GO_FLAGS)\n\n.PHONY: cli-plugin-publish\ncli-plugin-publish: cli-plugin-builder-install\n\t$(DOCKER) build . -f Dockerfile \\\n\t--target cli-plugin-publish \\\n\t--build-arg IMGPKG_VERSION=$(IMGPKG_VERSION) \\\n\t--build-arg REPOSITORY=$(OCI_REGISTRY) \\\n\t--build-arg IMGPKG_USERNAME=$(REGISTRY_USERNAME) \\\n\t--build-arg IMGPKG_PASSWORD=$(REGISTRY_PASSWORD) \\\n\t--build-arg PUBLISHER=$(PUBLISHER) \\\n\t--build-arg VENDOR=$(VENDOR) \\\n\t--build-arg COMPONENT=cmd/plugin/*\n\n.PHONY: kbld-image-replace\n# Add newImage in kbld-config.yaml\nkbld-image-replace:\n\t@$(DOCKER) run \\\n\t  -e OPERATIONS=kbld_replace \\\n\t  -e KBLD_CONFIG_FILE_PATH=$(KBLD_CONFIG_FILE_PATH) \\\n\t  -e DEFAULT_IMAGE=$(DEFAULT_IMAGE) \\\n\t  -e NEW_IMAGE=$(IMAGE) \\\n\t  -e SRC_PATH=$(SRC_PATH) \\\n\t  -v /var/run/docker.sock:/var/run/docker.sock \\\n\t  -v $(PWD):/workspace \\\n\t\t$(PACKAGING_CONTAINER_IMAGE):$(VERSION)\n\n.PHONY: package-bundle-generate\n# Generate package bundle for a particular package\npackage-bundle-generate:\n\t@$(DOCKER) run \\\n\t  -e OPERATIONS=package_bundle_generate \\\n\t  -e PACKAGE_NAME=$(PACKAGE_NAME) \\\n\t  -e THICK=true \\\n\t  -e OCI_REGISTRY=$(OCI_REGISTRY) \\\n\t  -e PACKAGE_VERSION=$(PACKAGE_VERSION) \\\n\t  -e PACKAGE_SUB_VERSION=$(PACKAGE_SUB_VERSION) \\\n\t  -e SRC_PATH=$(SRC_PATH) \\\n\t  -v /var/run/docker.sock:/var/run/docker.sock \\\n\t  -v $(PWD):/workspace \\\n\t\t$(PACKAGING_CONTAINER_IMAGE):$(VERSION)\n\n.PHONY: package-bundle-generate-all\n# Generate package bundle for all packages\npackage-bundle-generate-all:\n\t@$(DOCKER) run \\\n\t  -e OPERATIONS=package_bundle_all_generate \\\n\t  -e PACKAGE_REPOSITORY=$(PACKAGE_REPOSITORY) \\\n\t  -e THICK=true \\\n\t  -e OCI_REGISTRY=$(OCI_REGISTRY) \\\n\t  -e PACKAGE_VERSION=$(PACKAGE_VERSION) \\\n\t  -e PACKAGE_SUB_VERSION=$(PACKAGE_SUB_VERSION) \\\n\t  -e SRC_PATH=$(SRC_PATH) \\\n\t  -v /var/run/docker.sock:/var/run/docker.sock \\\n\t  -v $(PWD):/workspace \\\n\t\t$(PACKAGING_CONTAINER_IMAGE):$(VERSION)\n\n.PHONY: package-bundle-push\n# Push a particular package bundle\npackage-bundle-push:\n\t@$(DOCKER) run \\\n\t  -e OPERATIONS=package_bundle_push \\\n\t  -e PACKAGE_NAME=$(PACKAGE_NAME) \\\n\t  -e OCI_REGISTRY=$(OCI_REGISTRY) \\\n\t  -e PACKAGE_VERSION=$(PACKAGE_VERSION) \\\n\t  -e PACKAGE_SUB_VERSION=$(PACKAGE_SUB_VERSION) \\\n\t  -e REGISTRY_USERNAME=$(REGISTRY_USERNAME) \\\n\t  -e REGISTRY_PASSWORD=$(REGISTRY_PASSWORD) \\\n\t  -e REGISTRY_SERVER=$(REGISTRY_SERVER) \\\n\t  -e SRC_PATH=$(SRC_PATH) \\\n\t  -v /var/run/docker.sock:/var/run/docker.sock \\\n\t  -v $(PWD):/workspace \\\n\t\t$(PACKAGING_CONTAINER_IMAGE):$(VERSION)\n\n.PHONY: package-bundle-push-all\n# Push all package bundles\npackage-bundle-push-all:\n\t@$(DOCKER) run \\\n\t  -e OPERATIONS=package_bundle_all_push \\\n\t  -e PACKAGE_REPOSITORY=$(PACKAGE_REPOSITORY) \\\n\t  -e OCI_REGISTRY=$(OCI_REGISTRY) \\\n\t  -e PACKAGE_VERSION=$(PACKAGE_VERSION) \\\n\t  -e PACKAGE_SUB_VERSION=$(PACKAGE_SUB_VERSION) \\\n\t  -e REGISTRY_USERNAME=$(REGISTRY_USERNAME) \\\n\t  -e REGISTRY_PASSWORD=$(REGISTRY_PASSWORD) \\\n\t  -e REGISTRY_SERVER=$(REGISTRY_SERVER) \\\n\t  -e SRC_PATH=$(SRC_PATH) \\\n\t  -v /var/run/docker.sock:/var/run/docker.sock \\\n\t  -v $(PWD):/workspace \\\n\t\t$(PACKAGING_CONTAINER_IMAGE):$(VERSION)\n\n.PHONY: repo-bundle-generate\n# Generate repo bundle\nrepo-bundle-generate:\n\t@$(DOCKER) run \\\n\t  -e OPERATIONS=repo_bundle_generate \\\n\t  -e PACKAGE_REPOSITORY=$(PACKAGE_REPOSITORY) \\\n\t  -e OCI_REGISTRY=$(OCI_REGISTRY) \\\n\t  -e REPO_BUNDLE_VERSION=$(REPO_BUNDLE_VERSION) \\\n\t  -e REPO_BUNDLE_SUB_VERSION=$(REPO_BUNDLE_SUB_VERSION) \\\n\t  -e PACKAGE_VALUES_FILE=$(PACKAGE_VALUES_FILE) \\\n\t  -e SRC_PATH=$(SRC_PATH) \\\n\t  -v /var/run/docker.sock:/var/run/docker.sock \\\n\t  -v $(PWD):/workspace \\\n\t\t$(PACKAGING_CONTAINER_IMAGE):$(VERSION)\n\n.PHONY: repo-bundle-push\n# Push repo bundle\nrepo-bundle-push:\n\t@$(DOCKER) run \\\n\t  -e OPERATIONS=repo_bundle_push \\\n\t  -e PACKAGE_REPOSITORY=$(PACKAGE_REPOSITORY) \\\n\t  -e OCI_REGISTRY=$(OCI_REGISTRY) \\\n\t  -e REPO_BUNDLE_VERSION=$(REPO_BUNDLE_VERSION) \\\n\t  -e REPO_BUNDLE_SUB_VERSION=$(REPO_BUNDLE_SUB_VERSION) \\\n\t  -e REGISTRY_USERNAME=$(REGISTRY_USERNAME) \\\n\t  -e REGISTRY_PASSWORD=$(REGISTRY_PASSWORD) \\\n\t  -e REGISTRY_SERVER=$(REGISTRY_SERVER) \\\n\t  -e SRC_PATH=$(SRC_PATH) \\\n\t  -v /var/run/docker.sock:/var/run/docker.sock \\\n\t  -v $(PWD):/workspace \\\n\t\t$(PACKAGING_CONTAINER_IMAGE):$(VERSION)\n\n.PHONY: package-vendir-sync\n# Performs vendir sync on each package\npackage-vendir-sync:\n\t@$(DOCKER) run \\\n\t  -e OPERATIONS=vendir_sync \\\n\t  -e SRC_PATH=$(SRC_PATH) \\\n\t  -v /var/run/docker.sock:/var/run/docker.sock \\\n\t  -v $(PWD):/workspace \\\n\t\t$(PACKAGING_CONTAINER_IMAGE):$(VERSION)\n\n.PHONY: help\n# Show help\nhelp:\n\t@cat $(MAKEFILE_LIST) | $(DOCKER) run --rm -i xanders/make-help\n"
  },
  {
    "path": "capabilities/client/README.md",
    "content": "# Kubernetes Query Builder SDK\n\nThe discovery SDK provides means to prepare and query for the state of a clusters objects, schema and API resources to determine the details about a cluster and how best to interact with it.\n\nThe longer term goal is to also become the most query and resource efficient means of doing so, perhaps with some limited caching ability.\n\nThe Query Builder SDK can query for:\n\n- Objects\n  - Annotation\n  - Labels\n  - Conditions\n- Resources\n  - WithFields\n- OpenAPI Schema\n\nOnce created, these prepared queries can be exported and used whenever necessary .\n\n## Example\n\n```go\n// Define some standard objects, GVRs or schema\nvar ns = corev1.ObjectReference{\n    Kind:      \"namespace\",\n    Name:      \"ian\",\n    Namespace: \"ian\",\n}\n\n// Its important to our use case for this annotation to also match\nvar testAnnotations = map[string]string{\n    \"cluster.x-k8s.io/provider\": \"infrastructure-fake\",\n}\n\n// We want to ensure this version of pipelines exists, perhaps with specific fields\nvar testGVR = schema.GroupVersionResource{\n    Group:    \"tekton.dev\",\n    Version:  \"v1beta1\",\n    Resource: \"pipelines\",\n}\n\n// We will now generate a partial query to match our specific namespace\nvar testResource1 = Object(ns).WithAnnotations(testAnnotations).WithConditions([C])\n\n// Our usecase requires us to match a specific GVR\nvar testGVR1 = GVR(testGVR).WithFields([field])\n\n// This partial schema is importan to be available - it doesnt matter what GVR provides it, but the schema needs to be available.\nvar testSchema1 = PartialSchema(schema).NotExist()\n\nc, err := NewClusterQueryClient()\nif err != nil {\n    return err\n}\n\n// Build your query and use it where its necessary\nOurCoolQuery := c.Query(testResource1, testGVR1, testSchema1).Prepare()\n\nok, err := OurCoolQuery()\nif err != nil {\n    return err\n}\nif ok {\n    log.Log(\"W00T\")\n}\n```\n"
  },
  {
    "path": "capabilities/client/go.mod",
    "content": "module github.com/vmware-tanzu/tanzu-framework/capabilities/client\n\ngo 1.19\n\nreplace github.com/vmware-tanzu/tanzu-framework/apis/core => ../../apis/core\n\nrequire (\n\tgithub.com/google/gnostic v0.5.7-v3refs\n\tgithub.com/vmware-tanzu/tanzu-framework/apis/core v0.0.0-00010101000000-000000000000\n\tgithub.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-20230419030809-7081502ebf68\n\tgopkg.in/yaml.v3 v3.0.1\n\tk8s.io/api v0.24.2\n\tk8s.io/apimachinery v0.24.2\n\tk8s.io/client-go v0.24.2\n\tsigs.k8s.io/cluster-api v1.2.8\n\tsigs.k8s.io/controller-runtime v0.12.3\n)\n\nrequire (\n\tgithub.com/PuerkitoBio/purell v1.1.1 // indirect\n\tgithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect\n\tgithub.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220209173558-ad29539cd2e9 // indirect\n\tgithub.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/blang/semver v3.5.1+incompatible // indirect\n\tgithub.com/cespare/xxhash/v2 v2.1.2 // indirect\n\tgithub.com/coredns/caddy v1.1.1 // indirect\n\tgithub.com/davecgh/go-spew v1.1.1 // indirect\n\tgithub.com/docker/distribution v2.8.2-beta.1+incompatible // indirect\n\tgithub.com/emicklei/go-restful/v3 v3.9.0 // indirect\n\tgithub.com/evanphx/json-patch v5.6.0+incompatible // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/go-logr/logr v1.2.3 // indirect\n\tgithub.com/go-openapi/jsonpointer v0.19.5 // indirect\n\tgithub.com/go-openapi/jsonreference v0.19.6 // indirect\n\tgithub.com/go-openapi/swag v0.21.1 // indirect\n\tgithub.com/gobuffalo/flect v0.2.5 // indirect\n\tgithub.com/gogo/protobuf v1.3.2 // indirect\n\tgithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/go-cmp v0.5.8 // indirect\n\tgithub.com/google/gofuzz v1.2.0 // indirect\n\tgithub.com/google/uuid v1.3.0 // indirect\n\tgithub.com/imdario/mergo v0.3.12 // indirect\n\tgithub.com/josharian/intern v1.0.0 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/mailru/easyjson v0.7.7 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect\n\tgithub.com/onsi/gomega v1.19.0 // indirect\n\tgithub.com/pkg/errors v0.9.1 // indirect\n\tgithub.com/prometheus/client_golang v1.12.2 // indirect\n\tgithub.com/prometheus/client_model v0.2.0 // indirect\n\tgithub.com/prometheus/common v0.32.1 // indirect\n\tgithub.com/prometheus/procfs v0.7.3 // indirect\n\tgithub.com/spf13/pflag v1.0.5 // indirect\n\tgo.uber.org/atomic v1.9.0 // indirect\n\tgolang.org/x/net v0.8.0 // indirect\n\tgolang.org/x/oauth2 v0.3.0 // indirect\n\tgolang.org/x/sys v0.6.0 // indirect\n\tgolang.org/x/term v0.6.0 // indirect\n\tgolang.org/x/text v0.8.0 // indirect\n\tgolang.org/x/time v0.3.0 // indirect\n\tgomodules.xyz/jsonpatch/v2 v2.2.0 // indirect\n\tgoogle.golang.org/appengine v1.6.7 // indirect\n\tgoogle.golang.org/protobuf v1.28.1 // indirect\n\tgopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect\n\tgopkg.in/inf.v0 v0.9.1 // indirect\n\tgopkg.in/yaml.v2 v2.4.0 // indirect\n\tk8s.io/apiextensions-apiserver v0.24.2 // indirect\n\tk8s.io/component-base v0.24.2 // indirect\n\tk8s.io/klog/v2 v2.70.1 // indirect\n\tk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect\n\tk8s.io/kubectl v0.24.0 // indirect\n\tk8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect\n\tsigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect\n\tsigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect\n\tsigs.k8s.io/yaml v1.3.0 // indirect\n)\n"
  },
  {
    "path": "capabilities/client/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=\ncloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=\ncloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=\ncloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=\ncloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngithub.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=\ngithub.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=\ngithub.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA=\ngithub.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M=\ngithub.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=\ngithub.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=\ngithub.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=\ngithub.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E=\ngithub.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ=\ngithub.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=\ngithub.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g=\ngithub.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA=\ngithub.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=\ngithub.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=\ngithub.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=\ngithub.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=\ngithub.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=\ngithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=\ngithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=\ngithub.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=\ngithub.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220209173558-ad29539cd2e9 h1:zvkJv+9Pxm1nnEMcKnShREt4qtduHKz4iw4AB4ul0Ao=\ngithub.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220209173558-ad29539cd2e9/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=\ngithub.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=\ngithub.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ=\ngithub.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=\ngithub.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=\ngithub.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=\ngithub.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=\ngithub.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=\ngithub.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=\ngithub.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=\ngithub.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=\ngithub.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=\ngithub.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=\ngithub.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=\ngithub.com/coredns/caddy v1.1.1 h1:2eYKZT7i6yxIfGP3qLJoJ7HAsDJqYB+X68g4NYjSrE0=\ngithub.com/coredns/caddy v1.1.1/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4=\ngithub.com/coredns/corefile-migration v1.0.18 h1:zs5PJm/VGZVje1ESRj6ZqyUuVsVfagExkbLU2QKV5mI=\ngithub.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=\ngithub.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=\ngithub.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=\ngithub.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=\ngithub.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=\ngithub.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=\ngithub.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE=\ngithub.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=\ngithub.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=\ngithub.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=\ngithub.com/docker/distribution v2.8.2-beta.1+incompatible h1:gILO60VLD2v28ozemv4aAwDb8ds5U2O/vD/sBXbd7Rw=\ngithub.com/docker/distribution v2.8.2-beta.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=\ngithub.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=\ngithub.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=\ngithub.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=\ngithub.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=\ngithub.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=\ngithub.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE=\ngithub.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ=\ngithub.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=\ngithub.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=\ngithub.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U=\ngithub.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=\ngithub.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww=\ngithub.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4=\ngithub.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=\ngithub.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=\ngithub.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=\ngithub.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=\ngithub.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=\ngithub.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=\ngithub.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg=\ngithub.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=\ngithub.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=\ngithub.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=\ngithub.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=\ngithub.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk=\ngithub.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro=\ngithub.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=\ngithub.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=\ngithub.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg=\ngithub.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs=\ngithub.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns=\ngithub.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=\ngithub.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=\ngithub.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU=\ngithub.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gobuffalo/flect v0.2.5 h1:H6vvsv2an0lalEaCDRThvtBfmg44W/QHXBCYUXf/6S4=\ngithub.com/gobuffalo/flect v0.2.5/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8=\ngithub.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=\ngithub.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=\ngithub.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/cel-go v0.10.1 h1:MQBGSZGnDwh7T/un+mzGKOMz3x+4E/GDPprWjDL+1Jg=\ngithub.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w=\ngithub.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA=\ngithub.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=\ngithub.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=\ngithub.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=\ngithub.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=\ngithub.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=\ngithub.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=\ngithub.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=\ngithub.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=\ngithub.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=\ngithub.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=\ngithub.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=\ngithub.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=\ngithub.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=\ngithub.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=\ngithub.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=\ngithub.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=\ngithub.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=\ngithub.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=\ngithub.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=\ngithub.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=\ngithub.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=\ngithub.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=\ngithub.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=\ngithub.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=\ngithub.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=\ngithub.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE=\ngithub.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc=\ngithub.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=\ngithub.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=\ngithub.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=\ngithub.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=\ngithub.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=\ngithub.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=\ngithub.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=\ngithub.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=\ngithub.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=\ngithub.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=\ngithub.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4=\ngithub.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=\ngithub.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=\ngithub.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=\ngithub.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=\ngithub.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=\ngithub.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA=\ngithub.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=\ngithub.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=\ngithub.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=\ngithub.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY=\ngithub.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=\ngithub.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=\ngithub.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=\ngithub.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw=\ngithub.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=\ngithub.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=\ngithub.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=\ngithub.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=\ngithub.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=\ngithub.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34=\ngithub.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=\ngithub.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=\ngithub.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=\ngithub.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=\ngithub.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=\ngithub.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=\ngithub.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=\ngithub.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=\ngithub.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0=\ngithub.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=\ngithub.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=\ngithub.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=\ngithub.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=\ngithub.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=\ngithub.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=\ngithub.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=\ngithub.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=\ngithub.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=\ngithub.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=\ngithub.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=\ngithub.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=\ngithub.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=\ngithub.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=\ngithub.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=\ngithub.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=\ngithub.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=\ngithub.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU=\ngithub.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=\ngithub.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=\ngithub.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=\ngithub.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=\ngithub.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-20230419030809-7081502ebf68 h1:DMsg44rX3xSBDCoKYU7zfJGzs9dfPkMYmM7C5fFx7Es=\ngithub.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-20230419030809-7081502ebf68/go.mod h1:e1Uef+Ux5BIHpYwqbeP2ZZmOzehBcez2vUEWXHe+xHE=\ngithub.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=\ngithub.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngo.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=\ngo.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=\ngo.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=\ngo.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=\ngo.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=\ngo.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=\ngo.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=\ngo.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0=\ngo.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q=\ngo.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE=\ngo.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc=\ngo.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=\ngo.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=\ngo.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=\ngo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E=\ngo.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=\ngo.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=\ngo.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM=\ngo.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=\ngo.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=\ngo.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=\ngo.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE=\ngo.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE=\ngo.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=\ngo.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=\ngo.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o=\ngo.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=\ngo.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=\ngo.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=\ngo.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=\ngo.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=\ngo.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=\ngo.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=\ngo.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=\ngo.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=\ngo.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=\ngo.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=\ngo.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=\ngo.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI=\ngo4.org v0.0.0-20201209231011-d4a079459e60 h1:iqAGo78tVOJXELHQFRjR6TMwItrvXH4hrGJ32I/NFF8=\ngo4.org/intern v0.0.0-20211027215823-ae77deb06f29 h1:UXLjNohABv4S58tHmeuIZDO6e3mHpW2Dx33gaNt03LE=\ngo4.org/unsafe/assume-no-moving-gc v0.0.0-20220617031537-928513b29760 h1:FyBZqvoA/jbNzuAWLQE2kG820zMAkcilx6BMjGbL/E4=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=\ngolang.org/x/crypto v0.3.0 h1:a06MkbcxBrEFc0w0QIZWXrH/9cCX6KJyWbBOIwAn+7A=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=\ngolang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8=\ngolang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw=\ngolang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=\ngolang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=\ngolang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=\ngolang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY=\ngomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=\ngoogle.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=\ngoogle.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=\ngoogle.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=\ngoogle.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=\ngoogle.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=\ngoogle.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=\ngoogle.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=\ngoogle.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=\ngoogle.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd h1:e0TwkXOdbnH/1x5rc5MZ/VYyiZ4v+RdVfrGMqEwT68I=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=\ngoogle.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=\ngoogle.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=\ngoogle.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\ngoogle.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\ngoogle.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=\ngopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=\ngopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=\ngopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=\ngopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=\ngopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=\ngopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=\ngotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\ninet.af/netaddr v0.0.0-20220617031823-097006376321 h1:B4dC8ySKTQXasnjDTMsoCMf1sQG4WsMej0WXaHxunmU=\nk8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I=\nk8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI=\nk8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg=\nk8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k=\nk8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ=\nk8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=\nk8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM=\nk8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=\nk8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI=\nk8s.io/cli-runtime v0.24.0/go.mod h1:9XxoZDsEkRFUThnwqNviqzljtT/LdHtNWvcNFrAXl0A=\nk8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw=\nk8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA=\nk8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30=\nk8s.io/cluster-bootstrap v0.24.0 h1:MTs2x3Vfcl/PWvB5bfX7gzTFRyi4ZSbNSQgGJTCb6Sw=\nk8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w=\nk8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w=\nk8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA=\nk8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU=\nk8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM=\nk8s.io/component-helpers v0.24.0/go.mod h1:Q2SlLm4h6g6lPTC9GMMfzdywfLSvJT2f1hOnnjaWD8c=\nk8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=\nk8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=\nk8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=\nk8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=\nk8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=\nk8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=\nk8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ=\nk8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=\nk8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=\nk8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk=\nk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s=\nk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4=\nk8s.io/kubectl v0.24.0 h1:nA+WtMLVdXUs4wLogGd1mPTAesnLdBpCVgCmz3I7dXo=\nk8s.io/kubectl v0.24.0/go.mod h1:pdXkmCyHiRTqjYfyUJiXtbVNURhv0/Q1TyRhy2d5ic0=\nk8s.io/metrics v0.24.0/go.mod h1:jrLlFGdKl3X+szubOXPG0Lf2aVxuV3QJcbsgVRAM6fI=\nk8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=\nk8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc=\nk8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw=\nsigs.k8s.io/cluster-api v1.2.8 h1:O0ZGyxGBeJaSWVptM7U0vTArAVlxCE5OtQItZ4OS2Y4=\nsigs.k8s.io/cluster-api v1.2.8/go.mod h1:HmxYwjLGHia5yjFoMY8I03Ha4kXAB+VTJnHFhAmPVig=\nsigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio=\nsigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0=\nsigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y=\nsigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY=\nsigs.k8s.io/kustomize/api v0.11.4/go.mod h1:k+8RsqYbgpkIrJ4p9jcdPqe8DprLxFUUO0yNOq8C+xI=\nsigs.k8s.io/kustomize/cmd/config v0.10.6/go.mod h1:/S4A4nUANUa4bZJ/Edt7ZQTyKOY9WCER0uBS1SW2Rco=\nsigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVYCA4BzxeAaLI05Bg=\nsigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg=\nsigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=\nsigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=\nsigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=\nsigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=\n"
  },
  {
    "path": "capabilities/client/pkg/discovery/cluster_gvr.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage discovery\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n\n\tapierrors \"k8s.io/apimachinery/pkg/api/errors\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime/schema\"\n\tkerrors \"k8s.io/apimachinery/pkg/util/errors\"\n)\n\nvar (\n\t// errInvalidWithResourceMethodArgument occurs when an empty string argument is passed into the WithResource method.\n\terrInvalidWithResourceMethodArgument = errors.New(\"WithResource method must have non-empty string argument; omit method to indicate any resource\")\n\n\t// errInvalidWithVersionsMethodArgument occurs when empty string argument(s) are passed into the WithVersions method.\n\terrInvalidWithVersionsMethodArgument = errors.New(\"WithVersions method must be comprised of non-empty string argument(s); omit method to indicate any version\")\n)\n\n// Group represents any API group that may exist on a cluster.\nfunc Group(queryName, group string) *QueryGVR {\n\treturn &QueryGVR{\n\t\tname:  queryName,\n\t\tgroup: group,\n\t}\n}\n\n// nullString represents a string that may be null or not explicitly set.\ntype nullString struct {\n\tString string\n\tIsSet  bool\n}\n\nfunc (s *nullString) set(value string) {\n\tif s != nil {\n\t\ts.String = value\n\t\ts.IsSet = true\n\t}\n}\n\n// QueryGVR provides insight to the clusters GVRs\ntype QueryGVR struct {\n\tname          string\n\tgroup         string\n\tresource      nullString\n\tversions      []string\n\tunmatchedGVRs []string\n}\n\n// Name returns the name of the query.\nfunc (q *QueryGVR) Name() string {\n\treturn q.name\n}\n\n// WithVersions checks if an API group with all the specified versions exist.\n// This method can be omitted to query any version.\nfunc (q *QueryGVR) WithVersions(versions ...string) *QueryGVR {\n\tq.versions = versions\n\treturn q\n}\n\n// WithResource checks if an API group with the specified resource exists.\n// This method can be omitted to query any resource.\nfunc (q *QueryGVR) WithResource(resource string) *QueryGVR {\n\tq.resource.set(resource)\n\treturn q\n}\n\n// Run discovery.\nfunc (q *QueryGVR) Run(config *clusterQueryClientConfig) (bool, error) {\n\tif err := q.validate(config); err != nil {\n\t\treturn false, fmt.Errorf(\"failed GroupVersionResource API query validation: %w\", err)\n\t}\n\n\tvar unmatched []string\n\n\tswitch {\n\tcase q.versions == nil:\n\t\t// q.WithVersions method was omitted and q.versions has not been set.\n\t\t// Any version that matches group and/or resource is considered a match.\n\t\tunmatchedGroupResource, err := q.unmatchedGroupResource(config)\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"failed to discover unmatched GroupResource: %w\", err)\n\t\t}\n\t\tif unmatchedGroupResource != \"\" {\n\t\t\tunmatched = append(unmatched, unmatchedGroupResource)\n\t\t}\n\tcase q.resource.String == \"\":\n\t\tunmatchedGroupVersions, err := q.unmatchedGroupVersions(config)\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"failed to discover unmatched GroupVersions: %w\", err)\n\t\t}\n\t\tunmatched = append(unmatched, unmatchedGroupVersions...)\n\tcase q.resource.String != \"\":\n\t\tunmatchedGVRs, err := q.unmatchedGroupVersionResources(config)\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"failed to discover unmatched GroupVersionResources: %w\", err)\n\t\t}\n\t\tunmatched = append(unmatched, unmatchedGVRs...)\n\t}\n\n\tq.unmatchedGVRs = unmatched\n\treturn len(unmatched) == 0, nil\n}\n\nfunc (q *QueryGVR) validate(cfg *clusterQueryClientConfig) error {\n\tif cfg == nil {\n\t\treturn fmt.Errorf(\"clusterQueryClientConfig must not be nil\")\n\t}\n\n\tvar errs []error\n\tif q.resource.IsSet && q.resource.String == \"\" {\n\t\terrs = append(errs, errInvalidWithResourceMethodArgument)\n\t}\n\tif q.versions != nil && containsEmpty(q.versions) {\n\t\terrs = append(errs, errInvalidWithVersionsMethodArgument)\n\t}\n\treturn kerrors.NewAggregate(errs)\n}\n\n// containsEmpty looks for an empty string or items containing only white space(s)\n// in the given slice of strings.\nfunc containsEmpty(strs []string) bool {\n\tfor _, s := range strs {\n\t\ts = strings.TrimSpace(s)\n\t\tif s == \"\" {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (q *QueryGVR) unmatchedGroupResource(cfg *clusterQueryClientConfig) (string, error) {\n\tgroups, resources, err := cfg.discoveryClientset.ServerGroupsAndResources()\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"failed to discover server group and resource: %w\", err)\n\t}\n\n\tgvr := schema.GroupVersionResource{\n\t\tGroup:    q.group,\n\t\tResource: q.resource.String,\n\t}\n\n\tif !q.containsGroup(groups, q.group) {\n\t\treturn gvr.String(), nil\n\t}\n\n\t// Resource was not specified, meaning there are no unmatched resources.\n\tif q.resource.String == \"\" {\n\t\treturn \"\", nil\n\t}\n\n\trscList, err := q.resourceListInGroup(resources, q.group)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"failed to find resource list in %s group: %w\", q.group, err)\n\t}\n\tif !q.resourceExists(rscList) {\n\t\treturn gvr.String(), nil\n\t}\n\n\treturn \"\", nil\n}\n\nfunc (q *QueryGVR) unmatchedGroupVersions(cfg *clusterQueryClientConfig) ([]string, error) {\n\tgroupList, err := cfg.discoveryClientset.ServerGroups()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to discover server groups: %w\", err)\n\t}\n\n\tvar unmatched []string\n\n\tgroup := q.groupFromGroupList(groupList)\n\tif group == nil {\n\t\t// No group version matches because group could not be found.\n\t\tfor _, version := range q.versions {\n\t\t\tunmatched = append(unmatched, schema.GroupVersionResource{\n\t\t\t\tGroup:    q.group,\n\t\t\t\tVersion:  version,\n\t\t\t\tResource: q.resource.String,\n\t\t\t}.String())\n\t\t}\n\t\treturn unmatched, nil\n\t}\n\n\t// Group was found. Find which query versions are not.\n\tfor _, queryVersion := range q.versions {\n\t\tvar matched bool\n\t\tfor _, discovery := range group.Versions {\n\t\t\tif strings.EqualFold(discovery.Version, queryVersion) {\n\t\t\t\tmatched = true\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tif !matched {\n\t\t\tunmatched = append(unmatched, schema.GroupVersionResource{\n\t\t\t\tGroup:    q.group,\n\t\t\t\tVersion:  queryVersion,\n\t\t\t\tResource: q.resource.String,\n\t\t\t}.String())\n\t\t}\n\t}\n\treturn unmatched, nil\n}\n\nfunc (q *QueryGVR) unmatchedGroupVersionResources(cfg *clusterQueryClientConfig) ([]string, error) {\n\tvar unmatched []string\n\tfor _, ver := range q.versions {\n\t\tgvr := schema.GroupVersionResource{\n\t\t\tGroup:    q.group,\n\t\t\tVersion:  ver,\n\t\t\tResource: q.resource.String,\n\t\t}\n\t\tresources, err := cfg.discoveryClientset.ServerResourcesForGroupVersion(gvr.GroupVersion().String())\n\t\tif err != nil {\n\t\t\t// Second condition is because fake discovery client does not return a proper NotFound error.\n\t\t\tif apierrors.IsNotFound(err) || strings.Contains(\n\t\t\t\terr.Error(),\n\t\t\t\tfmt.Sprintf(\"GroupVersion %q not found\", gvr.GroupVersion().String()),\n\t\t\t) {\n\t\t\t\tunmatched = append(unmatched, gvr.String())\n\t\t\t} else {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t\tif !q.resourceExists([]*metav1.APIResourceList{resources}) {\n\t\t\tunmatched = append(unmatched, gvr.String())\n\t\t}\n\t}\n\treturn unmatched, nil\n}\n\n// containsGroup looks for a group in a slice of APIGroup.\nfunc (q *QueryGVR) containsGroup(groups []*metav1.APIGroup, group string) bool {\n\tfor _, grp := range groups {\n\t\tif strings.EqualFold(grp.Name, group) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// resourceListInGroup looks within a slice of APIResourceList for an\n// APIResourceList that is in a specified group.\nfunc (q *QueryGVR) resourceListInGroup(resourceLists []*metav1.APIResourceList, group string) ([]*metav1.APIResourceList, error) {\n\tvar list []*metav1.APIResourceList\n\tfor _, rscList := range resourceLists {\n\t\tgv, err := schema.ParseGroupVersion(rscList.GroupVersion)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tif strings.EqualFold(gv.Group, group) {\n\t\t\tlist = append(list, rscList)\n\t\t}\n\t}\n\treturn list, nil\n}\n\n// groupFromGroupList looks for a particular group from an APIGroupList.\nfunc (q *QueryGVR) groupFromGroupList(groupList *metav1.APIGroupList) *metav1.APIGroup {\n\tfor i := range groupList.Groups {\n\t\tif strings.EqualFold(groupList.Groups[i].Name, q.group) {\n\t\t\treturn &groupList.Groups[i]\n\t\t}\n\t}\n\treturn nil\n}\n\n// resourceExists iterates over a slice of APIResourceList and checks if the resource in the query exists\nfunc (q *QueryGVR) resourceExists(resources []*metav1.APIResourceList) bool {\n\tif len(resources) == 0 {\n\t\treturn false\n\t}\n\tfor i := range resources {\n\t\tif resources[i] != nil {\n\t\t\tfor j := range resources[i].APIResources {\n\t\t\t\tif resources[i].APIResources[j].Name == q.resource.String {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn false\n}\n\n// Reason surfaces what didn't match.\nfunc (q *QueryGVR) Reason() string {\n\treturn fmt.Sprintf(\"GVRs=%v status=unmatched presence=true\", q.unmatchedGVRs)\n}\n"
  },
  {
    "path": "capabilities/client/pkg/discovery/cluster_object.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage discovery\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\tcorev1 \"k8s.io/api/core/v1\"\n\t\"k8s.io/apimachinery/pkg/api/errors\"\n\t\"k8s.io/apimachinery/pkg/api/meta\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured\"\n\t\"k8s.io/apimachinery/pkg/runtime/schema\"\n\t\"k8s.io/client-go/dynamic\"\n\t\"k8s.io/client-go/restmapper\"\n)\n\n// Object represents any runtime.Object that could exist on a cluster, with ability to specify:\n// WithAnnotations()\n// WithLabels()\n// WithConditions()\nfunc Object(queryName string, obj *corev1.ObjectReference) *QueryObject {\n\treturn &QueryObject{\n\t\tname:     queryName,\n\t\tobject:   obj,\n\t\tpresence: true,\n\t}\n}\n\n// QueryObject allows for resource querying\ntype QueryObject struct {\n\tname        string\n\tobject      *corev1.ObjectReference\n\tannotations []resourceAnnotation\n\tpresence    bool\n\t//\tconditions []resourceCondition\n}\n\n// Name is the name of the query.\nfunc (q *QueryObject) Name() string {\n\treturn q.name\n}\n\n// WithoutAnnotations ensures lack of presence annotations on a resource\nfunc (q *QueryObject) WithoutAnnotations(a map[string]string) *QueryObject {\n\tfor k, v := range a {\n\t\tq.annotations = append(q.annotations, resourceAnnotation{\n\t\t\tkey:      k,\n\t\t\tvalue:    v,\n\t\t\tpresence: false,\n\t\t})\n\t}\n\n\treturn q\n}\n\n// WithAnnotations matches annotations on a resource\nfunc (q *QueryObject) WithAnnotations(a map[string]string) *QueryObject {\n\tfor k, v := range a {\n\t\tq.annotations = append(q.annotations, resourceAnnotation{\n\t\t\tkey:      k,\n\t\t\tvalue:    v,\n\t\t\tpresence: true,\n\t\t})\n\t}\n\n\treturn q\n}\n\n// Run the object discovery\nfunc (q *QueryObject) Run(config *clusterQueryClientConfig) (bool, error) {\n\tgroupResources, err := restmapper.GetAPIGroupResources(config.discoveryClientset)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\t// Ensure object presence or lack\n\tobjectExists, err := q.QueryObjectExists(groupResources, config)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\t// Ensure the state of the resource matches intent\n\tif q.presence != objectExists {\n\t\treturn false, nil\n\t}\n\n\treturn true, nil\n}\n\n// QueryObjectExists uses dynamic and unstructured APIs to reason about object state\nfunc (q *QueryObject) QueryObjectExists(resources []*restmapper.APIGroupResources, config *clusterQueryClientConfig) (bool, error) {\n\tu, err := q.objectExists(resources, config)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif u == nil {\n\t\treturn false, nil\n\t}\n\n\tif !q.checkAnnotations(u) {\n\t\treturn false, nil\n\t}\n\n\treturn true, nil\n}\n\nfunc (q *QueryObject) objectExists(resources []*restmapper.APIGroupResources, config *clusterQueryClientConfig) (obj *unstructured.Unstructured, err error) {\n\tgvk := q.object.GroupVersionKind()\n\tgk := schema.GroupKind{Group: gvk.Group, Kind: gvk.Kind}\n\n\trm := restmapper.NewDiscoveryRESTMapper(resources)\n\tmapping, err := rm.RESTMapping(gk, gvk.Version)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar dr dynamic.ResourceInterface\n\tif mapping.Scope.Name() == meta.RESTScopeNameNamespace {\n\t\tdr = config.dynamicClient.Resource(mapping.Resource).Namespace(q.object.Namespace)\n\t} else {\n\t\tdr = config.dynamicClient.Resource(mapping.Resource)\n\t}\n\n\to, err := dr.Get(context.Background(), q.object.Name, metav1.GetOptions{})\n\tif err != nil {\n\t\tif errors.IsNotFound(err) {\n\t\t\treturn nil, nil\n\t\t}\n\t\treturn nil, err\n\t}\n\n\treturn o, nil\n}\n\nfunc (q *QueryObject) checkAnnotations(u *unstructured.Unstructured) bool {\n\tfor _, v := range q.annotations {\n\t\tval, ok := u.GetAnnotations()[v.key]\n\t\tif ok {\n\t\t\tif !v.presence {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif v.value != \"\" && v.value != val {\n\t\t\t\treturn false\n\t\t\t}\n\t\t} else if v.presence {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n// Reason for failures, in a standard structure\nfunc (q *QueryObject) Reason() string {\n\treturn fmt.Sprintf(\"kind=%s status=unmatched presence=%t\", q.object.Kind, q.presence)\n}\n\nfunc (q *QueryObject) annotationsMap(presence bool) map[string]string {\n\tannotations := make(map[string]string)\n\tfor _, a := range q.annotations {\n\t\tif a.presence == presence {\n\t\t\tannotations[a.key] = a.value\n\t\t}\n\t}\n\treturn annotations\n}\n\ntype resourceAnnotation struct {\n\tkey      string\n\tvalue    string\n\tpresence bool\n}\n"
  },
  {
    "path": "capabilities/client/pkg/discovery/cluster_schema.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage discovery\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\n// Schema represents any openapi schema that may exist on a cluster\nfunc Schema(name, partialSchema string) *QueryPartialSchema {\n\treturn &QueryPartialSchema{\n\t\tschema:   partialSchema,\n\t\tpresence: true,\n\t\tname:     name,\n\t}\n}\n\n// QueryPartialSchema allows for matching a partial schema\n// currently this is quite naive string comparison but will be updated fpr better validation\ntype QueryPartialSchema struct {\n\tschema   string\n\tname     string\n\tpresence bool\n}\n\n// Name is the name of the query.\nfunc (q *QueryPartialSchema) Name() string {\n\treturn q.name\n}\n\n// Run the partial query match\nfunc (q *QueryPartialSchema) Run(config *clusterQueryClientConfig) (bool, error) {\n\tdoc, err := config.discoveryClientset.OpenAPISchema()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\t// TODO: fix this with better validation means\n\tif strings.Contains(doc.String(), q.schema) {\n\t\treturn true, nil\n\t}\n\treturn false, nil\n}\n\n// QueryFailure exposes detail on the query failure for consumers to parse\ntype QueryFailure struct {\n\tTarget   QueryTarget\n\tPresence bool\n}\n\n// Reason returns  the query failure, of it failed\n// todo: this should be a results{} struct\nfunc (q *QueryPartialSchema) Reason() string {\n\treturn fmt.Sprintf(\"method=partial-schema name=%s status=unmatched presence=%t\", q.name, q.presence)\n}\n"
  },
  {
    "path": "capabilities/client/pkg/discovery/cluster_test.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage discovery\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\tcorev1 \"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\ttestapigroup \"k8s.io/apimachinery/pkg/apis/testapigroup/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\tapitest \"k8s.io/apimachinery/pkg/test\"\n\tutilruntime \"k8s.io/apimachinery/pkg/util/runtime\"\n)\n\nvar testScheme = runtime.NewScheme()\n\nfunc init() {\n\tutilruntime.Must(testapigroup.AddToScheme(testScheme))\n}\n\nvar carp = corev1.ObjectReference{\n\tKind:       \"Carp\",\n\tName:       \"test14\",\n\tNamespace:  \"testns\",\n\tAPIVersion: testapigroup.SchemeGroupVersion.String(),\n}\n\nvar testAnnotations = map[string]string{\n\t\"cluster.x-k8s.io/provider\": \"infrastructure-fake\",\n}\n\nvar testObject = Object(\"carpObj\", &carp).WithAnnotations(testAnnotations) // .WithConditions(field)\n\nvar testGVR = Group(\"carpResource\", testapigroup.SchemeGroupVersion.Group).\n\tWithVersions(testapigroup.SchemeGroupVersion.Version).\n\tWithResource(\"carps\")\n\nvar testPartialSchemaNotFound = Schema(\"partialSchemaQuery\", \"partial schema\")\nvar testPartialSchemaFound = Schema(\"partialSchemaQuery\", \"example schema for test\")\n\nvar testObjects = []runtime.Object{\n\t&testapigroup.Carp{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName:        \"test14\",\n\t\t\tNamespace:   \"testns\",\n\t\t\tAnnotations: testAnnotations,\n\t\t},\n\t},\n}\n\nvar apiResources = []*metav1.APIResourceList{\n\t{\n\t\tGroupVersion: testapigroup.SchemeGroupVersion.String(),\n\t\tAPIResources: []metav1.APIResource{\n\t\t\t{\n\t\t\t\tName:       \"carps\",\n\t\t\t\tKind:       \"Carp\",\n\t\t\t\tGroup:      testapigroup.SchemeGroupVersion.Group,\n\t\t\t\tVersion:    testapigroup.SchemeGroupVersion.Version,\n\t\t\t\tNamespaced: true,\n\t\t\t},\n\t\t},\n\t},\n}\n\nfunc queryClientWithResourcesAndObjects() (*ClusterQueryClient, error) {\n\treturn NewFakeClusterQueryClient(apiResources, testScheme, testObjects)\n}\n\nfunc queryClientWithNoResources() (*ClusterQueryClient, error) {\n\treturn NewFakeClusterQueryClient([]*metav1.APIResourceList{}, testScheme, testObjects)\n}\n\nfunc queryClientWithResourcesAndNoObjects() (*ClusterQueryClient, error) {\n\tscheme, _ := apitest.TestScheme()\n\treturn NewFakeClusterQueryClient(apiResources, scheme, []runtime.Object{})\n}\n\nfunc queryClientWithSchema() (*ClusterQueryClient, error) {\n\tscheme, _ := apitest.TestScheme()\n\treturn NewFakeClusterQueryClientWithSchema(nil, scheme, nil)\n}\n\nfunc TestClusterQueries(t *testing.T) {\n\ttestCases := []struct {\n\t\tdescription       string\n\t\tdiscoveryClientFn func() (*ClusterQueryClient, error)\n\t\tqueryTargets      []QueryTarget\n\t\twant              bool\n\t\terr               string\n\t}{\n\t\t{\n\t\t\tdescription:       \"all queries successful\",\n\t\t\tdiscoveryClientFn: queryClientWithResourcesAndObjects,\n\t\t\tqueryTargets:      []QueryTarget{testGVR, testObject},\n\t\t\twant:              true,\n\t\t},\n\t\t{\n\t\t\tdescription:       \"resource not found\",\n\t\t\tdiscoveryClientFn: queryClientWithNoResources,\n\t\t\tqueryTargets:      []QueryTarget{testGVR, testObject},\n\t\t\twant:              false,\n\t\t\terr:               \"no matches for kind \\\"Carp\\\" in version \\\"testapigroup.apimachinery.k8s.io/v1\\\"\",\n\t\t},\n\t\t{\n\t\t\tdescription:       \"resource found but not object\",\n\t\t\tdiscoveryClientFn: queryClientWithResourcesAndNoObjects,\n\t\t\tqueryTargets:      []QueryTarget{testGVR, testObject},\n\t\t\twant:              false,\n\t\t\terr:               \"\",\n\t\t},\n\t\t{\n\t\t\tdescription:       \"no query targets\",\n\t\t\tdiscoveryClientFn: queryClientWithResourcesAndObjects,\n\t\t\tqueryTargets:      []QueryTarget{},\n\t\t\twant:              true,\n\t\t\terr:               \"\",\n\t\t},\n\t\t{\n\t\t\tdescription:       \"query target names contain duplicates\",\n\t\t\tdiscoveryClientFn: queryClientWithResourcesAndObjects,\n\t\t\tqueryTargets:      []QueryTarget{testGVR, testObject, Object(\"carpObj\", &carp)},\n\t\t\twant:              false,\n\t\t\terr:               \"query target names must be unique\",\n\t\t},\n\t\t{\n\t\t\tdescription:       \"partial schema query not found\",\n\t\t\tdiscoveryClientFn: queryClientWithSchema,\n\t\t\tqueryTargets:      []QueryTarget{testPartialSchemaNotFound},\n\t\t\twant:              false,\n\t\t\terr:               \"\",\n\t\t},\n\t\t{\n\t\t\tdescription:       \"partial schema query found\",\n\t\t\tdiscoveryClientFn: queryClientWithSchema,\n\t\t\tqueryTargets:      []QueryTarget{testPartialSchemaFound},\n\t\t\twant:              true,\n\t\t\terr:               \"\",\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tc, err := tc.discoveryClientFn()\n\t\t\tif err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t}\n\n\t\t\tq := c.Query(tc.queryTargets...).Prepare()\n\n\t\t\tgot, err := q()\n\t\t\tif err != nil {\n\t\t\t\tif tc.err == \"\" {\n\t\t\t\t\tt.Errorf(\"no error string specified, but got error: %v\", err)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(err.Error(), tc.err) {\n\t\t\t\t\tt.Errorf(\"error string=%q doesn't match partial=%q\", tc.err, err)\n\t\t\t\t}\n\t\t\t} else if tc.err != \"\" {\n\t\t\t\tt.Errorf(\"error string=%q specified but error not found\", tc.err)\n\t\t\t}\n\n\t\t\tif got != tc.want {\n\t\t\t\tt.Errorf(\"got=%t, want=%t\", got, tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\n// TestGVRQueries tests combinations of GVR queries using WithVersions and\n// WithResource methods.\nfunc TestGVRQueries(t *testing.T) {\n\t// apiResources has information similar to an actual Kubernetes cluster.\n\tapiResources := []*metav1.APIResourceList{\n\t\t{\n\t\t\tGroupVersion: \"admissionregistration.k8s.io/v1\",\n\t\t\tAPIResources: []metav1.APIResource{\n\t\t\t\t{\n\t\t\t\t\tName:       \"mutatingwebhookconfigurations\",\n\t\t\t\t\tKind:       \"MutatingWebhookConfiguration\",\n\t\t\t\t\tNamespaced: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tGroupVersion: \"apps/v1\",\n\t\t\tAPIResources: []metav1.APIResource{\n\t\t\t\t{\n\t\t\t\t\tName:       \"deployments\",\n\t\t\t\t\tKind:       \"Deployment\",\n\t\t\t\t\tNamespaced: true,\n\t\t\t\t\tShortNames: []string{\"deploy\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tGroupVersion: \"core.tanzu.vmware.com/v1alpha1\",\n\t\t\tAPIResources: []metav1.APIResource{\n\t\t\t\t{\n\t\t\t\t\tName:       \"features\",\n\t\t\t\t\tKind:       \"Feature\",\n\t\t\t\t\tNamespaced: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tGroupVersion: \"core.tanzu.vmware.com/v1alpha2\",\n\t\t\tAPIResources: []metav1.APIResource{\n\t\t\t\t{\n\t\t\t\t\tName:       \"features\",\n\t\t\t\t\tKind:       \"Feature\",\n\t\t\t\t\tNamespaced: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tGroupVersion: \"rbac.authorization.k8s.io/v1\",\n\t\t\tAPIResources: []metav1.APIResource{\n\t\t\t\t{\n\t\t\t\t\tName:       \"roles\",\n\t\t\t\t\tKind:       \"Role\",\n\t\t\t\t\tNamespaced: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tGroupVersion: \"v1\",\n\t\t\tAPIResources: []metav1.APIResource{\n\t\t\t\t{\n\t\t\t\t\tName:       \"pods\",\n\t\t\t\t\tKind:       \"Pod\",\n\t\t\t\t\tNamespaced: true,\n\t\t\t\t\tShortNames: []string{\"po\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tscheme := runtime.NewScheme()\n\tif err := corev1.AddToScheme(scheme); err != nil {\n\t\tt.Fatalf(\"adding core objects to scheme: %v\", err)\n\t}\n\n\ttestObjects := []runtime.Object{\n\t\t&corev1.Pod{\n\t\t\tTypeMeta: metav1.TypeMeta{\n\t\t\t\tAPIVersion: corev1.SchemeGroupVersion.String(),\n\t\t\t\tKind:       \"Pod\",\n\t\t\t},\n\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\tNamespace: \"default\",\n\t\t\t\tName:      \"testPod\",\n\t\t\t},\n\t\t},\n\t}\n\n\t// Create client that provides fake cluster information.\n\ttestClient, err := NewFakeClusterQueryClient(apiResources, scheme, testObjects)\n\tif err != nil {\n\t\tt.Fatalf(\"initiating test client: %v\", err)\n\t}\n\n\ttestCases := []struct {\n\t\tdescription string\n\t\tquery       *QueryGVR\n\t\twant        bool\n\t\terr         error\n\t}{\n\t\t{\n\t\t\tdescription: \"existing core group is found\",\n\t\t\tquery:       Group(\"test\", \"\"),\n\t\t\twant:        true,\n\t\t},\n\t\t{\n\t\t\tdescription: \"existing apps group is found\",\n\t\t\tquery:       Group(\"test\", \"apps\"),\n\t\t\twant:        true,\n\t\t},\n\t\t{\n\t\t\tdescription: \"group not found\",\n\t\t\tquery:       Group(\"test\", \"hotscalers\"),\n\t\t\twant:        false,\n\t\t},\n\t\t{\n\t\t\tdescription: \"group not found, resource found\",\n\t\t\tquery:       Group(\"test\", \"hotscalers\").WithResource(\"deployments\"),\n\t\t\twant:        false,\n\t\t},\n\t\t{\n\t\t\tdescription: \"group found, resource not found\",\n\t\t\tquery:       Group(\"test\", \"apps\").WithResource(\"nonexistingresource\"),\n\t\t\twant:        false,\n\t\t},\n\t\t{\n\t\t\tdescription: \"group and resource found\",\n\t\t\tquery:       Group(\"test\", \"admissionregistration.k8s.io\").WithResource(\"mutatingwebhookconfigurations\"),\n\t\t\twant:        true,\n\t\t},\n\t\t{\n\t\t\tdescription: \"group exists, but empty string resource returns error\",\n\t\t\tquery:       Group(\"test\", \"admissionregistration.k8s.io\").WithResource(\"\"),\n\t\t\terr:         errInvalidWithResourceMethodArgument,\n\t\t},\n\t\t{\n\t\t\tdescription: \"group not found, version found\",\n\t\t\tquery:       Group(\"test\", \"admissionregistration.k8s.io\").WithVersions(\"v1alpha1\"),\n\t\t\twant:        false,\n\t\t},\n\t\t{\n\t\t\tdescription: \"group and version found\",\n\t\t\tquery:       Group(\"test\", \"apps\").WithVersions(\"v1\"),\n\t\t\twant:        true,\n\t\t},\n\t\t{\n\t\t\tdescription: \"group and versions found\",\n\t\t\tquery:       Group(\"test\", \"core.tanzu.vmware.com\").WithVersions(\"v1alpha1\", \"v1alpha2\"),\n\t\t\twant:        true,\n\t\t},\n\t\t{\n\t\t\tdescription: \"group found, but empty string version returns error\",\n\t\t\tquery:       Group(\"test\", \"apps\").WithVersions(\"\"),\n\t\t\terr:         errInvalidWithVersionsMethodArgument,\n\t\t},\n\t\t{\n\t\t\tdescription: \"core group and version found\",\n\t\t\tquery:       Group(\"test\", \"\").WithVersions(\"v1\"),\n\t\t\twant:        true,\n\t\t},\n\t\t{\n\t\t\tdescription: \"group found and version not found\",\n\t\t\tquery:       Group(\"test\", \"autoscaling\").WithVersions(\"v1\", \"v2beta1\", \"v2beta2\"),\n\t\t\twant:        false,\n\t\t},\n\t\t{\n\t\t\tdescription: \"group, versions, resource found\",\n\t\t\tquery: Group(\"test\", \"core.tanzu.vmware.com\").\n\t\t\t\tWithVersions(\"v1alpha1\", \"v1alpha2\").\n\t\t\t\tWithResource(\"features\"),\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tdescription: \"group, versions found, resource not found\",\n\t\t\tquery: Group(\"test\", \"core.tanzu.vmware.com\").\n\t\t\t\tWithVersions(\"v1alpha1\", \"v1alpha2\").\n\t\t\t\tWithResource(\"ingress\"),\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tdescription: \"group, resource found, version not found\",\n\t\t\tquery: Group(\"test\", \"autoscaling\").\n\t\t\t\tWithVersions(\"v3\").\n\t\t\t\tWithResource(\"horizontalpodautoscalers\"),\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tdescription: \"versions, resource found, group not found\",\n\t\t\tquery: Group(\"test\", \"hotscaling\").\n\t\t\t\tWithVersions(\"v2beta1\").\n\t\t\t\tWithResource(\"horizontalpodautoscalers\"),\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tdescription: \"group, versions, resource not found\",\n\t\t\tquery: Group(\"test\", \"hotscaling\").\n\t\t\t\tWithVersions(\"v3\").\n\t\t\t\tWithResource(\"verticalscaler\"),\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tdescription: \"multiple empty versions returns error even if resource exists\",\n\t\t\tquery: Group(\"test\", \"\").\n\t\t\t\tWithVersions(\"\", \"\", \"\", \"\").\n\t\t\t\tWithResource(\"pods\"),\n\t\t\terr: errInvalidWithVersionsMethodArgument,\n\t\t},\n\t\t{\n\t\t\tdescription: \"multiple empty versions and empty resource returns invalid version error\",\n\t\t\tquery: Group(\"test\", \"\").\n\t\t\t\tWithVersions(\"\", \"\", \"\", \"\").\n\t\t\t\tWithResource(\"\"),\n\t\t\terr: errInvalidWithVersionsMethodArgument,\n\t\t},\n\t\t{\n\t\t\tdescription: \"multiple empty versions and empty resource returns invalid resource error\",\n\t\t\tquery: Group(\"test\", \"autoscaling\").\n\t\t\t\tWithVersions(\"\", \"\", \"\", \"\").\n\t\t\t\tWithResource(\"\"),\n\t\t\terr: errInvalidWithResourceMethodArgument,\n\t\t},\n\t\t{\n\t\t\tdescription: \"having empty string version among many returns an error\",\n\t\t\tquery:       Group(\"test\", \"\").WithVersions(\"\", \"v1\", \"v2\", \"v3\"),\n\t\t\terr:         errInvalidWithVersionsMethodArgument,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tquery := testClient.Query(tc.query)\n\n\t\t\t_, err := query.Execute()\n\t\t\tif tc.err == nil && err != nil {\n\t\t\t\tt.Fatalf(\"want: no error, got: %v\", err)\n\t\t\t}\n\n\t\t\tif tc.err != nil {\n\t\t\t\tif !errors.Is(err, tc.err) {\n\t\t\t\t\tt.Errorf(\"want error: %v, got: %v\", tc.err, err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif tc.err == nil {\n\t\t\t\tgot := query.Results().ForQuery(\"test\")\n\n\t\t\t\tif got.Found != tc.want {\n\t\t\t\t\tt.Errorf(\"want: found %t, got: found %t\", tc.want, got.Found)\n\t\t\t\t}\n\n\t\t\t\t// API resources that are not found should have empty reason.\n\t\t\t\tif got.Found {\n\t\t\t\t\tif got.NotFoundReason != \"\" {\n\t\t\t\t\t\tt.Errorf(\"want: empty not found reason, got: %s\", got.NotFoundReason)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// API resources that are found should have reason(s).\n\t\t\t\tif !got.Found {\n\t\t\t\t\tif len(got.NotFoundReason) == 0 {\n\t\t\t\t\t\tt.Errorf(\"want: not found reason, got empty reason\")\n\t\t\t\t\t}\n\t\t\t\t\tt.Logf(\"want: not found reason, got: %s\", got.NotFoundReason)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "capabilities/client/pkg/discovery/discovery.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage discovery\n\nimport (\n\t\"fmt\"\n\n\t\"k8s.io/client-go/discovery\"\n\t\"k8s.io/client-go/dynamic\"\n\t\"k8s.io/client-go/rest\"\n)\n\n// NewClusterQueryClientForConfig returns a new cluster query builder for a REST config.\nfunc NewClusterQueryClientForConfig(config *rest.Config) (*ClusterQueryClient, error) {\n\tdiscoveryClient, err := discovery.NewDiscoveryClientForConfig(config)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdynamicClient, err := dynamic.NewForConfig(config)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn NewClusterQueryClient(dynamicClient, discoveryClient)\n}\n\n// NewClusterQueryClient returns a new cluster query builder\nfunc NewClusterQueryClient(dynamicClient dynamic.Interface, discoveryClient discovery.DiscoveryInterface) (*ClusterQueryClient, error) {\n\tconfig := &clusterQueryClientConfig{\n\t\tdynamicClient:      dynamicClient,\n\t\tdiscoveryClientset: discoveryClient,\n\t}\n\n\treturn &ClusterQueryClient{\n\t\tconfig: config,\n\t}, nil\n}\n\ntype clusterQueryClientConfig struct {\n\tdynamicClient      dynamic.Interface\n\tdiscoveryClientset discovery.DiscoveryInterface\n}\n\n// ClusterQueryClient allows clients to inspect the cluster objects, GVK and schema state of a cluster\ntype ClusterQueryClient struct {\n\tconfig *clusterQueryClientConfig\n}\n\n// Query provides a new query object to prepare\nfunc (c *ClusterQueryClient) Query(targets ...QueryTarget) *ClusterQuery {\n\treturn &ClusterQuery{\n\t\ttargets: targets,\n\t\tconfig:  c.config,\n\t\tresults: Results{},\n\t}\n}\n\n// PreparedQuery provides a prepared object\nfunc (c *ClusterQueryClient) PreparedQuery(targets ...QueryTarget) func() (bool, error) {\n\tq := &ClusterQuery{\n\t\ttargets: targets,\n\t\tconfig:  c.config,\n\t\tresults: Results{},\n\t}\n\treturn q.Prepare()\n}\n\n// QueryTarget implementations: Resource, GVK, Schema\ntype QueryTarget interface {\n\tName() string\n\tRun(config *clusterQueryClientConfig) (bool, error)\n\tReason() string\n}\n\n// QueryResult is a result of a single query.\ntype QueryResult struct {\n\t// Found indicates whether the entity being checked in the query exists.\n\tFound bool\n\t// NotFoundReason indicates the reason why Found was false.\n\tNotFoundReason string\n}\n\n// Results is a map of query names to their corresponding QueryResult.\ntype Results map[string]*QueryResult\n\n// ForQuery returns the QueryResult for a given query name.\n// Return value is nil if the query target with the given name does not exist.\nfunc (r Results) ForQuery(queryName string) *QueryResult {\n\treturn r[queryName]\n}\n\n// ClusterQuery provides a means of executing a queries targets to determine results\ntype ClusterQuery struct {\n\ttargets []QueryTarget\n\tconfig  *clusterQueryClientConfig\n\tresults Results\n}\n\n// Execute runs all the query targets and returns true only if *all* of them succeed.\n// For granular results of each query, use the Results() method after calling this method.\n// Normally this function is returned by Prepare() and stored as a constant to re-use\nfunc (c *ClusterQuery) Execute() (bool, error) {\n\t// Check for duplicate query names.\n\tm := make(map[string]struct{})\n\tfor _, t := range c.targets {\n\t\tif _, ok := m[t.Name()]; ok {\n\t\t\treturn false, fmt.Errorf(\"query target names must be unique\")\n\t\t}\n\t\tm[t.Name()] = struct{}{}\n\t}\n\n\tsuccess := true\n\tfor _, t := range c.targets {\n\t\tok, err := t.Run(c.config)\n\t\tif err != nil {\n\t\t\treturn false, err\n\t\t}\n\t\tqueryResult := &QueryResult{}\n\t\tif !ok {\n\t\t\tqueryResult.Found = false\n\t\t\tqueryResult.NotFoundReason = t.Reason()\n\t\t\tc.results[t.Name()] = queryResult\n\t\t\tsuccess = false\n\t\t\tcontinue\n\t\t}\n\t\tqueryResult.Found = true\n\t\tc.results[t.Name()] = queryResult\n\t}\n\treturn success, nil\n}\n\n// Prepare queries for the discovery API on the resources, GVKs and/or partial schema a cluster has.\nfunc (c *ClusterQuery) Prepare() func() (bool, error) {\n\treturn c.Execute\n}\n\n// Results returns all of the queries failures\nfunc (c *ClusterQuery) Results() Results {\n\treturn c.results\n}\n"
  },
  {
    "path": "capabilities/client/pkg/discovery/doc.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package discovery provides efficient means to query Kubernetes clusters for the state of its api surface and existing objects\npackage discovery\n"
  },
  {
    "path": "capabilities/client/pkg/discovery/fake.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage discovery\n\nimport (\n\topenapi_v2 \"github.com/google/gnostic/openapiv2\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\tfakediscovery \"k8s.io/client-go/discovery/fake\"\n\tdynamicFake \"k8s.io/client-go/dynamic/fake\"\n\tk8stesting \"k8s.io/client-go/testing\"\n)\n\n// NewFakeClusterQueryClient returns a fake ClusterQueryClient for use in tests.\nfunc NewFakeClusterQueryClient(resources []*metav1.APIResourceList, scheme *runtime.Scheme, objs []runtime.Object) (*ClusterQueryClient, error) {\n\tfakeDynamicClient := dynamicFake.NewSimpleDynamicClient(scheme, objs...)\n\tfakeDiscoveryClient := &fakediscovery.FakeDiscovery{\n\t\tFake: &k8stesting.Fake{\n\t\t\tResources: resources,\n\t\t}}\n\treturn NewClusterQueryClient(fakeDynamicClient, fakeDiscoveryClient)\n}\n\n// fakeWithSchema is the same as fakediscovery.FakeDiscovery except it has a\n// different OPenAPISchema() method.\ntype fakeWithSchema struct {\n\t*fakediscovery.FakeDiscovery\n}\n\nfunc (fws fakeWithSchema) OpenAPISchema() (*openapi_v2.Document, error) {\n\tschema := `swagger: '2.0'\ninfo:\n  title: 'example schema for test'\n  version: '1.3'\npaths:\n  - '/test/path'\n  - '/another/path'\n`\n\treturn openapi_v2.ParseDocument([]byte(schema))\n}\n\n// NewFakeClusterQueryClientWithSchema returns a fake ClusterQueryClient for use in tests.\nfunc NewFakeClusterQueryClientWithSchema(_ []*metav1.APIResourceList, scheme *runtime.Scheme, objs []runtime.Object) (*ClusterQueryClient, error) {\n\tfakeDynamicClient := dynamicFake.NewSimpleDynamicClient(scheme, objs...)\n\n\tfakeDiscWithSchema := fakeWithSchema{\n\t\t&fakediscovery.FakeDiscovery{\n\t\t\tFake: &k8stesting.Fake{\n\t\t\t\tResources: nil,\n\t\t\t},\n\t\t},\n\t}\n\tfakeDiscoveryClient := &fakeDiscWithSchema\n\treturn NewClusterQueryClient(fakeDynamicClient, fakeDiscoveryClient)\n}\n"
  },
  {
    "path": "capabilities/client/pkg/discovery/generate.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage discovery\n\nimport (\n\t\"fmt\"\n\t\"math/rand\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n\trunv1alpha1 \"github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1\"\n)\n\n// QueryTargetsToCapabilityResource is a helper function to generate a\n// Capability v1alpha1 resource from a slice of QueryTarget.\n//\n// Deprecated: This API is deprecated. Use QueryTargetsToCapability instead\n//\n//nolint:dupl\nfunc QueryTargetsToCapabilityResource(queryTargets []QueryTarget) (*runv1alpha1.Capability, error) {\n\tvar (\n\t\tgvrQueries           []runv1alpha1.QueryGVR\n\t\tobjectQueries        []runv1alpha1.QueryObject\n\t\tpartialSchemaQueries []runv1alpha1.QueryPartialSchema\n\t)\n\n\tfor _, qt := range queryTargets {\n\t\tswitch query := qt.(type) {\n\t\tcase *QueryGVR:\n\t\t\tq := runv1alpha1.QueryGVR{\n\t\t\t\tName:     fmt.Sprintf(\"gvr-%d\", rand.Int31()), //nolint:gosec\n\t\t\t\tGroup:    query.group,\n\t\t\t\tVersions: query.versions,\n\t\t\t\tResource: query.resource.String,\n\t\t\t}\n\t\t\tgvrQueries = append(gvrQueries, q)\n\t\tcase *QueryObject:\n\t\t\tq := runv1alpha1.QueryObject{\n\t\t\t\tName:               fmt.Sprintf(\"object-%d\", rand.Int31()), //nolint:gosec\n\t\t\t\tObjectReference:    *query.object,\n\t\t\t\tWithAnnotations:    query.annotationsMap(true),\n\t\t\t\tWithoutAnnotations: query.annotationsMap(false),\n\t\t\t}\n\t\t\tobjectQueries = append(objectQueries, q)\n\t\tcase *QueryPartialSchema:\n\t\t\tq := runv1alpha1.QueryPartialSchema{\n\t\t\t\tName:          fmt.Sprintf(\"partialSchema-%d\", rand.Int31()), //nolint:gosec\n\t\t\t\tPartialSchema: query.schema,\n\t\t\t}\n\t\t\tpartialSchemaQueries = append(partialSchemaQueries, q)\n\t\tdefault:\n\t\t\treturn nil, fmt.Errorf(\"unknown QueryTarget type: %T\", qt)\n\t\t}\n\t}\n\n\tcapability := &runv1alpha1.Capability{\n\t\tSpec: runv1alpha1.CapabilitySpec{\n\t\t\tQueries: []runv1alpha1.Query{\n\t\t\t\t{\n\t\t\t\t\tName:                  fmt.Sprintf(\"query-%d\", rand.Int31()), //nolint:gosec\n\t\t\t\t\tGroupVersionResources: gvrQueries,\n\t\t\t\t\tObjects:               objectQueries,\n\t\t\t\t\tPartialSchemas:        partialSchemaQueries,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\treturn capability, nil\n}\n\n// QueryTargetsToCapability is a helper function to generate a\n// Capability v1alpha1 resource from a slice of QueryTarget.\n//\n//nolint:dupl\nfunc QueryTargetsToCapability(queryTargets []QueryTarget) (*corev1alpha2.Capability, error) {\n\tvar (\n\t\tgvrQueries           []corev1alpha2.QueryGVR\n\t\tobjectQueries        []corev1alpha2.QueryObject\n\t\tpartialSchemaQueries []corev1alpha2.QueryPartialSchema\n\t)\n\n\tfor _, qt := range queryTargets {\n\t\tswitch query := qt.(type) {\n\t\tcase *QueryGVR:\n\t\t\tq := corev1alpha2.QueryGVR{\n\t\t\t\tName:     fmt.Sprintf(\"gvr-%d\", rand.Int31()), //nolint:gosec\n\t\t\t\tGroup:    query.group,\n\t\t\t\tVersions: query.versions,\n\t\t\t\tResource: query.resource.String,\n\t\t\t}\n\t\t\tgvrQueries = append(gvrQueries, q)\n\t\tcase *QueryObject:\n\t\t\tq := corev1alpha2.QueryObject{\n\t\t\t\tName:               fmt.Sprintf(\"object-%d\", rand.Int31()), //nolint:gosec\n\t\t\t\tObjectReference:    *query.object,\n\t\t\t\tWithAnnotations:    query.annotationsMap(true),\n\t\t\t\tWithoutAnnotations: query.annotationsMap(false),\n\t\t\t}\n\t\t\tobjectQueries = append(objectQueries, q)\n\t\tcase *QueryPartialSchema:\n\t\t\tq := corev1alpha2.QueryPartialSchema{\n\t\t\t\tName:          fmt.Sprintf(\"partialSchema-%d\", rand.Int31()), //nolint:gosec\n\t\t\t\tPartialSchema: query.schema,\n\t\t\t}\n\t\t\tpartialSchemaQueries = append(partialSchemaQueries, q)\n\t\tdefault:\n\t\t\treturn nil, fmt.Errorf(\"unknown QueryTarget type: %T\", qt)\n\t\t}\n\t}\n\n\tcapability := &corev1alpha2.Capability{\n\t\tSpec: corev1alpha2.CapabilitySpec{\n\t\t\tQueries: []corev1alpha2.Query{\n\t\t\t\t{\n\t\t\t\t\tName:                  fmt.Sprintf(\"query-%d\", rand.Int31()), //nolint:gosec\n\t\t\t\t\tGroupVersionResources: gvrQueries,\n\t\t\t\t\tObjects:               objectQueries,\n\t\t\t\t\tPartialSchemas:        partialSchemaQueries,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\treturn capability, nil\n}\n"
  },
  {
    "path": "capabilities/client/pkg/discovery/generate_test.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage discovery\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"testing\"\n\n\tcorev1 \"k8s.io/api/core/v1\"\n\ttestapigroup \"k8s.io/apimachinery/pkg/apis/testapigroup/v1\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n\trunv1alpha1 \"github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1\"\n)\n\n// Create an unknownQueryType that implements QueryTarget interface to ensure\n// the correct error is triggered in one of table test cases.\ntype unknownQueryType string\n\nfunc (unk unknownQueryType) Name() string {\n\treturn \"\"\n}\nfunc (unk unknownQueryType) Run(_ *clusterQueryClientConfig) (bool, error) {\n\treturn false, nil\n}\nfunc (unk unknownQueryType) Reason() string {\n\treturn \"\"\n}\n\nfunc TestQueryTargetsToCapabilityResource(t *testing.T) {\n\tclusterGVR := Group(\"pondQuery\", testapigroup.SchemeGroupVersion.Group).\n\t\tWithVersions(testapigroup.SchemeGroupVersion.Version).\n\t\tWithResource(\"carps\")\n\n\tkoi := corev1.ObjectReference{\n\t\tKind:       \"Carp\",\n\t\tName:       \"koi\",\n\t\tNamespace:  \"koi-pond\",\n\t\tAPIVersion: testapigroup.SchemeGroupVersion.String(),\n\t}\n\tannotations := map[string]string{\n\t\t\"cluster.x-k8s.io/provider\": \"infrastructure-fake\",\n\t}\n\tclusterObject := Object(\"pondQuery\", &koi).WithAnnotations(annotations)\n\n\tclusterSchema := Schema(\"pondQuery\", \"partial schema\")\n\n\ttestCases := []struct {\n\t\tdescription  string\n\t\tqueryTargets []QueryTarget\n\t\twant         runv1alpha1.Capability\n\t\terr          error\n\t}{\n\t\t{\n\t\t\tdescription:  \"one of each query target type (gvr, object, and partial schema)\",\n\t\t\tqueryTargets: []QueryTarget{clusterGVR, clusterObject, clusterSchema},\n\t\t\twant: runv1alpha1.Capability{\n\t\t\t\tSpec: runv1alpha1.CapabilitySpec{\n\t\t\t\t\tQueries: []runv1alpha1.Query{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tGroupVersionResources: []runv1alpha1.QueryGVR{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tGroup:    testapigroup.SchemeGroupVersion.Group,\n\t\t\t\t\t\t\t\t\tResource: \"carps\",\n\t\t\t\t\t\t\t\t\tVersions: []string{testapigroup.SchemeGroupVersion.Version},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tObjects: []runv1alpha1.QueryObject{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tObjectReference:    koi,\n\t\t\t\t\t\t\t\t\tWithAnnotations:    annotations,\n\t\t\t\t\t\t\t\t\tWithoutAnnotations: map[string]string{},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tPartialSchemas: []runv1alpha1.QueryPartialSchema{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tPartialSchema: \"partial schema\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\terr: nil,\n\t\t},\n\t\t{\n\t\t\tdescription:  \"unknown query type\",\n\t\t\tqueryTargets: []QueryTarget{unknownQueryType(\"shark\")},\n\t\t\terr:          fmt.Errorf(\"unknown QueryTarget type: %T\", unknownQueryType(\"shark\")),\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tgot, err := QueryTargetsToCapabilityResource(tc.queryTargets)\n\n\t\t\tif tc.err == nil {\n\t\t\t\t// Check QueryGVR fields.\n\t\t\t\tif len(got.Spec.Queries[0].GroupVersionResources[0].Name) == 0 {\n\t\t\t\t\tt.Errorf(\"QueryGVR name: got: %s, but want: a non-empty string\", got.Spec.Queries[0].GroupVersionResources[0].Name)\n\t\t\t\t}\n\t\t\t\tif got.Spec.Queries[0].GroupVersionResources[0].Group != tc.want.Spec.Queries[0].GroupVersionResources[0].Group {\n\t\t\t\t\tt.Errorf(\"QueryGVR resource group: got: %s, but want: %s\", got.Spec.Queries[0].GroupVersionResources[0].Group, tc.want.Spec.Queries[0].GroupVersionResources[0].Group)\n\t\t\t\t}\n\t\t\t\tif !reflect.DeepEqual(got.Spec.Queries[0].GroupVersionResources[0].Versions, tc.want.Spec.Queries[0].GroupVersionResources[0].Versions) {\n\t\t\t\t\tt.Errorf(\"QueryGVR versions: got: %+v, but want: %+v\", got.Spec.Queries[0].GroupVersionResources[0].Versions, tc.want.Spec.Queries[0].GroupVersionResources[0].Versions)\n\t\t\t\t}\n\n\t\t\t\t// Check QueryObject fields.\n\t\t\t\tif len(got.Spec.Queries[0].Objects[0].Name) == 0 {\n\t\t\t\t\tt.Errorf(\"QueryObject name: got: %s, but want: a non-empty string\", got.Spec.Queries[0].Objects[0].Name)\n\t\t\t\t}\n\t\t\t\tif got.Spec.Queries[0].Objects[0].ObjectReference != tc.want.Spec.Queries[0].Objects[0].ObjectReference {\n\t\t\t\t\tt.Errorf(\"QueryObject object reference: got: %+v, but want: %+v\", got.Spec.Queries[0].Objects[0].ObjectReference, tc.want.Spec.Queries[0].Objects[0].ObjectReference)\n\t\t\t\t}\n\t\t\t\tif !reflect.DeepEqual(got.Spec.Queries[0].Objects[0].WithAnnotations, tc.want.Spec.Queries[0].Objects[0].WithAnnotations) {\n\t\t\t\t\tt.Errorf(\"QueryGVR versions: got: %+v, but want: %+v\", got.Spec.Queries[0].Objects[0].WithAnnotations, tc.want.Spec.Queries[0].Objects[0].WithAnnotations)\n\t\t\t\t}\n\t\t\t\tif !reflect.DeepEqual(got.Spec.Queries[0].Objects[0].WithoutAnnotations, tc.want.Spec.Queries[0].Objects[0].WithoutAnnotations) {\n\t\t\t\t\tt.Errorf(\"QueryGVR versions: got: %+v, but want: %+v\", got.Spec.Queries[0].Objects[0].WithoutAnnotations, tc.want.Spec.Queries[0].Objects[0].WithoutAnnotations)\n\t\t\t\t}\n\n\t\t\t\t// Check QueryPartialSchema fields.\n\t\t\t\tif len(got.Spec.Queries[0].PartialSchemas[0].Name) == 0 {\n\t\t\t\t\tt.Errorf(\"QueryPartialSchema name: got: %s, but want: a non-empty string\", got.Spec.Queries[0].PartialSchemas[0].Name)\n\t\t\t\t}\n\t\t\t\tif got.Spec.Queries[0].PartialSchemas[0].PartialSchema != tc.want.Spec.Queries[0].PartialSchemas[0].PartialSchema {\n\t\t\t\t\tt.Errorf(\"QueryPartialSchema partial schema: got: %s, but want: %s\", got.Spec.Queries[0].PartialSchemas[0].PartialSchema, tc.want.Spec.Queries[0].PartialSchemas[0].PartialSchema)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif tc.err != nil {\n\t\t\t\tif err.Error() != tc.err.Error() {\n\t\t\t\t\tt.Errorf(\"want error: %s but got: %s\", tc.err, err)\n\t\t\t\t}\n\t\t\t\tif got != nil {\n\t\t\t\t\tt.Errorf(\"expected nil Capability object, but got: %+v\", got)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestQueryTargetsToCapability(t *testing.T) {\n\tclusterGVR := Group(\"pondQuery\", testapigroup.SchemeGroupVersion.Group).\n\t\tWithVersions(testapigroup.SchemeGroupVersion.Version).\n\t\tWithResource(\"carps\")\n\n\tkoi := corev1.ObjectReference{\n\t\tKind:       \"Carp\",\n\t\tName:       \"koi\",\n\t\tNamespace:  \"koi-pond\",\n\t\tAPIVersion: testapigroup.SchemeGroupVersion.String(),\n\t}\n\tannotations := map[string]string{\n\t\t\"cluster.x-k8s.io/provider\": \"infrastructure-fake\",\n\t}\n\tclusterObject := Object(\"pondQuery\", &koi).WithAnnotations(annotations)\n\n\tclusterSchema := Schema(\"pondQuery\", \"partial schema\")\n\n\ttestCases := []struct {\n\t\tdescription  string\n\t\tqueryTargets []QueryTarget\n\t\twant         corev1alpha2.Capability\n\t\terr          error\n\t}{\n\t\t{\n\t\t\tdescription:  \"one of each query target type (gvr, object, and partial schema)\",\n\t\t\tqueryTargets: []QueryTarget{clusterGVR, clusterObject, clusterSchema},\n\t\t\twant: corev1alpha2.Capability{\n\t\t\t\tSpec: corev1alpha2.CapabilitySpec{\n\t\t\t\t\tQueries: []corev1alpha2.Query{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tGroupVersionResources: []corev1alpha2.QueryGVR{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tGroup:    testapigroup.SchemeGroupVersion.Group,\n\t\t\t\t\t\t\t\t\tResource: \"carps\",\n\t\t\t\t\t\t\t\t\tVersions: []string{testapigroup.SchemeGroupVersion.Version},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tObjects: []corev1alpha2.QueryObject{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tObjectReference:    koi,\n\t\t\t\t\t\t\t\t\tWithAnnotations:    annotations,\n\t\t\t\t\t\t\t\t\tWithoutAnnotations: map[string]string{},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tPartialSchemas: []corev1alpha2.QueryPartialSchema{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tPartialSchema: \"partial schema\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\terr: nil,\n\t\t},\n\t\t{\n\t\t\tdescription:  \"unknown query type\",\n\t\t\tqueryTargets: []QueryTarget{unknownQueryType(\"shark\")},\n\t\t\terr:          fmt.Errorf(\"unknown QueryTarget type: %T\", unknownQueryType(\"shark\")),\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tgot, err := QueryTargetsToCapabilityResource(tc.queryTargets)\n\n\t\t\tif tc.err == nil {\n\t\t\t\t// Check QueryGVR fields.\n\t\t\t\tif len(got.Spec.Queries[0].GroupVersionResources[0].Name) == 0 {\n\t\t\t\t\tt.Errorf(\"QueryGVR name: got: %s, but want: a non-empty string\", got.Spec.Queries[0].GroupVersionResources[0].Name)\n\t\t\t\t}\n\t\t\t\tif got.Spec.Queries[0].GroupVersionResources[0].Group != tc.want.Spec.Queries[0].GroupVersionResources[0].Group {\n\t\t\t\t\tt.Errorf(\"QueryGVR resource group: got: %s, but want: %s\", got.Spec.Queries[0].GroupVersionResources[0].Group, tc.want.Spec.Queries[0].GroupVersionResources[0].Group)\n\t\t\t\t}\n\t\t\t\tif !reflect.DeepEqual(got.Spec.Queries[0].GroupVersionResources[0].Versions, tc.want.Spec.Queries[0].GroupVersionResources[0].Versions) {\n\t\t\t\t\tt.Errorf(\"QueryGVR versions: got: %+v, but want: %+v\", got.Spec.Queries[0].GroupVersionResources[0].Versions, tc.want.Spec.Queries[0].GroupVersionResources[0].Versions)\n\t\t\t\t}\n\n\t\t\t\t// Check QueryObject fields.\n\t\t\t\tif len(got.Spec.Queries[0].Objects[0].Name) == 0 {\n\t\t\t\t\tt.Errorf(\"QueryObject name: got: %s, but want: a non-empty string\", got.Spec.Queries[0].Objects[0].Name)\n\t\t\t\t}\n\t\t\t\tif got.Spec.Queries[0].Objects[0].ObjectReference != tc.want.Spec.Queries[0].Objects[0].ObjectReference {\n\t\t\t\t\tt.Errorf(\"QueryObject object reference: got: %+v, but want: %+v\", got.Spec.Queries[0].Objects[0].ObjectReference, tc.want.Spec.Queries[0].Objects[0].ObjectReference)\n\t\t\t\t}\n\t\t\t\tif !reflect.DeepEqual(got.Spec.Queries[0].Objects[0].WithAnnotations, tc.want.Spec.Queries[0].Objects[0].WithAnnotations) {\n\t\t\t\t\tt.Errorf(\"QueryGVR versions: got: %+v, but want: %+v\", got.Spec.Queries[0].Objects[0].WithAnnotations, tc.want.Spec.Queries[0].Objects[0].WithAnnotations)\n\t\t\t\t}\n\t\t\t\tif !reflect.DeepEqual(got.Spec.Queries[0].Objects[0].WithoutAnnotations, tc.want.Spec.Queries[0].Objects[0].WithoutAnnotations) {\n\t\t\t\t\tt.Errorf(\"QueryGVR versions: got: %+v, but want: %+v\", got.Spec.Queries[0].Objects[0].WithoutAnnotations, tc.want.Spec.Queries[0].Objects[0].WithoutAnnotations)\n\t\t\t\t}\n\n\t\t\t\t// Check QueryPartialSchema fields.\n\t\t\t\tif len(got.Spec.Queries[0].PartialSchemas[0].Name) == 0 {\n\t\t\t\t\tt.Errorf(\"QueryPartialSchema name: got: %s, but want: a non-empty string\", got.Spec.Queries[0].PartialSchemas[0].Name)\n\t\t\t\t}\n\t\t\t\tif got.Spec.Queries[0].PartialSchemas[0].PartialSchema != tc.want.Spec.Queries[0].PartialSchemas[0].PartialSchema {\n\t\t\t\t\tt.Errorf(\"QueryPartialSchema partial schema: got: %s, but want: %s\", got.Spec.Queries[0].PartialSchemas[0].PartialSchema, tc.want.Spec.Queries[0].PartialSchemas[0].PartialSchema)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif tc.err != nil {\n\t\t\t\tif err.Error() != tc.err.Error() {\n\t\t\t\t\tt.Errorf(\"want error: %s but got: %s\", tc.err, err)\n\t\t\t\t}\n\t\t\t\tif got != nil {\n\t\t\t\t\tt.Errorf(\"expected nil Capability object, but got: %+v\", got)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "capabilities/client/pkg/discovery/tkg/README.md",
    "content": "# TKG Discovery\n\nThis repository is a collection of constants and functions which expose Discovery queries aimed at making it simple to\nextend and integrate with TKG.\n\nInitialize a new TKG `DiscoveryClient` using `rest.Config`. Then, you can run any existing queries:\n\n```go\ntkg, err := NewDiscoveryClientForConfig(cfg)\nif err != nil {\n    log.Fatal(err)\n}\n\nif tkg.IsManagementCluster() {\n    log.Info(\"Management cluster\")\n}\n```\n"
  },
  {
    "path": "capabilities/client/pkg/discovery/tkg/capabilities.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage tkg\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"gopkg.in/yaml.v3\"\n\tcorev1 \"k8s.io/api/core/v1\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\n\trunv1alpha1 \"github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1\"\n\t\"github.com/vmware-tanzu/tanzu-framework/capabilities/client/pkg/discovery\"\n)\n\nconst (\n\t// clusterTypeManagement is the management cluster type.\n\tclusterTypeManagement = \"management\"\n\t// clusterTypeWorkload is the workload cluster type.\n\tclusterTypeWorkload = \"workload\"\n\n\t// metadataConfigMapNamespace is the namespace of the cluster metadata configmap.\n\tmetadataConfigMapNamespace = \"tkg-system-public\"\n\t// metadataConfigMapName is the name of the cluster metadata configmap.\n\tmetadataConfigMapName = \"tkg-metadata\"\n\n\t// namespaceNSX is the name of NSX namespace.\n\tnamespaceNSX = \"vmware-system-nsx\"\n)\n\n// IsTKGm returns true if the cluster is a TKGm cluster.\n// Deprecated: This function will be removed in a future release.\nfunc (dc *DiscoveryClient) IsTKGm(ctx context.Context) (bool, error) {\n\treturn dc.HasInfrastructureProvider(ctx, InfrastructureProviderVsphere)\n}\n\n// IsTKGS returns true if the cluster is a TKGS cluster. Checks for the existence of any TKC API version.\n// Deprecated: This function will be removed in a future release.\nfunc (dc *DiscoveryClient) IsTKGS(_ context.Context) (bool, error) {\n\tquery := discovery.Group(\"tkc\", runv1alpha1.GroupVersion.Group).\n\t\tWithResource(\"tanzukubernetesclusters\")\n\treturn dc.clusterQueryClient.PreparedQuery(query)()\n}\n\n// IsManagementCluster returns true if the cluster is a TKG management cluster.\n// Deprecated: This function will be removed in a future release.\nfunc (dc *DiscoveryClient) IsManagementCluster(ctx context.Context) (bool, error) {\n\ts, err := clusterTypeFromMetadataConfigMap(ctx, dc.k8sClient)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\treturn s == clusterTypeManagement, nil\n}\n\n// IsWorkloadCluster returns true if the cluster is a TKG workload cluster.\n// Deprecated: This function will be removed in a future release.\nfunc (dc *DiscoveryClient) IsWorkloadCluster(ctx context.Context) (bool, error) {\n\ts, err := clusterTypeFromMetadataConfigMap(ctx, dc.k8sClient)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\treturn s == clusterTypeWorkload, nil\n}\n\n// clusterTypeFromMetadataConfigMap fetches cluster type from tkg-metadata configmap.\nfunc clusterTypeFromMetadataConfigMap(ctx context.Context, c client.Client) (string, error) {\n\tcm := &corev1.ConfigMap{}\n\tkey := client.ObjectKey{Namespace: metadataConfigMapNamespace, Name: metadataConfigMapName}\n\tif err := c.Get(ctx, key, cm); err != nil {\n\t\treturn \"\", err\n\t}\n\n\tdata, ok := cm.Data[\"metadata.yaml\"]\n\tif !ok {\n\t\treturn \"\", fmt.Errorf(\"failed to get cluster type: metadata.yaml key not found in configmap %s\", key.String())\n\t}\n\n\tmetadata := &ClusterMetadata{}\n\tif err := yaml.Unmarshal([]byte(data), metadata); err != nil {\n\t\treturn \"\", fmt.Errorf(\"failed to get cluster type: %w\", err)\n\t}\n\tswitch strings.ToLower(metadata.Cluster.Type) {\n\tcase clusterTypeManagement:\n\t\treturn clusterTypeManagement, nil\n\tcase clusterTypeWorkload:\n\t\treturn clusterTypeWorkload, nil\n\t}\n\treturn \"\", fmt.Errorf(\"unknown cluster type: %v\", metadata.Cluster.Type)\n}\n\n// HasNSX indicates if a cluster has NSX capabilities.\n// Deprecated: This function will be removed in a future release.\nfunc (dc *DiscoveryClient) HasNSX(_ context.Context) (bool, error) {\n\tnsx := &corev1.ObjectReference{\n\t\tKind:       \"Namespace\",\n\t\tName:       namespaceNSX,\n\t\tAPIVersion: corev1.SchemeGroupVersion.Version,\n\t}\n\tquery := discovery.Object(\"nsx\", nsx)\n\treturn dc.clusterQueryClient.PreparedQuery(query)()\n}\n"
  },
  {
    "path": "capabilities/client/pkg/discovery/tkg/capabilities_test.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage tkg\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\n\tcorev1 \"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n)\n\nfunc TestHasNSX(t *testing.T) {\n\tdiscoveryClientFor := func(ns *corev1.Namespace) (*DiscoveryClient, error) {\n\t\treturn newFakeDiscoveryClient(coreAPIResourceList, Scheme, []runtime.Object{ns})\n\t}\n\n\ttestCases := []struct {\n\t\tdescription string\n\t\tns          *corev1.Namespace\n\t\twant        bool\n\t}{\n\t\t{\"NSX found\", &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: namespaceNSX}}, true},\n\t\t{\"NSX not found\", &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: \"foo\"}}, false},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tdc, err := discoveryClientFor(tc.ns)\n\t\t\tif err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t}\n\n\t\t\tgot, err := dc.HasNSX(context.Background())\n\t\t\tif err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t}\n\n\t\t\tif got != tc.want {\n\t\t\t\tt.Errorf(\"got=%t, want=%t\", got, tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestIsTKGS(t *testing.T) {\n\tdiscoveryClientWithTKC := func() (*DiscoveryClient, error) {\n\t\treturn newFakeDiscoveryClient(tanzuRunAPIResourceList, Scheme, nil)\n\t}\n\n\tdiscoveryClientWithoutTKC := func() (*DiscoveryClient, error) {\n\t\treturn newFakeDiscoveryClient([]*metav1.APIResourceList{}, Scheme, nil)\n\t}\n\n\ttestCases := []struct {\n\t\tdescription       string\n\t\tdiscoveryClientFn func() (*DiscoveryClient, error)\n\t\terrExpected       bool\n\t\twant              bool\n\t}{\n\t\t{\"TKGS exists\", discoveryClientWithTKC, false, true},\n\t\t{\"TKGS does not exist\", discoveryClientWithoutTKC, false, false},\n\t}\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tdc, err := tc.discoveryClientFn()\n\t\t\tif err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t}\n\t\t\tgot, err := dc.IsTKGS(context.Background())\n\t\t\tif err != nil && !tc.errExpected {\n\t\t\t\tt.Error(err)\n\t\t\t}\n\t\t\tif got != tc.want {\n\t\t\t\tt.Errorf(\"got: %t, want %t\", got, tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nvar clusterInfo = `\ncluster:\n  name: tkg-cluster-wc-765\n  type: %s\n  plan: dev\n  kubernetesProvider: VMware Tanzu Kubernetes Grid\n  tkgVersion: 1.2.1\n  infrastructure:\n    provider: vsphere\n`\n\nfunc metadataConfigMapFor(clusterType string) *corev1.ConfigMap {\n\tmetadata := fmt.Sprintf(clusterInfo, clusterType)\n\treturn &corev1.ConfigMap{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName:      metadataConfigMapName,\n\t\t\tNamespace: metadataConfigMapNamespace,\n\t\t},\n\t\tData: map[string]string{\n\t\t\t\"metadata.yaml\": metadata,\n\t\t},\n\t}\n}\n\nfunc discoveryClientForConfigMap(cm *corev1.ConfigMap) (*DiscoveryClient, error) {\n\treturn newFakeDiscoveryClient([]*metav1.APIResourceList{}, Scheme, []runtime.Object{cm})\n}\n\nfunc TestIsManagementCluster(t *testing.T) {\n\ttestCases := []struct {\n\t\tdescription string\n\t\tclusterType string\n\t\tconfigMapFn func(clusterType string) *corev1.ConfigMap\n\t\twant        bool\n\t\terr         string\n\t}{\n\t\t{\"management cluster\", clusterTypeManagement, metadataConfigMapFor, true, \"\"},\n\t\t{\"not management cluster\", clusterTypeWorkload, metadataConfigMapFor, false, \"\"},\n\t\t{\"unknown cluster type\", \"foo\", metadataConfigMapFor, false, \"unknown cluster type: foo\"},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tdc, err := discoveryClientForConfigMap(tc.configMapFn(tc.clusterType))\n\t\t\tif err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t}\n\n\t\t\tgot, err := dc.IsManagementCluster(context.Background())\n\t\t\tif err != nil {\n\t\t\t\tif tc.err == \"\" {\n\t\t\t\t\tt.Errorf(\"no error string specified, but got error: %v\", err)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(err.Error(), tc.err) {\n\t\t\t\t\tt.Errorf(\"error string=%q doesn't match partial=%q\", tc.err, err)\n\t\t\t\t}\n\t\t\t} else if tc.err != \"\" {\n\t\t\t\tt.Errorf(\"error string=%q specified but error not found\", tc.err)\n\t\t\t}\n\n\t\t\tif got != tc.want {\n\t\t\t\tt.Errorf(\"got=%t, want=%t\", got, tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestIsWorkloadCluster(t *testing.T) {\n\ttestCases := []struct {\n\t\tdescription string\n\t\tclusterType string\n\t\tconfigMapFn func(clusterType string) *corev1.ConfigMap\n\t\twant        bool\n\t\terr         string\n\t}{\n\t\t{\"workload cluster\", clusterTypeWorkload, metadataConfigMapFor, true, \"\"},\n\t\t{\"not management cluster\", clusterTypeManagement, metadataConfigMapFor, false, \"\"},\n\t\t{\"unknown cluster type\", \"foo\", metadataConfigMapFor, false, \"unknown cluster type: foo\"},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tdc, err := discoveryClientForConfigMap(tc.configMapFn(tc.clusterType))\n\t\t\tif err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t}\n\n\t\t\tgot, err := dc.IsWorkloadCluster(context.Background())\n\t\t\tif err != nil {\n\t\t\t\tif tc.err == \"\" {\n\t\t\t\t\tt.Errorf(\"no error string specified, but got error: %v\", err)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(err.Error(), tc.err) {\n\t\t\t\t\tt.Errorf(\"error string=%q doesn't match partial=%q\", tc.err, err)\n\t\t\t\t}\n\t\t\t} else if tc.err != \"\" {\n\t\t\t\tt.Errorf(\"error string=%q specified but error not found\", tc.err)\n\t\t\t}\n\n\t\t\tif got != tc.want {\n\t\t\t\tt.Errorf(\"got=%t, want=%t\", got, tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "capabilities/client/pkg/discovery/tkg/client.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage tkg\n\nimport (\n\tcorev1 \"k8s.io/api/core/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\tutilruntime \"k8s.io/apimachinery/pkg/util/runtime\"\n\t\"k8s.io/client-go/rest\"\n\tclusterctl \"sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\n\trunv1alpha1 \"github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1\"\n\t\"github.com/vmware-tanzu/tanzu-framework/capabilities/client/pkg/discovery\"\n)\n\n// Scheme is a scheme that knows about TKG resources that are used to determine capabilities.\nvar Scheme = runtime.NewScheme()\n\nfunc init() {\n\tutilruntime.Must(runv1alpha1.AddToScheme(Scheme))\n\tutilruntime.Must(clusterctl.AddToScheme(Scheme))\n\tutilruntime.Must(corev1.AddToScheme(Scheme))\n}\n\n// DiscoveryClient allows clients to determine capabilities of a TKG cluster.\n// Deprecated: This struct type will be removed in a future release.\ntype DiscoveryClient struct {\n\tk8sClient          client.Client\n\tclusterQueryClient *discovery.ClusterQueryClient\n}\n\n// NewDiscoveryClientForConfig returns a DiscoveryClient for a rest.Config.\n// Deprecated: This function will be removed in a future release.\nfunc NewDiscoveryClientForConfig(config *rest.Config) (*DiscoveryClient, error) {\n\tc, err := client.New(config, client.Options{Scheme: Scheme})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tqueryClient, err := discovery.NewClusterQueryClientForConfig(config)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &DiscoveryClient{k8sClient: c, clusterQueryClient: queryClient}, err\n}\n\n// NewDiscoveryClient returns a DiscoveryClient for a controller-runtime Client and ClusterQueryClient.\n// Deprecated: This function will be removed in a future release.\nfunc NewDiscoveryClient(c client.Client, clusterQueryClient *discovery.ClusterQueryClient) *DiscoveryClient {\n\treturn &DiscoveryClient{k8sClient: c, clusterQueryClient: clusterQueryClient}\n}\n"
  },
  {
    "path": "capabilities/client/pkg/discovery/tkg/cloudprovider.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage tkg\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\tcorev1 \"k8s.io/api/core/v1\"\n)\n\n// CloudProvider represents the cloud provider of the cluster.\ntype CloudProvider string\n\nconst (\n\t// CloudProviderAWS is the AWS cloud provider.\n\tCloudProviderAWS = CloudProvider(\"aws\")\n\t// CloudProviderAzure is the Azure cloud provider.\n\tCloudProviderAzure = CloudProvider(\"azure\")\n\t// CloudProviderVsphere is the Vsphere cloud provider.\n\tCloudProviderVsphere = CloudProvider(\"vsphere\")\n)\n\n// HasCloudProvider checks if the cluster is configured with the given cloud provider.\n// Deprecated: This function will be removed in a future release.\nfunc (dc *DiscoveryClient) HasCloudProvider(ctx context.Context, cloudProvider CloudProvider) (bool, error) {\n\tif cloudProvider != CloudProviderAWS && cloudProvider != CloudProviderAzure && cloudProvider != CloudProviderVsphere {\n\t\treturn false, fmt.Errorf(\"unsupported cloud provider: %v\", cloudProvider)\n\t}\n\n\tnodeList := &corev1.NodeList{}\n\tif err := dc.k8sClient.List(ctx, nodeList); err != nil {\n\t\treturn false, err\n\t}\n\n\tif len(nodeList.Items) < 1 {\n\t\treturn false, fmt.Errorf(\"failed to identify cloud provider: node list is empty\")\n\t}\n\n\tnode := nodeList.Items[0]\n\tproviderID := strings.Split(node.Spec.ProviderID, \":\")\n\tif len(providerID) < 2 {\n\t\treturn false, fmt.Errorf(\"unknown cloud provider\")\n\t}\n\tprovider := strings.ToLower(providerID[0])\n\n\treturn string(cloudProvider) == provider, nil\n}\n"
  },
  {
    "path": "capabilities/client/pkg/discovery/tkg/cloudprovider_test.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage tkg\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\n\tcorev1 \"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n)\n\nfunc nodeFor(cloudProvider CloudProvider) *corev1.Node {\n\treturn &corev1.Node{\n\t\tSpec: corev1.NodeSpec{ProviderID: fmt.Sprintf(\"%s://xxx-xxxx-xxxx\", cloudProvider)},\n\t}\n}\n\nfunc discoveryClientForNode(node *corev1.Node) (*DiscoveryClient, error) {\n\tvar objs []runtime.Object\n\tif node != nil {\n\t\tobjs = append(objs, node)\n\t}\n\treturn newFakeDiscoveryClient([]*metav1.APIResourceList{}, Scheme, objs)\n}\n\nfunc TestHasCloudProvider(t *testing.T) {\n\ttestCases := []struct {\n\t\tdescription   string\n\t\tcloudProvider CloudProvider\n\t\tnodeFn        func(cloudProvider CloudProvider) *corev1.Node\n\t\terr           string\n\t\twant          bool\n\t}{\n\t\t{\"aws\", CloudProviderAWS, nodeFor, \"\", true},\n\t\t{\"azure\", CloudProviderAzure, nodeFor, \"\", true},\n\t\t{\"vsphere\", CloudProviderVsphere, nodeFor, \"\", true},\n\t\t{\"empty node list\", CloudProviderVsphere, func(cloudProvider CloudProvider) *corev1.Node {\n\t\t\treturn nil\n\t\t}, \"node list is empty\", false},\n\t\t{\"unknown\", CloudProvider(\"unknown\"), nodeFor, \"unsupported cloud provider\", false},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tdc, err := discoveryClientForNode(tc.nodeFn(tc.cloudProvider))\n\t\t\tif err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t}\n\n\t\t\tgot, err := dc.HasCloudProvider(context.Background(), tc.cloudProvider)\n\t\t\tif err != nil {\n\t\t\t\tif tc.err == \"\" {\n\t\t\t\t\tt.Errorf(\"no error string specified, but got error: %v\", err)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(err.Error(), tc.err) {\n\t\t\t\t\tt.Errorf(\"error string=%q doesn't match partial=%q\", tc.err, err)\n\t\t\t\t}\n\t\t\t} else if tc.err != \"\" {\n\t\t\t\tt.Errorf(\"error string=%q specified but error not found\", tc.err)\n\t\t\t}\n\n\t\t\tif got != tc.want {\n\t\t\t\tt.Errorf(\"got=%t, want=%t\", got, tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "capabilities/client/pkg/discovery/tkg/clustermetadata.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage tkg\n\n// ClusterMetadata is currently needed by one of the pre-defined queries in capabilities SDK\n// to tell if a cluster is a management or a workload cluster\n// Deprecated: This struct type will be removed in a future release.\ntype ClusterMetadata struct {\n\tCluster Cluster `json:\"cluster\" yaml:\"cluster\"`\n}\n\n// Cluster stores information about the cluster.\n// Deprecated: This struct type will be removed in a future release.\ntype Cluster struct {\n\tName               string         `json:\"name\" yaml:\"name\"`\n\tType               string         `json:\"type\" yaml:\"type\"`\n\tPlan               string         `json:\"plan\" yaml:\"plan\"`\n\tKubernetesProvider string         `json:\"kubernetesProvider\" yaml:\"kubernetesProvider\"`\n\tTkgVersion         string         `json:\"tkgVersion\" yaml:\"tkgVersion\"`\n\tInfrastructure     Infrastructure `json:\"infrastructure\" yaml:\"infrastructure\"`\n}\n\n// Infrastructure represents the cluster's infrastructure provider.\n// Deprecated: This struct type will be removed in a future release.\ntype Infrastructure struct {\n\tProvider string `json:\"provider\" yaml:\"provider\"`\n}\n"
  },
  {
    "path": "capabilities/client/pkg/discovery/tkg/doc.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package tkg exports constants and functions to help evaluate the state of a TKG cluster.\n// Deprecated: The tkg package will be removed in a future release.\npackage tkg\n"
  },
  {
    "path": "capabilities/client/pkg/discovery/tkg/fake.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage tkg\n\nimport (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\tctrlfake \"sigs.k8s.io/controller-runtime/pkg/client/fake\"\n\n\trunv1alpha1 \"github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1\"\n\trunv1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha2\"\n\trunv1alpha3 \"github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3\"\n\t\"github.com/vmware-tanzu/tanzu-framework/capabilities/client/pkg/discovery\"\n)\n\nvar (\n\t// tanzuRunAPIResourceList is a list of run.tanzu.vmware.com resources for use in tests.\n\ttanzuRunAPIResourceList = []*metav1.APIResourceList{\n\t\t{\n\t\t\tGroupVersion: runv1alpha1.GroupVersion.String(),\n\t\t\tAPIResources: []metav1.APIResource{\n\t\t\t\t{\n\t\t\t\t\tName:       \"tanzukubernetesreleases\",\n\t\t\t\t\tKind:       \"TanzuKubernetesRelease\",\n\t\t\t\t\tGroup:      runv1alpha1.GroupVersion.Group,\n\t\t\t\t\tVersion:    runv1alpha1.GroupVersion.Version,\n\t\t\t\t\tNamespaced: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName:       \"tanzukubernetesclusters\",\n\t\t\t\t\tKind:       \"TanzuKubernetesCluster\",\n\t\t\t\t\tGroup:      runv1alpha1.GroupVersion.Group,\n\t\t\t\t\tVersion:    runv1alpha1.GroupVersion.Version,\n\t\t\t\t\tNamespaced: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName:       \"tanzukubernetesreleases\",\n\t\t\t\t\tKind:       \"TanzuKubernetesRelease\",\n\t\t\t\t\tGroup:      runv1alpha2.GroupVersion.Group,\n\t\t\t\t\tVersion:    runv1alpha2.GroupVersion.Version,\n\t\t\t\t\tNamespaced: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName:       \"tanzukubernetesclusters\",\n\t\t\t\t\tKind:       \"TanzuKubernetesCluster\",\n\t\t\t\t\tGroup:      runv1alpha2.GroupVersion.Group,\n\t\t\t\t\tVersion:    runv1alpha2.GroupVersion.Version,\n\t\t\t\t\tNamespaced: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName:       \"tanzukubernetesreleases\",\n\t\t\t\t\tKind:       \"TanzuKubernetesRelease\",\n\t\t\t\t\tGroup:      runv1alpha3.GroupVersion.Group,\n\t\t\t\t\tVersion:    runv1alpha3.GroupVersion.Version,\n\t\t\t\t\tNamespaced: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName:       \"tanzukubernetesclusters\",\n\t\t\t\t\tKind:       \"TanzuKubernetesCluster\",\n\t\t\t\t\tGroup:      runv1alpha3.GroupVersion.Group,\n\t\t\t\t\tVersion:    runv1alpha3.GroupVersion.Version,\n\t\t\t\t\tNamespaced: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\t// coreAPIResourceList is a list of corev1 resources for use in tests.\n\tcoreAPIResourceList = []*metav1.APIResourceList{\n\t\t{\n\t\t\tGroupVersion: \"v1\",\n\t\t\tAPIResources: []metav1.APIResource{\n\t\t\t\t{\n\t\t\t\t\tName:    \"namespaces\",\n\t\t\t\t\tKind:    \"Namespace\",\n\t\t\t\t\tGroup:   \"\",\n\t\t\t\t\tVersion: \"v1\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n)\n\n// newFakeDiscoveryClient returns a fake DiscoveryClient for use in tests.\nfunc newFakeDiscoveryClient(resources []*metav1.APIResourceList, scheme *runtime.Scheme, objs []runtime.Object) (*DiscoveryClient, error) {\n\tfakeK8SClient := ctrlfake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(objs...).Build()\n\tfakeQueryClient, err := discovery.NewFakeClusterQueryClient(resources, scheme, objs)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn NewDiscoveryClient(fakeK8SClient, fakeQueryClient), nil\n}\n"
  },
  {
    "path": "capabilities/client/pkg/discovery/tkg/infraprovider.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage tkg\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\tclusterctl \"sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3\"\n)\n\n// InfrastructureProvider represents the CAPI infrastructure provider of the cluster.\ntype InfrastructureProvider string\n\nconst (\n\t// InfrastructureProviderAWS is the AWS infrastructure provider.\n\tInfrastructureProviderAWS = InfrastructureProvider(\"aws\")\n\t// InfrastructureProviderAzure is the Azure infrastructure provider.\n\tInfrastructureProviderAzure = InfrastructureProvider(\"azure\")\n\t// InfrastructureProviderVsphere is the Vsphere infrastructure provider.\n\tInfrastructureProviderVsphere = InfrastructureProvider(\"vsphere\")\n)\n\n// HasInfrastructureProvider checks the cluster's CAPI infrastructure provider.\n// Deprecated: This function will be removed in a future release.\nfunc (dc *DiscoveryClient) HasInfrastructureProvider(ctx context.Context, infraProvider InfrastructureProvider) (bool, error) {\n\tif infraProvider != InfrastructureProviderAWS && infraProvider != InfrastructureProviderAzure && infraProvider != InfrastructureProviderVsphere {\n\t\treturn false, fmt.Errorf(\"unsupported infrastructure provider: %v\", infraProvider)\n\t}\n\n\tvar providerList clusterctl.ProviderList\n\terr := dc.k8sClient.List(ctx, &providerList)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\tfor i := range providerList.Items {\n\t\tif providerList.Items[i].GetProviderType() != clusterctl.InfrastructureProviderType {\n\t\t\tcontinue\n\t\t}\n\t\tprovider := strings.ToLower(providerList.Items[i].ProviderName)\n\t\treturn string(infraProvider) == provider, nil\n\t}\n\treturn false, fmt.Errorf(\"could not find infrastructure provider\")\n}\n"
  },
  {
    "path": "capabilities/client/pkg/discovery/tkg/infraprovider_test.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage tkg\n\nimport (\n\t\"context\"\n\t\"strings\"\n\t\"testing\"\n\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\tclusterctl \"sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3\"\n)\n\nfunc providerFor(infraProvider InfrastructureProvider) *clusterctl.Provider {\n\treturn &clusterctl.Provider{\n\t\tProviderName: string(infraProvider),\n\t\tType:         string(clusterctl.InfrastructureProviderType),\n\t}\n}\n\nfunc discoveryClientForProvider(provider *clusterctl.Provider) (*DiscoveryClient, error) {\n\tvar objs []runtime.Object\n\tif provider != nil {\n\t\tobjs = append(objs, provider)\n\t}\n\treturn newFakeDiscoveryClient([]*metav1.APIResourceList{}, Scheme, objs)\n}\n\nfunc TestHasInfrastructureProvider(t *testing.T) {\n\ttestCases := []struct {\n\t\tdescription   string\n\t\tinfraProvider InfrastructureProvider\n\t\tproviderFn    func(infraProvider InfrastructureProvider) *clusterctl.Provider\n\t\terr           string\n\t\twant          bool\n\t}{\n\t\t{\"aws\", InfrastructureProviderAWS, providerFor, \"\", true},\n\t\t{\"azure\", InfrastructureProviderAzure, providerFor, \"\", true},\n\t\t{\"vsphere\", InfrastructureProviderVsphere, providerFor, \"\", true},\n\t\t{\"unknown\", InfrastructureProvider(\"unknown\"), providerFor, \"unsupported infrastructure provider\", false},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tdc, err := discoveryClientForProvider(tc.providerFn(tc.infraProvider))\n\t\t\tif err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t}\n\n\t\t\tgot, err := dc.HasInfrastructureProvider(context.Background(), tc.infraProvider)\n\t\t\tif err != nil {\n\t\t\t\tif tc.err == \"\" {\n\t\t\t\t\tt.Errorf(\"no error string specified, but got error: %v\", err)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(err.Error(), tc.err) {\n\t\t\t\t\tt.Errorf(\"error string=%q doesn't match partial=%q\", tc.err, err)\n\t\t\t\t}\n\t\t\t} else if tc.err != \"\" {\n\t\t\t\tt.Errorf(\"error string=%q specified but error not found\", tc.err)\n\t\t\t}\n\n\t\t\tif got != tc.want {\n\t\t\t\tt.Errorf(\"got=%t, want=%t\", got, tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "capabilities/client/pkg/discovery/tkg/resource.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage tkg\n\nimport (\n\t\"context\"\n\n\trunv1alpha1 \"github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1\"\n\t\"github.com/vmware-tanzu/tanzu-framework/capabilities/client/pkg/discovery\"\n)\n\n// HasTanzuRunGroup checks if run.tanzu.vmware.com API group exists and optionally checks versions.\n// Deprecated: This function will be removed in a future release.\nfunc (dc *DiscoveryClient) HasTanzuRunGroup(_ context.Context, versions ...string) (bool, error) {\n\tquery := discovery.Group(\"rungroup\", runv1alpha1.GroupVersion.Group).WithVersions(versions...)\n\treturn dc.clusterQueryClient.PreparedQuery(query)()\n}\n\n// HasTanzuKubernetesClusterV1alpha1 checks if the cluster has TanzuKubernetesCluster v1alpha1 resource.\n// Deprecated: This function will be removed in a future release.\nfunc (dc *DiscoveryClient) HasTanzuKubernetesClusterV1alpha1(_ context.Context) (bool, error) {\n\tquery := discovery.Group(\"tkc\", runv1alpha1.GroupVersion.Group).\n\t\tWithVersions(runv1alpha1.GroupVersion.Version).\n\t\tWithResource(\"tanzukubernetesclusters\")\n\treturn dc.clusterQueryClient.PreparedQuery(query)()\n}\n\n// HasTanzuKubernetesReleaseV1alpha1 checks if the cluster has TanzuKubernetesRelease v1alpha1 resource.\n// Deprecated: This function will be removed in a future release.\nfunc (dc *DiscoveryClient) HasTanzuKubernetesReleaseV1alpha1(_ context.Context) (bool, error) {\n\tquery := discovery.Group(\"tkr\", runv1alpha1.GroupVersion.Group).\n\t\tWithVersions(runv1alpha1.GroupVersion.Version).\n\t\tWithResource(\"tanzukubernetesreleases\")\n\treturn dc.clusterQueryClient.PreparedQuery(query)()\n}\n"
  },
  {
    "path": "capabilities/client/pkg/discovery/tkg/resource_test.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage tkg\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n)\n\nfunc TestHasTanzuRunGroup(t *testing.T) {\n\tdiscoveryClientWithTanzuRunGroup := func() (*DiscoveryClient, error) {\n\t\treturn newFakeDiscoveryClient(tanzuRunAPIResourceList, Scheme, nil)\n\t}\n\n\tdiscoveryClientWithTanzuRunGroupMultipleVersions := func() (*DiscoveryClient, error) {\n\t\tresources := []*metav1.APIResourceList{{GroupVersion: \"run.tanzu.vmware.com/v1\"}}\n\t\tresources = append(resources, tanzuRunAPIResourceList...)\n\t\treturn newFakeDiscoveryClient(resources, Scheme, nil)\n\t}\n\n\tdiscoveryClientWithoutTanzuRunGroup := func() (*DiscoveryClient, error) {\n\t\treturn newFakeDiscoveryClient([]*metav1.APIResourceList{}, Scheme, nil)\n\t}\n\n\ttestCases := []struct {\n\t\tdescription       string\n\t\tdiscoveryClientFn func() (*DiscoveryClient, error)\n\t\tversions          []string\n\t\terrExpected       bool\n\t\twant              bool\n\t}{\n\t\t{\"Tanzu run exists without version if WithVersion method was omittied\", discoveryClientWithTanzuRunGroup, nil, false, true},\n\t\t{\"Tanzu run exists with correct version\", discoveryClientWithTanzuRunGroup, []string{\"v1alpha1\"}, false, true},\n\t\t{\"Tanzu run does not exist with incorrect version\", discoveryClientWithTanzuRunGroup, []string{\"v1\"}, false, false},\n\t\t{\"Tanzu run exists with correct multiple versions\", discoveryClientWithTanzuRunGroupMultipleVersions, []string{\"v1alpha1\", \"v1\"}, false, true},\n\t\t{\"Tanzu run does not exist with incorrect multiple versions\", discoveryClientWithTanzuRunGroupMultipleVersions, []string{\"v1alpha1\", \"v2\"}, false, false},\n\t\t{\"Tanzu run does not exist\", discoveryClientWithoutTanzuRunGroup, nil, false, false},\n\t}\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tdc, err := tc.discoveryClientFn()\n\t\t\tif err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t}\n\t\t\tgot, err := dc.HasTanzuRunGroup(context.Background(), tc.versions...)\n\t\t\tif err != nil && !tc.errExpected {\n\t\t\t\tt.Error(err)\n\t\t\t}\n\t\t\tif got != tc.want {\n\t\t\t\tt.Errorf(\"got: %t, want %t\", got, tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestHasTanzuKubernetesCluster(t *testing.T) {\n\tdiscoveryClientWithTKC := func() (*DiscoveryClient, error) {\n\t\treturn newFakeDiscoveryClient(tanzuRunAPIResourceList, Scheme, nil)\n\t}\n\n\tdiscoveryClientWithoutTKC := func() (*DiscoveryClient, error) {\n\t\treturn newFakeDiscoveryClient([]*metav1.APIResourceList{}, Scheme, nil)\n\t}\n\n\ttestCases := []struct {\n\t\tdescription       string\n\t\tdiscoveryClientFn func() (*DiscoveryClient, error)\n\t\terrExpected       bool\n\t\twant              bool\n\t}{\n\t\t{\"TKR exists\", discoveryClientWithTKC, false, true},\n\t\t{\"TKR does not exist\", discoveryClientWithoutTKC, false, false},\n\t}\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tdc, err := tc.discoveryClientFn()\n\t\t\tif err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t}\n\t\t\tgot, err := dc.HasTanzuKubernetesClusterV1alpha1(context.Background())\n\t\t\tif err != nil && !tc.errExpected {\n\t\t\t\tt.Error(err)\n\t\t\t}\n\t\t\tif got != tc.want {\n\t\t\t\tt.Errorf(\"got: %t, want %t\", got, tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestHasTanzuKubernetesRelease(t *testing.T) {\n\tdiscoveryClientWithTKR := func() (*DiscoveryClient, error) {\n\t\treturn newFakeDiscoveryClient(tanzuRunAPIResourceList, Scheme, nil)\n\t}\n\n\tdiscoveryClientWithoutTKR := func() (*DiscoveryClient, error) {\n\t\treturn newFakeDiscoveryClient([]*metav1.APIResourceList{}, Scheme, nil)\n\t}\n\n\ttestCases := []struct {\n\t\tdescription       string\n\t\tdiscoveryClientFn func() (*DiscoveryClient, error)\n\t\terrExpected       bool\n\t\twant              bool\n\t}{\n\t\t{\"TKR exists\", discoveryClientWithTKR, false, true},\n\t\t{\"TKR does not exist\", discoveryClientWithoutTKR, false, false},\n\t}\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tdc, err := tc.discoveryClientFn()\n\t\t\tif err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t}\n\t\t\tgot, err := dc.HasTanzuKubernetesReleaseV1alpha1(context.Background())\n\t\t\tif err != nil && !tc.errExpected {\n\t\t\t\tt.Error(err)\n\t\t\t}\n\t\t\tif got != tc.want {\n\t\t\t\tt.Errorf(\"got: %t, want %t\", got, tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "capabilities/config/rbac.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\nmetadata:\n  labels:\n    app: tanzu-capabilities-manager\n  name: tanzu-capabilities-manager-sa\n  namespace: tkg-system\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  name: tanzu-capabilities-manager-clusterrole\nrules:\n  - apiGroups:\n      - run.tanzu.vmware.com\n    resources:\n      - capabilities\n    verbs:\n      - create\n      - delete\n      - get\n      - list\n      - patch\n      - update\n      - watch\n  - apiGroups:\n      - run.tanzu.vmware.com\n    resources:\n      - capabilities/status\n    verbs:\n      - get\n      - patch\n      - update\n  - apiGroups:\n      - \"\"\n    resources:\n      - serviceaccounts\n      - secrets\n    verbs:\n      - get\n      - list\n      - watch\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: tanzu-capabilities-manager-clusterrolebinding\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: tanzu-capabilities-manager-clusterrole\nsubjects:\n  - kind: ServiceAccount\n    name: tanzu-capabilities-manager-sa\n    namespace: tkg-system\n---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  labels:\n    app: tanzu-capabilities-manager\n  name: tanzu-capabilities-manager-default-sa\n  namespace: tkg-system\n"
  },
  {
    "path": "capabilities/config/tanzu-capabilities-manager.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  labels:\n    app: tanzu-capabilities-manager\n  name: tanzu-capabilities-controller-manager\n  namespace: tkg-system\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: tanzu-capabilities-manager\n  template:\n    metadata:\n      labels:\n        app: tanzu-capabilities-manager\n    spec:\n      containers:\n        - image:  capabilities-controller-manager:latest\n          imagePullPolicy: IfNotPresent\n          name: manager\n          resources:\n            limits:\n              cpu: 100m\n              memory: 30Mi\n            requests:\n              cpu: 100m\n              memory: 20Mi\n      serviceAccount: tanzu-capabilities-manager-sa\n      terminationGracePeriodSeconds: 10\n      tolerations:\n        - effect: NoSchedule\n          key: node-role.kubernetes.io/master\n        - effect: NoSchedule\n          key: node-role.kubernetes.io/control-plane\n"
  },
  {
    "path": "capabilities/controller/go.mod",
    "content": "module github.com/vmware-tanzu/tanzu-framework/capabilities/controller\n\ngo 1.19\n\nreplace (\n\tgithub.com/vmware-tanzu/tanzu-framework/apis/core => ../../apis/core\n\tgithub.com/vmware-tanzu/tanzu-framework/capabilities/client => ../client\n\tgithub.com/vmware-tanzu/tanzu-framework/util => ../../util\n\tsigs.k8s.io/cluster-api => sigs.k8s.io/cluster-api v1.2.8\n)\n\nrequire (\n\tgithub.com/go-logr/logr v1.2.3\n\tgithub.com/onsi/ginkgo v1.16.5\n\tgithub.com/onsi/gomega v1.20.1\n\tgithub.com/vmware-tanzu/tanzu-framework/apis/core v0.0.0-00010101000000-000000000000\n\tgithub.com/vmware-tanzu/tanzu-framework/capabilities/client v0.0.0-00010101000000-000000000000\n\tgithub.com/vmware-tanzu/tanzu-framework/util v0.0.0-00010101000000-000000000000\n\tk8s.io/api v0.25.4\n\tk8s.io/apimachinery v0.25.4\n\tk8s.io/client-go v0.25.4\n\tsigs.k8s.io/controller-runtime v0.12.3\n)\n\nrequire (\n\tgithub.com/PuerkitoBio/purell v1.1.1 // indirect\n\tgithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/blang/semver v3.5.1+incompatible // indirect\n\tgithub.com/cespare/xxhash/v2 v2.1.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.1 // indirect\n\tgithub.com/emicklei/go-restful/v3 v3.9.0 // indirect\n\tgithub.com/evanphx/json-patch v5.6.0+incompatible // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/go-logr/zapr v1.2.3 // indirect\n\tgithub.com/go-openapi/jsonpointer v0.19.5 // indirect\n\tgithub.com/go-openapi/jsonreference v0.19.6 // indirect\n\tgithub.com/go-openapi/swag v0.21.1 // indirect\n\tgithub.com/gogo/protobuf v1.3.2 // indirect\n\tgithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/gnostic v0.5.7-v3refs // indirect\n\tgithub.com/google/go-cmp v0.5.8 // indirect\n\tgithub.com/google/gofuzz v1.2.0 // indirect\n\tgithub.com/google/uuid v1.3.0 // indirect\n\tgithub.com/imdario/mergo v0.3.12 // indirect\n\tgithub.com/josharian/intern v1.0.0 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kr/pretty v0.2.1 // indirect\n\tgithub.com/mailru/easyjson v0.7.7 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect\n\tgithub.com/nxadm/tail v1.4.8 // indirect\n\tgithub.com/pkg/errors v0.9.1 // indirect\n\tgithub.com/prometheus/client_golang v1.12.2 // indirect\n\tgithub.com/prometheus/client_model v0.2.0 // indirect\n\tgithub.com/prometheus/common v0.32.1 // indirect\n\tgithub.com/prometheus/procfs v0.7.3 // indirect\n\tgithub.com/spf13/pflag v1.0.5 // indirect\n\tgithub.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-20230419030809-7081502ebf68 // indirect\n\tgo.uber.org/atomic v1.9.0 // indirect\n\tgo.uber.org/multierr v1.7.0 // indirect\n\tgo.uber.org/zap v1.21.0 // indirect\n\tgolang.org/x/net v0.8.0 // indirect\n\tgolang.org/x/oauth2 v0.3.0 // indirect\n\tgolang.org/x/sys v0.6.0 // indirect\n\tgolang.org/x/term v0.6.0 // indirect\n\tgolang.org/x/text v0.8.0 // indirect\n\tgolang.org/x/time v0.3.0 // indirect\n\tgomodules.xyz/jsonpatch/v2 v2.2.0 // indirect\n\tgoogle.golang.org/appengine v1.6.7 // indirect\n\tgoogle.golang.org/protobuf v1.28.1 // indirect\n\tgopkg.in/inf.v0 v0.9.1 // indirect\n\tgopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect\n\tgopkg.in/yaml.v2 v2.4.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tk8s.io/apiextensions-apiserver v0.25.4 // indirect\n\tk8s.io/component-base v0.25.4 // indirect\n\tk8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54 // indirect\n\tk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect\n\tk8s.io/kubectl v0.24.0 // indirect\n\tk8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 // indirect\n\tsigs.k8s.io/cluster-api v1.2.8 // indirect\n\tsigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect\n\tsigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect\n\tsigs.k8s.io/yaml v1.3.0 // indirect\n)\n"
  },
  {
    "path": "capabilities/controller/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=\ncloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=\ncloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=\ncloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=\ncloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngithub.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=\ngithub.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=\ngithub.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA=\ngithub.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M=\ngithub.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=\ngithub.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=\ngithub.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=\ngithub.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E=\ngithub.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=\ngithub.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=\ngithub.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=\ngithub.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=\ngithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=\ngithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=\ngithub.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=\ngithub.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=\ngithub.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=\ngithub.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=\ngithub.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=\ngithub.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=\ngithub.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=\ngithub.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE=\ngithub.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=\ngithub.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=\ngithub.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=\ngithub.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=\ngithub.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=\ngithub.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE=\ngithub.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ=\ngithub.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=\ngithub.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=\ngithub.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U=\ngithub.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=\ngithub.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4=\ngithub.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=\ngithub.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=\ngithub.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=\ngithub.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=\ngithub.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=\ngithub.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg=\ngithub.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=\ngithub.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=\ngithub.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=\ngithub.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro=\ngithub.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A=\ngithub.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4=\ngithub.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=\ngithub.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=\ngithub.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg=\ngithub.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs=\ngithub.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns=\ngithub.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=\ngithub.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=\ngithub.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU=\ngithub.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=\ngithub.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=\ngithub.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=\ngithub.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=\ngithub.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=\ngithub.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=\ngithub.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=\ngithub.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=\ngithub.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=\ngithub.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=\ngithub.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=\ngithub.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=\ngithub.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=\ngithub.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=\ngithub.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=\ngithub.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=\ngithub.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=\ngithub.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=\ngithub.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=\ngithub.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE=\ngithub.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc=\ngithub.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=\ngithub.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=\ngithub.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=\ngithub.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=\ngithub.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=\ngithub.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=\ngithub.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=\ngithub.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4=\ngithub.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=\ngithub.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=\ngithub.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=\ngithub.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=\ngithub.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=\ngithub.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA=\ngithub.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=\ngithub.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=\ngithub.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=\ngithub.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=\ngithub.com/onsi/ginkgo/v2 v2.1.6 h1:Fx2POJZfKRQcM1pH49qSZiYeu319wji004qX+GDovrU=\ngithub.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=\ngithub.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=\ngithub.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=\ngithub.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q=\ngithub.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo=\ngithub.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=\ngithub.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34=\ngithub.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=\ngithub.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=\ngithub.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=\ngithub.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=\ngithub.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=\ngithub.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=\ngithub.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=\ngithub.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=\ngithub.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=\ngithub.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=\ngithub.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=\ngithub.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=\ngithub.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=\ngithub.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=\ngithub.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=\ngithub.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-20230419030809-7081502ebf68 h1:DMsg44rX3xSBDCoKYU7zfJGzs9dfPkMYmM7C5fFx7Es=\ngithub.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-20230419030809-7081502ebf68/go.mod h1:e1Uef+Ux5BIHpYwqbeP2ZZmOzehBcez2vUEWXHe+xHE=\ngithub.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngo.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=\ngo.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=\ngo.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=\ngo.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=\ngo.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=\ngo.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=\ngo.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=\ngo.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM=\ngo.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=\ngo.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=\ngo.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=\ngo.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE=\ngo.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE=\ngo.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=\ngo.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=\ngo.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o=\ngo.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=\ngo.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=\ngo.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=\ngo.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=\ngo.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=\ngo.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=\ngo.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=\ngo.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec=\ngo.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=\ngo.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=\ngo.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=\ngo.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8=\ngo.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=\ngolang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8=\ngolang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw=\ngolang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=\ngolang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=\ngolang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=\ngolang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY=\ngomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=\ngoogle.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=\ngoogle.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=\ngoogle.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=\ngoogle.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=\ngoogle.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=\ngoogle.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=\ngoogle.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=\ngoogle.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=\ngoogle.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=\ngoogle.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=\ngoogle.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\ngoogle.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\ngoogle.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=\ngopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=\ngopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=\ngopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=\ngotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nk8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I=\nk8s.io/api v0.25.4 h1:3YO8J4RtmG7elEgaWMb4HgmpS2CfY1QlaOz9nwB+ZSs=\nk8s.io/api v0.25.4/go.mod h1:IG2+RzyPQLllQxnhzD8KQNEu4c4YvyDTpSMztf4A0OQ=\nk8s.io/apiextensions-apiserver v0.25.4 h1:7hu9pF+xikxQuQZ7/30z/qxIPZc2J1lFElPtr7f+B6U=\nk8s.io/apiextensions-apiserver v0.25.4/go.mod h1:bkSGki5YBoZWdn5pWtNIdGvDrrsRWlmnvl9a+tAw5vQ=\nk8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=\nk8s.io/apimachinery v0.25.4 h1:CtXsuaitMESSu339tfhVXhQrPET+EiWnIY1rcurKnAc=\nk8s.io/apimachinery v0.25.4/go.mod h1:jaF9C/iPNM1FuLl7Zuy5b9v+n35HGSh6AQ4HYRkCqwo=\nk8s.io/cli-runtime v0.24.0/go.mod h1:9XxoZDsEkRFUThnwqNviqzljtT/LdHtNWvcNFrAXl0A=\nk8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw=\nk8s.io/client-go v0.25.4 h1:3RNRDffAkNU56M/a7gUfXaEzdhZlYhoW8dgViGy5fn8=\nk8s.io/client-go v0.25.4/go.mod h1:8trHCAC83XKY0wsBIpbirZU4NTUpbuhc2JnI7OruGZw=\nk8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w=\nk8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA=\nk8s.io/component-base v0.25.4 h1:n1bjg9Yt+G1C0WnIDJmg2fo6wbEU1UGMRiQSjmj7hNQ=\nk8s.io/component-base v0.25.4/go.mod h1:nnZJU8OP13PJEm6/p5V2ztgX2oyteIaAGKGMYb2L2cY=\nk8s.io/component-helpers v0.24.0/go.mod h1:Q2SlLm4h6g6lPTC9GMMfzdywfLSvJT2f1hOnnjaWD8c=\nk8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=\nk8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=\nk8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=\nk8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=\nk8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=\nk8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=\nk8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54 h1:hWRbsoRWt44OEBnYUd4ceLy4ofBoh+p9vauWp/I5Gdg=\nk8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=\nk8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=\nk8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk=\nk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s=\nk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4=\nk8s.io/kubectl v0.24.0 h1:nA+WtMLVdXUs4wLogGd1mPTAesnLdBpCVgCmz3I7dXo=\nk8s.io/kubectl v0.24.0/go.mod h1:pdXkmCyHiRTqjYfyUJiXtbVNURhv0/Q1TyRhy2d5ic0=\nk8s.io/metrics v0.24.0/go.mod h1:jrLlFGdKl3X+szubOXPG0Lf2aVxuV3QJcbsgVRAM6fI=\nk8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=\nk8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=\nk8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 h1:GfD9OzL11kvZN5iArC6oTS7RTj7oJOIfnislxYlqTj8=\nk8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/cluster-api v1.2.8 h1:O0ZGyxGBeJaSWVptM7U0vTArAVlxCE5OtQItZ4OS2Y4=\nsigs.k8s.io/cluster-api v1.2.8/go.mod h1:HmxYwjLGHia5yjFoMY8I03Ha4kXAB+VTJnHFhAmPVig=\nsigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio=\nsigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0=\nsigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY=\nsigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k=\nsigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=\nsigs.k8s.io/kustomize/api v0.11.4/go.mod h1:k+8RsqYbgpkIrJ4p9jcdPqe8DprLxFUUO0yNOq8C+xI=\nsigs.k8s.io/kustomize/cmd/config v0.10.6/go.mod h1:/S4A4nUANUa4bZJ/Edt7ZQTyKOY9WCER0uBS1SW2Rco=\nsigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVYCA4BzxeAaLI05Bg=\nsigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg=\nsigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=\nsigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=\nsigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=\nsigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=\n"
  },
  {
    "path": "capabilities/controller/main.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage main\n\nimport (\n\t\"flag\"\n\t\"os\"\n\n\tcorev1 \"k8s.io/api/core/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\tutilruntime \"k8s.io/apimachinery/pkg/util/runtime\"\n\tctrl \"sigs.k8s.io/controller-runtime\"\n\t\"sigs.k8s.io/controller-runtime/pkg/healthz\"\n\t\"sigs.k8s.io/controller-runtime/pkg/log/zap\"\n\n\t// +kubebuilder:scaffold:imports\n\n\tcorev1alpha1 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha1\"\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n\t\"github.com/vmware-tanzu/tanzu-framework/capabilities/controller/pkg/capabilities/core\"\n\t\"github.com/vmware-tanzu/tanzu-framework/util/buildinfo\"\n)\n\nvar (\n\tscheme   = runtime.NewScheme()\n\tsetupLog = ctrl.Log.WithName(\"setup\")\n)\n\nfunc init() {\n\tutilruntime.Must(corev1.AddToScheme(scheme))\n\tutilruntime.Must(corev1alpha1.AddToScheme(scheme))\n\tutilruntime.Must(corev1alpha2.AddToScheme(scheme))\n\t//+kubebuilder:scaffold:scheme\n}\n\nfunc main() {\n\topts := zap.Options{\n\t\tDevelopment: true,\n\t}\n\topts.BindFlags(flag.CommandLine)\n\tflag.Parse()\n\n\tctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts)))\n\n\tsetupLog.Info(\"Version\", \"version\", buildinfo.Version, \"buildDate\", buildinfo.Date, \"sha\", buildinfo.SHA)\n\n\tvar err error\n\tmgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{Scheme: scheme, MetricsBindAddress: \"0\"})\n\tif err != nil {\n\t\tsetupLog.Error(err, \"unable to start manager\")\n\t\tos.Exit(1)\n\t}\n\n\tif err = (&core.CapabilityReconciler{\n\t\tClient: mgr.GetClient(),\n\t\tLog:    ctrl.Log.WithName(\"controllers\").WithName(\"Capability\").WithValues(\"apigroup\", \"core\"),\n\t\tScheme: mgr.GetScheme(),\n\t\tHost:   mgr.GetConfig().Host,\n\t}).SetupWithManager(mgr); err != nil {\n\t\tsetupLog.Error(err, \"unable to create controller\", \"controller\", \"Capability\", \"apigroup\", \"core\")\n\t\tos.Exit(1)\n\t}\n\n\t//+kubebuilder:scaffold:builder\n\n\tif err := mgr.AddHealthzCheck(\"healthz\", healthz.Ping); err != nil {\n\t\tsetupLog.Error(err, \"unable to set up health check\")\n\t\tos.Exit(1)\n\t}\n\tif err := mgr.AddReadyzCheck(\"readyz\", healthz.Ping); err != nil {\n\t\tsetupLog.Error(err, \"unable to set up ready check\")\n\t\tos.Exit(1)\n\t}\n\n\tsetupLog.Info(\"starting manager\")\n\tif err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {\n\t\tsetupLog.Error(err, \"problem running manager\")\n\t\tos.Exit(1)\n\t}\n}\n"
  },
  {
    "path": "capabilities/controller/pkg/capabilities/core/capability_controller.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage core\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/go-logr/logr\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\tctrl \"sigs.k8s.io/controller-runtime\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n\t\"github.com/vmware-tanzu/tanzu-framework/capabilities/client/pkg/discovery\"\n\t\"github.com/vmware-tanzu/tanzu-framework/capabilities/controller/pkg/config\"\n\t\"github.com/vmware-tanzu/tanzu-framework/capabilities/controller/pkg/constants\"\n)\n\n// CapabilityReconciler reconciles a Capability object.\ntype CapabilityReconciler struct {\n\tclient.Client\n\tLog    logr.Logger\n\tScheme *runtime.Scheme\n\tHost   string\n}\n\n//+kubebuilder:rbac:groups=run.tanzu.vmware.com,resources=capabilities,verbs=get;list;watch;create;update;patch;delete\n//+kubebuilder:rbac:groups=run.tanzu.vmware.com,resources=capabilities/status,verbs=get;update;patch\n\n// Reconcile reconciles a Capability spec by executing specified queries.\nfunc (r *CapabilityReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {\n\tctxCancel, cancel := context.WithTimeout(ctx, constants.ContextTimeout)\n\tdefer cancel()\n\n\tlog := r.Log.WithValues(\"capability\", req.NamespacedName)\n\tlog.Info(\"Starting reconcile\")\n\n\tcapability := &corev1alpha2.Capability{}\n\tif err := r.Get(ctxCancel, req.NamespacedName, capability); err != nil {\n\t\treturn ctrl.Result{}, client.IgnoreNotFound(err)\n\t}\n\n\tvar serviceAccountName, namespaceName string\n\t// use the default service account when the serviceAccountName is not provided as part of the spec\n\tif len(capability.Spec.ServiceAccountName) > 0 {\n\t\tserviceAccountName = capability.Spec.ServiceAccountName\n\t\tnamespaceName = req.Namespace\n\t} else {\n\t\tserviceAccountName = constants.ServiceAccountWithDefaultPermissions\n\t\tnamespaceName = constants.CapabilitiesControllerNamespace\n\t}\n\tcfg, err := config.GetConfigForServiceAccount(ctx, r.Client, namespaceName, serviceAccountName, r.Host)\n\tif err != nil {\n\t\treturn ctrl.Result{}, fmt.Errorf(\"unable to get config for ClusterQueryClient creation: %w\", err)\n\t}\n\tclusterQueryClient, err := discovery.NewClusterQueryClientForConfig(cfg)\n\tif err != nil {\n\t\treturn ctrl.Result{}, fmt.Errorf(\"unable to create ClusterQueryClient: %w\", err)\n\t}\n\n\tcapability.Status.Results = make([]corev1alpha2.Result, len(capability.Spec.Queries))\n\n\tfor i, query := range capability.Spec.Queries {\n\t\tl := log.WithValues(\"query\", query.Name)\n\n\t\tcapability.Status.Results[i].Name = query.Name\n\t\t// Query GVRs.\n\t\tcapability.Status.Results[i].GroupVersionResources = r.queryGVRs(l, clusterQueryClient, query.GroupVersionResources)\n\t\t// Query Objects.\n\t\tcapability.Status.Results[i].Objects = r.queryObjects(l, clusterQueryClient, query.Objects)\n\t\t// Query PartialSchemas.\n\t\tcapability.Status.Results[i].PartialSchemas = r.queryPartialSchemas(l, clusterQueryClient, query.PartialSchemas)\n\t}\n\n\tlog.Info(\"Successfully reconciled\")\n\treturn ctrl.Result{}, r.Status().Update(ctxCancel, capability)\n}\n\n// queryGVRs executes GVR queries and returns results.\nfunc (r *CapabilityReconciler) queryGVRs(log logr.Logger, clusterQueryClient *discovery.ClusterQueryClient, queries []corev1alpha2.QueryGVR) []corev1alpha2.QueryResult {\n\treturn r.executeQueries(log.WithValues(\"queryType\", \"GVR\"), clusterQueryClient, func() map[string]discovery.QueryTarget {\n\t\tqueryTargets := make(map[string]discovery.QueryTarget)\n\t\tfor i := range queries {\n\t\t\tq := queries[i]\n\t\t\tquery := discovery.Group(q.Name, q.Group).WithVersions(q.Versions...).WithResource(q.Resource)\n\t\t\tqueryTargets[q.Name] = query\n\t\t}\n\t\treturn queryTargets\n\t})\n}\n\n// queryObjects executes Object queries and returns results.\nfunc (r *CapabilityReconciler) queryObjects(log logr.Logger, clusterQueryClient *discovery.ClusterQueryClient, queries []corev1alpha2.QueryObject) []corev1alpha2.QueryResult {\n\treturn r.executeQueries(log.WithValues(\"queryType\", \"Object\"), clusterQueryClient, func() map[string]discovery.QueryTarget {\n\t\tqueryTargets := make(map[string]discovery.QueryTarget)\n\t\tfor i := range queries {\n\t\t\tq := queries[i]\n\t\t\tquery := discovery.Object(q.Name, &q.ObjectReference).WithAnnotations(q.WithAnnotations).WithoutAnnotations(q.WithoutAnnotations)\n\t\t\tqueryTargets[q.Name] = query\n\t\t}\n\t\treturn queryTargets\n\t})\n}\n\n// queryPartialSchemas executes PartialSchema queries and returns results.\nfunc (r *CapabilityReconciler) queryPartialSchemas(log logr.Logger, clusterQueryClient *discovery.ClusterQueryClient, queries []corev1alpha2.QueryPartialSchema) []corev1alpha2.QueryResult {\n\treturn r.executeQueries(log.WithValues(\"queryType\", \"PartialSchema\"), clusterQueryClient, func() map[string]discovery.QueryTarget {\n\t\tqueryTargets := make(map[string]discovery.QueryTarget)\n\t\tfor i := range queries {\n\t\t\tq := queries[i]\n\t\t\tquery := discovery.Schema(q.Name, q.PartialSchema)\n\t\t\tqueryTargets[q.Name] = query\n\t\t}\n\t\treturn queryTargets\n\t})\n}\n\n// executeQueries executes queries using the discovery client and stores results.\nfunc (r *CapabilityReconciler) executeQueries(log logr.Logger, clusterQueryClient *discovery.ClusterQueryClient, specToQueryTargetFn func() map[string]discovery.QueryTarget) []corev1alpha2.QueryResult {\n\tvar results []corev1alpha2.QueryResult\n\tqueryTargetsMap := specToQueryTargetFn()\n\tfor name, queryTarget := range queryTargetsMap {\n\t\tresult := corev1alpha2.QueryResult{Name: name}\n\t\tc := clusterQueryClient.Query(queryTarget)\n\t\tfound, err := c.Execute()\n\t\tif err != nil {\n\t\t\tresult.Error = true\n\t\t\tresult.ErrorDetail = err.Error()\n\t\t}\n\t\tresult.Found = found\n\t\tif !found {\n\t\t\tif qr := c.Results().ForQuery(name); qr != nil {\n\t\t\t\tresult.NotFoundReason = qr.NotFoundReason\n\t\t\t}\n\t\t}\n\t\tresults = append(results, result)\n\t}\n\tlog.Info(\"Executed queries\", \"num\", len(queryTargetsMap))\n\treturn results\n}\n\n// SetupWithManager sets up the controller with the Manager.\nfunc (r *CapabilityReconciler) SetupWithManager(mgr ctrl.Manager) error {\n\treturn ctrl.NewControllerManagedBy(mgr).\n\t\tFor(&corev1alpha2.Capability{}).\n\t\tComplete(r)\n}\n"
  },
  {
    "path": "capabilities/controller/pkg/capabilities/core/doc.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package core has the capabilities controller that reconciles on Capabilities resources in core.tanzu.vmware.com group\npackage core\n"
  },
  {
    "path": "capabilities/controller/pkg/capabilities/doc.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package capabilities has controllers for Capability API.\npackage capabilities\n"
  },
  {
    "path": "capabilities/controller/pkg/capabilities/suite_test.go",
    "content": "//go:build envtest\n\n// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage capabilities\n\nimport (\n\t\"testing\"\n\n\t. \"github.com/onsi/ginkgo\"\n\t. \"github.com/onsi/gomega\"\n\t\"k8s.io/client-go/rest\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\t\"sigs.k8s.io/controller-runtime/pkg/envtest\"\n\t\"sigs.k8s.io/controller-runtime/pkg/envtest/printer\"\n\t// +kubebuilder:scaffold:imports\n)\n\n// These tests use Ginkgo (BDD-style Go testing framework). Refer to\n// http://onsi.github.io/ginkgo/ to learn more about Ginkgo.\n\nvar cfg *rest.Config\nvar k8sClient client.Client\nvar testEnv *envtest.Environment\n\nfunc TestAPIs(t *testing.T) {\n\tRegisterFailHandler(Fail)\n\n\tRunSpecsWithDefaultAndCustomReporters(t,\n\t\t\"Controller Suite\",\n\t\t[]Reporter{printer.NewlineReporter{}})\n}\n"
  },
  {
    "path": "capabilities/controller/pkg/config/config.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage config\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\tcorev1 \"k8s.io/api/core/v1\"\n\t\"k8s.io/client-go/rest\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n)\n\n// GetConfigForServiceAccount returns a *rest.Config which uses the service account for talking to a Kubernetes API server.\nfunc GetConfigForServiceAccount(ctx context.Context, coreClient client.Client, nsName, saName, host string) (*rest.Config, error) {\n\tserviceAccount := &corev1.ServiceAccount{}\n\tif err := coreClient.Get(ctx, client.ObjectKey{\n\t\tNamespace: nsName,\n\t\tName:      saName,\n\t}, serviceAccount); err != nil {\n\t\treturn nil, fmt.Errorf(\"couldn't get service account: %w\", err)\n\t}\n\n\tfor _, secretRef := range serviceAccount.Secrets {\n\t\tsecret := &corev1.Secret{}\n\t\tif err := coreClient.Get(ctx, client.ObjectKey{\n\t\t\tNamespace: nsName,\n\t\t\tName:      secretRef.Name,\n\t\t}, secret); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"couldn't get service account secret: %w\", err)\n\t\t}\n\n\t\tif secret.Type != corev1.SecretTypeServiceAccountToken {\n\t\t\tcontinue\n\t\t}\n\n\t\treturn buildConfig(secret, host)\n\t}\n\n\treturn nil, fmt.Errorf(\"expected to find one service account token secret, but found none\")\n}\n\n// buildConfig builds a *rest.Config from the service account secret\nfunc buildConfig(secret *corev1.Secret, host string) (*rest.Config, error) {\n\tcaBytes, found := secret.Data[corev1.ServiceAccountRootCAKey]\n\tif !found {\n\t\treturn nil, fmt.Errorf(\"couldn't find service account token ca\")\n\t}\n\n\ttokenBytes, found := secret.Data[corev1.ServiceAccountTokenKey]\n\tif !found {\n\t\treturn nil, fmt.Errorf(\"couldn't find service account token value\")\n\t}\n\n\ttlsClientConfig := rest.TLSClientConfig{\n\t\tCAData: caBytes,\n\t}\n\n\treturn &rest.Config{\n\t\tHost:            host,\n\t\tTLSClientConfig: tlsClientConfig,\n\t\tBearerToken:     string(tokenBytes),\n\t}, nil\n}\n"
  },
  {
    "path": "capabilities/controller/pkg/config/config_test.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage config\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"testing\"\n\n\tcorev1 \"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"k8s.io/client-go/kubernetes/scheme\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client/fake\"\n\n\t\"github.com/vmware-tanzu/tanzu-framework/capabilities/controller/pkg/constants\"\n)\n\nfunc TestGetConfigForServiceAccount(t *testing.T) {\n\tobjs, secrets := getTestObjects()\n\tcl := fake.NewClientBuilder().WithScheme(scheme.Scheme).WithRuntimeObjects(objs...).Build()\n\tctx, cancel := context.WithTimeout(context.Background(), constants.ContextTimeout)\n\tdefer cancel()\n\ttestCases := []struct {\n\t\tdescription        string\n\t\tserviceAccountName string\n\t\tnamespaceName      string\n\t\tclient             client.Client\n\t\thost               string\n\t\treturnErr          bool\n\t}{\n\t\t{\n\t\t\tdescription:        \"should successfully return config\",\n\t\t\tserviceAccountName: \"foo\",\n\t\t\tnamespaceName:      \"default\",\n\t\t\tclient:             cl,\n\t\t\thost:               \"localhost:31145\",\n\t\t\treturnErr:          false,\n\t\t},\n\t\t{\n\t\t\tdescription:        \"pass invalid service account\",\n\t\t\tserviceAccountName: \"bar\",\n\t\t\tnamespaceName:      \"default\",\n\t\t\tclient:             cl,\n\t\t\thost:               \"localhost:31146\",\n\t\t\treturnErr:          true,\n\t\t},\n\t\t{\n\t\t\tdescription:        \"pass service account name that doesn't exist\",\n\t\t\tserviceAccountName: \"baz\",\n\t\t\tnamespaceName:      \"default\",\n\t\t\tclient:             cl,\n\t\t\thost:               \"localhost:31147\",\n\t\t\treturnErr:          true,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tconfig, err := GetConfigForServiceAccount(ctx, cl, tc.namespaceName, tc.serviceAccountName, tc.host)\n\t\t\tif err != nil {\n\t\t\t\tif !tc.returnErr {\n\t\t\t\t\tt.Errorf(\"error not expected, but got error: %v\", err)\n\t\t\t\t}\n\t\t\t} else if tc.returnErr {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Errorf(\"error expected, but got nothing\")\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif config.BearerToken != string(secrets[tc.serviceAccountName].Data[corev1.ServiceAccountTokenKey]) {\n\t\t\t\t\tt.Errorf(\"config object is not constructed properly\")\n\t\t\t\t}\n\t\t\t\tres := bytes.Compare(config.TLSClientConfig.CAData, secrets[tc.serviceAccountName].Data[corev1.ServiceAccountRootCAKey])\n\t\t\t\tif res != 0 {\n\t\t\t\t\tt.Errorf(\"config object is not constructed properly\")\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc getTestObjects() ([]runtime.Object, map[string]*corev1.Secret) {\n\tfooSecret := &corev1.Secret{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName:      \"foo\",\n\t\t\tNamespace: \"default\",\n\t\t},\n\t\tData: map[string][]byte{\n\t\t\t\"token\":     []byte(\"eyJhbGciOiJSUzI1NiIsImtpZCI6InlSV3V1T3RFWDJvUDN0MGtGQ3BiUVRNUkd0SFotX0hvUHJaMEFuNGF4ZTAifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6Im15LXNhLXRva2VuLWxuY3FwIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6Im15LXNhIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiOGIxMWUwZWMtYTE5Ny00YWMyLWFjNDQtODczZGJjNTMwNGJlIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6bXktc2EifQ.je34lgxiMKgwD1Paac_T1FMXwWXCBfhcqXP0A6UEvOAzzOqXhiQGF7jhctRxXfQQITK4CkdVftanRR3OEDNMLU1PW5ulWxmU6SbC3vfJOz3-RO_pNVCfUo-eDinSuZnwn3s23ceOJ3r3bM8rpk0vYdX2EYPDb-2wxr23gTqR5qeNT-muq-jbKWTO0btXV_pTscNqWRFHW2AU5GaPincVUx5mq1-stHWN8kcLoz8_zKdgRrFa_vrQcosVg6BEnLHKv5m_THZGp2mO0bkHWruClDP7KsKL8UZeloL3xcwPkM4VPAoetl9y39oR-JmhwEIHq-a_psiXyXODAN8I72lFiQ%\"),\n\t\t\t\"namespace\": []byte(\"default\"),\n\t\t\t\"ca.crt\":    []byte(\"-----BEGIN CERTIFICATE-----\\nMIIC5zCCAc+gAwIBAgIBADANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwprdWJl\\ncm5ldGVzMB4XDTIxMDgxNzE4NTg1MVoXDTMxMDgxNTE4NTg1MVowFTETMBEGA1UE\\nAxMKa3ViZXJuZXRlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbD\\ndordCz868nGBmvu+IxsyFE4N8xFMm3k8K85omiqsKgr+z2GhiWaO1WHv+EjQFv9k\\n1HSJ/jcoh1G7wtc0d1pZbsZWWscR2I50REKcTI55kES12NJg/oGK2fjSN4eQm3Ag\\nFQTj0x+9FvB7ydJCZ9xGyMHh8yhGBc2JgU/aR8aeY2yrxnyCTLS1QxU0E1LxBpLg\\nHV/JjSWFxULeDQtufP4lNl/Fmi9UFoEKgE5xwgLzTF3UpkCodKwdlVVcsc2VStof\\n9peuA5nFXoA6dyHuG+PEDCKH72oYtN3I3NzFFn4ecCRVt2tWQOhsGI1lrEeg1KSS\\n0eexH6a2uTv9jxfXG2sCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgKkMA8GA1UdEwEB\\n/wQFMAMBAf8wHQYDVR0OBBYEFAK8hmyS1mlR3ipnSRc/oz07QluJMA0GCSqGSIb3\\nDQEBCwUAA4IBAQAfMmX+sPye95+wQAVglnwG8BEFboGb7Jbqd9Lm9i+AWjhVnrqX\\nZdnnSh1o8xbuAqVv4etbZruh5wXJw57yMCoGg/K8jJwoGiFDFFHuzzotLt9gkrQv\\n2tSazl1yUEDCZcwaymXiJIoqMIjr1bHaAp92ycgx++hSNszwyT3uKbuScYTODTFg\\ntbFQy5UTbfvLOBF7DM5sRqpWGSu6fZw6yEgYPAYTmwLN9Cb08onohTouNF71Mobr\\n7jdXWv2CLtq7VC3rqpWAO81idsrbx2kxL7UEAONaGNqPfmoZgi1S2jAxBygQrcMV\\nsZAZ38xYxkCcxsBIKW+/kL6jramz7IJJYvg4\\n-----END CERTIFICATE-----\"),\n\t\t},\n\t\tType: corev1.SecretTypeServiceAccountToken,\n\t}\n\n\tfooServiceAccount := &corev1.ServiceAccount{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName:      \"foo\",\n\t\t\tNamespace: \"default\",\n\t\t},\n\t\tSecrets: []corev1.ObjectReference{\n\t\t\tcorev1.ObjectReference{\n\t\t\t\tName: \"foo\",\n\t\t\t},\n\t\t},\n\t}\n\n\tbarSecret := &corev1.Secret{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName:      \"bar\",\n\t\t\tNamespace: \"default\",\n\t\t},\n\t\tData: map[string][]byte{\n\t\t\t\"namespace\": []byte(\"default\"),\n\t\t\t\"ca.crt\":    []byte(\"-----BEGIN CERTIFICATE-----\\nMIIC5zCCAc+gAwIBAgIBADANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwprdWJl\\ncm5ldGVzMB4XDTIxMDgxNzE4NTg1MVoXDTMxMDgxNTE4NTg1MVowFTETMBEGA1UE\\nAxMKa3ViZXJuZXRlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbD\\ndordCz868nGBmvu+IxsyFE4N8xFMm3k8K85omiqsKgr+z2GhiWaO1WHv+EjQFv9k\\n1HSJ/jcoh1G7wtc0d1pZbsZWWscR2I50REKcTI55kES12NJg/oGK2fjSN4eQm3Ag\\nFQTj0x+9FvB7ydJCZ9xGyMHh8yhGBc2JgU/aR8aeY2yrxnyCTLS1QxU0E1LxBpLg\\nHV/JjSWFxULeDQtufP4lNl/Fmi9UFoEKgE5xwgLzTF3UpkCodKwdlVVcsc2VStof\\n9peuA5nFXoA6dyHuG+PEDCKH72oYtN3I3NzFFn4ecCRVt2tWQOhsGI1lrEeg1KSS\\n0eexH6a2uTv9jxfXG2sCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgKkMA8GA1UdEwEB\\n/wQFMAMBAf8wHQYDVR0OBBYEFAK8hmyS1mlR3ipnSRc/oz07QluJMA0GCSqGSIb3\\nDQEBCwUAA4IBAQAfMmX+sPye95+wQAVglnwG8BEFboGb7Jbqd9Lm9i+AWjhVnrqX\\nZdnnSh1o8xbuAqVv4etbZruh5wXJw57yMCoGg/K8jJwoGiFDFFHuzzotLt9gkrQv\\n2tSazl1yUEDCZcwaymXiJIoqMIjr1bHaAp92ycgx++hSNszwyT3uKbuScYTODTFg\\ntbFQy5UTbfvLOBF7DM5sRqpWGSu6fZw6yEgYPAYTmwLN9Cb08onohTouNF71Mobr\\n7jdXWv2CLtq7VC3rqpWAO81idsrbx2kxL7UEAONaGNqPfmoZgi1S2jAxBygQrcMV\\nsZAZ38xYxkCcxsBIKW+/kL6jramz7IJJYvg4\\n-----END CERTIFICATE-----\"),\n\t\t},\n\t\tType: corev1.SecretTypeServiceAccountToken,\n\t}\n\n\tbarServiceAccount := &corev1.ServiceAccount{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName:      \"bar\",\n\t\t\tNamespace: \"default\",\n\t\t},\n\t\tSecrets: []corev1.ObjectReference{\n\t\t\tcorev1.ObjectReference{\n\t\t\t\tName: \"bar\",\n\t\t\t},\n\t\t},\n\t}\n\n\tsecrets := map[string]*corev1.Secret{\n\t\t\"foo\": fooSecret,\n\t\t\"bar\": barSecret,\n\t}\n\n\t// Objects to track in the fake client.\n\treturn []runtime.Object{fooServiceAccount, fooSecret, barServiceAccount, barSecret}, secrets\n}\n"
  },
  {
    "path": "capabilities/controller/pkg/config/doc.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package config contains code to get *rest.Config\npackage config\n"
  },
  {
    "path": "capabilities/controller/pkg/constants/constants.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage constants\n\nimport \"time\"\n\nconst (\n\tContextTimeout                       = 60 * time.Second\n\tServiceAccountWithDefaultPermissions = \"tanzu-capabilities-manager-default-sa\"\n\tCapabilitiesControllerNamespace      = \"tkg-system\"\n)\n"
  },
  {
    "path": "capabilities/controller/pkg/constants/doc.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package constants related to capabilities controller\npackage constants\n"
  },
  {
    "path": "capabilities/hack/generate-package-secret.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2022 VMware, Inc. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\nset -euo pipefail\n\nMY_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" >/dev/null 2>&1 && pwd )\"\nTF_ROOT=\"${MY_DIR}/../../../../../\"\n\n# Always run from capabilities directory for reproducibility\ncd \"${MY_DIR}/..\"\n\n# Run YTT, passing the arguments to this script straight through to YTT to ease future extensions template\nytt -f ./hack/ytt/schema.yaml -f ./hack/ytt/default-package-secret.yaml -f ./hack/ytt/values.yaml $@\n"
  },
  {
    "path": "capabilities/hack/generate-package-secret.test.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2022 VMware, Inc. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\nset -euo pipefail\n\nMY_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" >/dev/null 2>&1 && pwd )\"\nTF_ROOT=\"${MY_DIR}/../../../..\"\n\n# Always run from capabilities directory for reproducibility\ncd \"${MY_DIR}/..\"\n\n# test with no args\nTEST_RESULT_1=$(./hack/generate-package-secret.sh)\nEXPECTED_1=\"apiVersion: v1\nkind: Secret\nmetadata:\n  name: default-capabilities-package-config-v0.0.0\nstringData:\n  values.yaml: |\n    namespace: tkg-system\n    deployment:\n      hostNetwork: true\n      nodeSelector: {}\n      tolerations: []\n    rbac:\n      podSecurityPolicyNames: []\"\n\nif [[ \"${TEST_RESULT_1}\" != \"${EXPECTED_1}\" ]]\nthen\n  echo \"default secret generation does not match expected output\"\n  echo -e \"result: \\n${TEST_RESULT_1}\"\n  echo -e \"expected: \\n${EXPECTED_1}\"\n  exit 1\nfi\n\n# test with provided args\nTEST_RESULT_2=$(./hack/generate-package-secret.sh -v tkr=foo --data-value-yaml 'rbac.podSecurityPolicyNames=[test-psp,test-psp-two]')\nEXPECTED_2=\"apiVersion: v1\nkind: Secret\nmetadata:\n  name: default-capabilities-package-config-foo\nstringData:\n  values.yaml: |\n    namespace: tkg-system\n    deployment:\n      hostNetwork: true\n      nodeSelector: {}\n      tolerations: []\n    rbac:\n      podSecurityPolicyNames:\n      - test-psp\n      - test-psp-two\"\n\nif [[ \"${TEST_RESULT_2}\" != \"${EXPECTED_2}\" ]]\nthen\n  echo \"secret generation with parameters does not match expected output\"\n  echo -e \"result: \\n${TEST_RESULT_2}\"\n  echo -e \"expected: \\n${EXPECTED_2}\"\n  exit 1\nfi\n"
  },
  {
    "path": "capabilities/hack/ytt/default-package-secret.yaml",
    "content": "#@ load(\"@ytt:yaml\", \"yaml\")\n#@ load(\"@ytt:data\", \"data\")\n#@overlay/match-child-defaults missing_ok=True\n\n#@ def config():\n---\nnamespace: #@ data.values.namespace\ndeployment:\n  hostNetwork: #@ data.values.deployment.hostNetwork\n  nodeSelector: #@ data.values.deployment.nodeSelector\n  tolerations: #@ data.values.deployment.tolerations\nrbac:\n  podSecurityPolicyNames: #@ data.values.rbac.podSecurityPolicyNames\n#@ end\n\n---\napiVersion: v1\nkind: Secret\nmetadata:\n  name: #@ \"default-capabilities-package-config-\" + data.values.tkr\nstringData:\n  values.yaml: #@ yaml.encode(config())\n"
  },
  {
    "path": "capabilities/hack/ytt/schema.yaml",
    "content": "#@data/values-schema\n---\ntkr: \"\"\nnamespace: tkg-system\ndeployment:\n  hostNetwork: false\n  #@schema/type any=True\n  nodeSelector: {}\n  tolerations:\n    - effect: NoSchedule\n      key: \"\"\n      value: \"\"\n      operator: \"\"\n      #@schema/nullable\n      tolerationSeconds: 0\nrbac:\n  #! PSP resource names capabilities controller should use in its ClusterRole rules.\n  podSecurityPolicyNames:\n    - \"\"\n"
  },
  {
    "path": "capabilities/hack/ytt/values.yaml",
    "content": "#@data/values\n#@overlay/match-child-defaults missing_ok=True\n---\ntkr: v0.0.0\nnamespace: tkg-system\ndeployment:\n  hostNetwork: true\n  nodeSelector: {}\n  tolerations: []\nrbac:\n  #! PSP resource names capabilities controller should use in its ClusterRole rules.\n  podSecurityPolicyNames: []\n"
  },
  {
    "path": "cmd/plugin/codegen/README.md",
    "content": "# codegen\n\nTanzu codegen plugin is a place for generators for generating utility code and\nKubernetes YAML, and is based on controller-tools. The generators specify\nwhat to generate and output rules specify where to write the results.\n\n## Generators\n\nGenerators look for special marker comments in the Go code and generate the\nutility code and config YAML. To use a specific generator it needs to be\nspecified through the CLI option and multiple generators can be used when\nrunning the `tanzu codegen generate` command. The generated utility code\nor the YAML needs to be written somewhere, this is controlled by the output\nrules. To learn more about output rules and how to configure them check\n[here](https://master.book.kubebuilder.io/reference/controller-gen.html#output-rules)\n\n### Feature\n\nFeature generator is for generating Feature CRs from marker comments that are\nassociated with a type declaration.\n\nCommand to use the Feature generator:\n\n```sh\ntanzu codegen generate paths=${path_to_scan} feature output:feature:artifacts:config=${outputDir}\n```\n"
  },
  {
    "path": "cmd/plugin/codegen/generate.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/spf13/cobra\"\n\t\"sigs.k8s.io/controller-tools/pkg/genall\"\n\t\"sigs.k8s.io/controller-tools/pkg/markers\"\n\n\t\"github.com/vmware-tanzu/tanzu-framework/cmd/plugin/codegen/generators/feature\"\n)\n\nvar (\n\t// GenerateCmd generates the Tanzu API extension resources and code.\n\tGenerateCmd = &cobra.Command{\n\t\tUse:   \"generate\",\n\t\tShort: \"Generate Tanzu API extension resources and code.\",\n\t\tLong:  \"Generate Tanzu API extension resources and code.\",\n\t\tRunE:  runGenerate,\n\t}\n\n\t// allGenerators maintains the list of all known generators\n\tallGenerators = map[string]genall.Generator{\n\t\t\"feature\": feature.Generator{},\n\t}\n\n\t// allOutputRules defines the list of all known output rules\n\tallOutputRules = map[string]genall.OutputRule{\n\t\t\"dir\":       genall.OutputToDirectory(\"\"),\n\t\t\"none\":      genall.OutputToNothing,\n\t\t\"stdout\":    genall.OutputToStdout,\n\t\t\"artifacts\": genall.OutputArtifacts{},\n\t}\n\n\t// optionsRegistry contains all the marker definitions used to process command line options\n\toptionsRegistry = &markers.Registry{}\n)\n\nfunc registerOptionsMarkers() error {\n\tfor genName, gen := range allGenerators {\n\t\t// make the generator options marker itself\n\t\tdefn := markers.Must(markers.MakeDefinition(genName, markers.DescribesPackage, gen))\n\t\tif err := optionsRegistry.Register(defn); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif helpGiver, hasHelp := gen.(genall.HasHelp); hasHelp {\n\t\t\tif help := helpGiver.Help(); help != nil {\n\t\t\t\toptionsRegistry.AddHelp(defn, help)\n\t\t\t}\n\t\t}\n\n\t\t// make per-generation output rule markers\n\t\tfor ruleName, rule := range allOutputRules {\n\t\t\truleMarker := markers.Must(markers.MakeDefinition(fmt.Sprintf(\"output:%s:%s\", genName, ruleName), markers.DescribesPackage, rule))\n\t\t\tif err := optionsRegistry.Register(ruleMarker); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif helpGiver, hasHelp := rule.(genall.HasHelp); hasHelp {\n\t\t\t\tif help := helpGiver.Help(); help != nil {\n\t\t\t\t\toptionsRegistry.AddHelp(ruleMarker, help)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// make \"default output\" output rule markers\n\tfor ruleName, rule := range allOutputRules {\n\t\truleMarker := markers.Must(markers.MakeDefinition(\"output:\"+ruleName, markers.DescribesPackage, rule))\n\t\tif err := optionsRegistry.Register(ruleMarker); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif helpGiver, hasHelp := rule.(genall.HasHelp); hasHelp {\n\t\t\tif help := helpGiver.Help(); help != nil {\n\t\t\t\toptionsRegistry.AddHelp(ruleMarker, help)\n\t\t\t}\n\t\t}\n\t}\n\n\t// add in the common options markers\n\treturn genall.RegisterOptionsMarkers(optionsRegistry)\n}\n\nfunc runGenerate(_ *cobra.Command, args []string) error {\n\tif err := registerOptionsMarkers(); err != nil {\n\t\treturn err\n\t}\n\truntime, err := genall.FromOptions(optionsRegistry, args)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif len(runtime.Generators) == 0 {\n\t\treturn fmt.Errorf(\"no generators specified\")\n\t}\n\n\tif hadErrs := runtime.Run(); hadErrs {\n\t\treturn fmt.Errorf(\"not all generators ran successfully\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "cmd/plugin/codegen/generators/feature/doc.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package feature provides feature generator\npackage feature\n"
  },
  {
    "path": "cmd/plugin/codegen/generators/feature/fakeData/bar.yaml",
    "content": "\n---\napiVersion: core.tanzu.vmware.com/v1alpha2\nkind: Feature\nmetadata:\n  name: bar\nspec:\n  stability: Stable\nstatus: {}\n"
  },
  {
    "path": "cmd/plugin/codegen/generators/feature/fakeData/baz.yaml",
    "content": "\n---\napiVersion: core.tanzu.vmware.com/v1alpha2\nkind: Feature\nmetadata:\n  name: baz\nspec:\n  stability: Stable\nstatus: {}\n"
  },
  {
    "path": "cmd/plugin/codegen/generators/feature/fakeData/cronjob_types.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage fakedata\n\nimport metav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\n// CronjobSpec defines the desired state of Cronjob\ntype CronjobSpec struct {\n\tFoo string `json:\"foo,omitempty\"`\n}\n\n// CronjobStatus defines the observed state of Cronjob\ntype CronjobStatus struct {\n}\n\n//+tanzu:feature:name=bar,stability=Stable\n//+tanzu:feature:name=baz,stability=Stable\n\n// Cronjob is the Schema for the cronjobs API\ntype Cronjob struct {\n\tStatus            CronjobStatus `json:\"status,omitempty\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tSpec              CronjobSpec `json:\"spec,omitempty\"`\n}\n"
  },
  {
    "path": "cmd/plugin/codegen/generators/feature/fakeData/doc.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package fakedata provides data needed for testing\npackage fakedata\n"
  },
  {
    "path": "cmd/plugin/codegen/generators/feature/fakeData/foo.yaml",
    "content": "\n---\napiVersion: core.tanzu.vmware.com/v1alpha2\nkind: Feature\nmetadata:\n  name: foo\nspec:\n  stability: Technical Preview\nstatus: {}\n"
  },
  {
    "path": "cmd/plugin/codegen/generators/feature/fakeData/memcached_types.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage fakedata\n\nimport metav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\n// MemcachedSpec defines the desired state of Memcached\ntype MemcachedSpec struct {\n\tFoo string `json:\"foo,omitempty\"`\n}\n\n// MemcachedStatus defines the observed state of Memcached\ntype MemcachedStatus struct {\n}\n\n// Memcached is the Schema for the memcacheds API\ntype Memcached struct {\n\tStatus            MemcachedStatus `json:\"status,omitempty\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tSpec              MemcachedSpec `json:\"spec,omitempty\"`\n}\n"
  },
  {
    "path": "cmd/plugin/codegen/generators/feature/fakeData/mykind_types.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage fakedata\n\nimport metav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\n// MyKindSpec defines the desired state of MyKind\ntype MyKindSpec struct {\n\tFoo string `json:\"foo,omitempty\"`\n}\n\n// MyKindStatus defines the observed state of MyKind\ntype MyKindStatus struct {\n}\n\n//+tanzu:feature:name=foo,stability=Technical Preview\n\n// MyKind is the Schema for the mykinds API\ntype MyKind struct {\n\tStatus            MyKindStatus `json:\"status,omitempty\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tSpec              MyKindSpec `json:\"spec,omitempty\"`\n}\n"
  },
  {
    "path": "cmd/plugin/codegen/generators/feature/feature_suite_test.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage feature\n\nimport (\n\t\"testing\"\n\n\t. \"github.com/onsi/ginkgo\"\n\t. \"github.com/onsi/gomega\"\n)\n\nfunc TestFeatureGeneration(t *testing.T) {\n\tRegisterFailHandler(Fail)\n\tRunSpecs(t, \"Feature Generation Suite\")\n}\n"
  },
  {
    "path": "cmd/plugin/codegen/generators/feature/gen.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage feature\n\nimport (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"sigs.k8s.io/controller-tools/pkg/genall\"\n\t\"sigs.k8s.io/controller-tools/pkg/markers\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n)\n\nconst markerName = \"tanzu:feature\"\n\nvar (\n\t// RuleDefinition is a marker for defining Feature rules.\n\tRuleDefinition = markers.Must(markers.MakeDefinition(markerName, markers.DescribesType, Rule{}))\n)\n\n// Generator is feature generator that registers feature markers and produces output artifacts\ntype Generator struct{}\n\n// Rule is the output type of the marker value\ntype Rule struct {\n\t// Name of the feature.\n\tName string\n\t// Description of the feature.\n\tDescription string `marker:\",optional\"`\n\t// Stability indicates stability level of this feature.\n\tStability corev1alpha2.StabilityLevel\n}\n\n// Generate generates artifacts produced by feature marker.\nfunc (g Generator) Generate(ctx *genall.GenerationContext) error {\n\tobjs := generateFeatures(ctx)\n\n\tif len(objs) == 0 {\n\t\treturn nil\n\t}\n\tfor _, obj := range objs {\n\t\tif err := ctx.WriteYAML(obj.(corev1alpha2.Feature).Name+\".yaml\", obj); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// RegisterMarkers registers all markers needed by this Generator\nfunc (Generator) RegisterMarkers(reg *markers.Registry) error {\n\tif err := reg.Register(RuleDefinition); err != nil {\n\t\treturn err\n\t}\n\treg.AddHelp(RuleDefinition, &markers.DefinitionHelp{\n\t\tCategory: \"feature\",\n\t\tDetailedHelp: markers.DetailedHelp{\n\t\t\tSummary: \"is the output type of the marker value\",\n\t\t\tDetails: \"\",\n\t\t},\n\t\tFieldHelp: map[string]markers.DetailedHelp{\n\t\t\t\"Name\": {\n\t\t\t\tSummary: \"specifies name of the feature.\",\n\t\t\t\tDetails: \"\",\n\t\t\t},\n\t\t\t\"Description\": {\n\t\t\t\tSummary: \"specifies description of the feature.\",\n\t\t\t\tDetails: \"\",\n\t\t\t},\n\t\t\t\"Stability\": {\n\t\t\t\tSummary: \"indicates stability level of this feature.\",\n\t\t\t\tDetails: \"\",\n\t\t\t},\n\t\t},\n\t})\n\treturn nil\n}\n\nfunc generateFeatures(ctx *genall.GenerationContext) []interface{} {\n\tvar objs []interface{}\n\tfor _, root := range ctx.Roots {\n\t\tif err := markers.EachType(ctx.Collector, root, func(info *markers.TypeInfo) {\n\t\t\tmarkerValues := getMarkerValues(markerName, info.Markers)\n\t\t\tfor _, markerValue := range markerValues {\n\t\t\t\tval := markerValue.(Rule)\n\t\t\t\tobjs = append(objs, corev1alpha2.Feature{\n\t\t\t\t\tTypeMeta: metav1.TypeMeta{\n\t\t\t\t\t\tKind:       \"Feature\",\n\t\t\t\t\t\tAPIVersion: corev1alpha2.GroupVersion.String(),\n\t\t\t\t\t},\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName: val.Name,\n\t\t\t\t\t},\n\t\t\t\t\tSpec: corev1alpha2.FeatureSpec{\n\t\t\t\t\t\tDescription: val.Description,\n\t\t\t\t\t\tStability:   val.Stability,\n\t\t\t\t\t},\n\t\t\t\t\tStatus: corev1alpha2.FeatureStatus{},\n\t\t\t\t})\n\t\t\t}\n\t\t}); err != nil {\n\t\t\troot.AddError(err)\n\t\t}\n\t}\n\treturn objs\n}\n\nfunc getMarkerValues(name string, markerValues map[string][]interface{}) []interface{} {\n\tvalues := markerValues[name]\n\tif len(values) == 0 {\n\t\treturn nil\n\t}\n\treturn values\n}\n"
  },
  {
    "path": "cmd/plugin/codegen/generators/feature/gen_integration_test.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage feature\n\nimport (\n\t\"os\"\n\n\t. \"github.com/onsi/ginkgo\"\n\t. \"github.com/onsi/gomega\"\n\t\"sigs.k8s.io/controller-tools/pkg/genall\"\n\t\"sigs.k8s.io/controller-tools/pkg/loader\"\n\t\"sigs.k8s.io/controller-tools/pkg/markers\"\n\t\"sigs.k8s.io/yaml\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n)\n\nvar _ = Describe(\"Feature CR generated by the Feature Generator\", func() {\n\tIt(\"should generate only one Feature CR\", func() {\n\t\tcwd, err := os.Getwd()\n\t\tExpect(err).NotTo(HaveOccurred())\n\t\tExpect(os.Chdir(\"./fakeData\")).To(Succeed())\n\t\tdefer func() { Expect(os.Chdir(cwd)).To(Succeed()) }()\n\n\t\tBy(\"loading the roots\")\n\t\tpkgs, err := loader.LoadRoots(\"./mykind_types.go\")\n\t\tExpect(err).NotTo(HaveOccurred())\n\n\t\tBy(\"registering Feature rule marker\")\n\t\treg := &markers.Registry{}\n\t\tExpect(reg.Register(RuleDefinition)).To(Succeed())\n\n\t\tBy(\"creating GenerationContext\")\n\t\tctx := &genall.GenerationContext{\n\t\t\tCollector: &markers.Collector{Registry: reg},\n\t\t\tRoots:     pkgs,\n\t\t}\n\n\t\tBy(\"generating a Feature\")\n\t\tfeatures := generateFeatures(ctx)\n\t\tExpect(err).NotTo(HaveOccurred())\n\t\tExpect(len(features)).To(Equal(1))\n\n\t\tBy(\"loading the desired YAML\")\n\t\tfooFeatureCRBytes, err := os.ReadFile(\"./foo.yaml\")\n\t\tExpect(err).NotTo(HaveOccurred())\n\n\t\tBy(\"comparing the generated Feature and expected Feature\")\n\t\tfeature := features[0]\n\t\tvar expectedFooFeature corev1alpha2.Feature\n\t\tExpect(yaml.Unmarshal(fooFeatureCRBytes, &expectedFooFeature)).To(Succeed())\n\t\tExpect(feature).To(Equal(expectedFooFeature))\n\t})\n\n\tIt(\"should generate multiple Feature CRs\", func() {\n\t\tcwd, err := os.Getwd()\n\t\tExpect(err).NotTo(HaveOccurred())\n\t\tExpect(os.Chdir(\"./fakeData\")).To(Succeed())\n\t\tdefer func() { Expect(os.Chdir(cwd)).To(Succeed()) }()\n\n\t\tBy(\"loading the roots\")\n\t\tpkgs, err := loader.LoadRoots(\"./cronjob_types.go\")\n\t\tExpect(err).NotTo(HaveOccurred())\n\n\t\tBy(\"registering Feature rule marker\")\n\t\treg := &markers.Registry{}\n\t\tExpect(reg.Register(RuleDefinition)).To(Succeed())\n\n\t\tBy(\"creating GenerationContext\")\n\t\tctx := &genall.GenerationContext{\n\t\t\tCollector: &markers.Collector{Registry: reg},\n\t\t\tRoots:     pkgs,\n\t\t}\n\n\t\tBy(\"generating a Feature\")\n\t\tfeatures := generateFeatures(ctx)\n\t\tExpect(err).NotTo(HaveOccurred())\n\t\tExpect(len(features)).To(Equal(2))\n\n\t\tBy(\"loading the desired YAML\")\n\t\tbarFeatureCRBytes, err := os.ReadFile(\"./bar.yaml\")\n\t\tExpect(err).NotTo(HaveOccurred())\n\t\tbazFeatureCRBytes, err := os.ReadFile(\"./baz.yaml\")\n\t\tExpect(err).NotTo(HaveOccurred())\n\n\t\tBy(\"comparing the generated Features and expected Features\")\n\t\tbarFeature := features[0]\n\t\tvar expectedBarFeature corev1alpha2.Feature\n\t\tExpect(yaml.Unmarshal(barFeatureCRBytes, &expectedBarFeature)).To(Succeed())\n\t\tExpect(barFeature).To(Equal(expectedBarFeature))\n\n\t\tbazFeature := features[1]\n\t\tvar expectedBazFeature corev1alpha2.Feature\n\t\tExpect(yaml.Unmarshal(bazFeatureCRBytes, &expectedBazFeature)).To(Succeed())\n\t\tExpect(bazFeature).To(Equal(expectedBazFeature))\n\t})\n\n\tIt(\"should not generate any Feature CR\", func() {\n\t\tcwd, err := os.Getwd()\n\t\tExpect(err).NotTo(HaveOccurred())\n\t\tExpect(os.Chdir(\"./fakeData\")).To(Succeed())\n\t\tdefer func() { Expect(os.Chdir(cwd)).To(Succeed()) }()\n\n\t\tBy(\"loading the roots\")\n\t\tpkgs, err := loader.LoadRoots(\"./memcached_types.go\")\n\t\tExpect(err).NotTo(HaveOccurred())\n\n\t\tBy(\"registering Feature rule marker\")\n\t\treg := &markers.Registry{}\n\t\tExpect(reg.Register(RuleDefinition)).To(Succeed())\n\n\t\tBy(\"creating GenerationContext\")\n\t\tctx := &genall.GenerationContext{\n\t\t\tCollector: &markers.Collector{Registry: reg},\n\t\t\tRoots:     pkgs,\n\t\t}\n\n\t\tBy(\"generating a Feature\")\n\t\tfeatures := generateFeatures(ctx)\n\t\tExpect(err).NotTo(HaveOccurred())\n\t\tExpect(len(features)).To(BeZero())\n\t})\n})\n"
  },
  {
    "path": "cmd/plugin/codegen/go.mod",
    "content": "module github.com/vmware-tanzu/tanzu-framework/cmd/plugin/codegen\n\ngo 1.19\n\nreplace github.com/vmware-tanzu/tanzu-framework/apis/core => ./../../../apis/core\n\nrequire (\n\tgithub.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489\n\tgithub.com/onsi/ginkgo v1.16.5\n\tgithub.com/onsi/gomega v1.27.2\n\tgithub.com/spf13/cobra v1.6.1\n\tgithub.com/vmware-tanzu/tanzu-framework/apis/core v0.0.0-00010101000000-000000000000\n\tgithub.com/vmware-tanzu/tanzu-plugin-runtime v0.89.0\n\tk8s.io/apimachinery v0.25.4\n\tsigs.k8s.io/controller-tools v0.7.0\n\tsigs.k8s.io/yaml v1.3.0\n)\n\nrequire (\n\tgithub.com/AlecAivazis/survey/v2 v2.3.6 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/briandowns/spinner v1.19.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.1 // indirect\n\tgithub.com/emicklei/go-restful/v3 v3.9.0 // indirect\n\tgithub.com/evanphx/json-patch/v5 v5.6.0 // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fsnotify/fsnotify v1.6.0 // indirect\n\tgithub.com/ghodss/yaml v1.0.0 // indirect\n\tgithub.com/go-logr/logr v1.2.3 // indirect\n\tgithub.com/go-openapi/jsonpointer v0.19.6 // indirect\n\tgithub.com/go-openapi/jsonreference v0.20.1 // indirect\n\tgithub.com/go-openapi/swag v0.22.3 // indirect\n\tgithub.com/gogo/protobuf v1.3.2 // indirect\n\tgithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/gnostic v0.6.9 // indirect\n\tgithub.com/google/go-cmp v0.5.9 // indirect\n\tgithub.com/google/gofuzz v1.2.0 // indirect\n\tgithub.com/google/uuid v1.3.0 // indirect\n\tgithub.com/imdario/mergo v0.3.13 // indirect\n\tgithub.com/inconshreveable/mousetrap v1.0.1 // indirect\n\tgithub.com/josharian/intern v1.0.0 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect\n\tgithub.com/logrusorgru/aurora v2.0.3+incompatible // indirect\n\tgithub.com/mailru/easyjson v0.7.7 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.16 // indirect\n\tgithub.com/mattn/go-runewidth v0.0.13 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions v1.0.2 // indirect\n\tgithub.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect\n\tgithub.com/nxadm/tail v1.4.8 // indirect\n\tgithub.com/olekukonko/tablewriter v0.0.5 // indirect\n\tgithub.com/pkg/errors v0.9.1 // indirect\n\tgithub.com/prometheus/client_golang v1.14.0 // indirect\n\tgithub.com/prometheus/client_model v0.3.0 // indirect\n\tgithub.com/prometheus/common v0.37.0 // indirect\n\tgithub.com/prometheus/procfs v0.8.0 // indirect\n\tgithub.com/rivo/uniseg v0.2.0 // indirect\n\tgithub.com/russross/blackfriday/v2 v2.1.0 // indirect\n\tgithub.com/spf13/pflag v1.0.5 // indirect\n\tgithub.com/stretchr/testify v1.8.2 // indirect\n\tgo.uber.org/atomic v1.10.0 // indirect\n\tgo.uber.org/multierr v1.8.0 // indirect\n\tgo.uber.org/zap v1.23.0 // indirect\n\tgolang.org/x/mod v0.8.0 // indirect\n\tgolang.org/x/net v0.8.0 // indirect\n\tgolang.org/x/oauth2 v0.5.0 // indirect\n\tgolang.org/x/sys v0.6.0 // indirect\n\tgolang.org/x/term v0.6.0 // indirect\n\tgolang.org/x/text v0.8.0 // indirect\n\tgolang.org/x/time v0.3.0 // indirect\n\tgolang.org/x/tools v0.6.0 // indirect\n\tgomodules.xyz/jsonpatch/v2 v2.2.0 // indirect\n\tgoogle.golang.org/appengine v1.6.7 // indirect\n\tgoogle.golang.org/protobuf v1.28.1 // indirect\n\tgopkg.in/inf.v0 v0.9.1 // indirect\n\tgopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect\n\tgopkg.in/yaml.v2 v2.4.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tk8s.io/api v0.25.4 // indirect\n\tk8s.io/apiextensions-apiserver v0.25.2 // indirect\n\tk8s.io/client-go v0.25.4 // indirect\n\tk8s.io/component-base v0.25.2 // indirect\n\tk8s.io/klog/v2 v2.80.1 // indirect\n\tk8s.io/kube-openapi v0.0.0-20230118215034-64b6bb138190 // indirect\n\tk8s.io/utils v0.0.0-20230115233650-391b47cb4029 // indirect\n\tsigs.k8s.io/controller-runtime v0.13.1 // indirect\n\tsigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect\n\tsigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect\n)\n"
  },
  {
    "path": "cmd/plugin/codegen/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=\ncloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=\ncloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=\ncloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=\ncloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngithub.com/AlecAivazis/survey/v2 v2.3.6 h1:NvTuVHISgTHEHeBFqt6BHOe4Ny/NwGZr7w+F8S9ziyw=\ngithub.com/AlecAivazis/survey/v2 v2.3.6/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI=\ngithub.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=\ngithub.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=\ngithub.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=\ngithub.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA=\ngithub.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M=\ngithub.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=\ngithub.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=\ngithub.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=\ngithub.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=\ngithub.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=\ngithub.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s=\ngithub.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w=\ngithub.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=\ngithub.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=\ngithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=\ngithub.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 h1:DKOk8ZLAPnn4P/qTwGj5x5wAMqHmaE1oL4+nl1laIu8=\ngithub.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489/go.mod h1:ze/JIQHfGKwpM8U2b39e8OH0KHt1ovEcjwPV3yfU+/c=\ngithub.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=\ngithub.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=\ngithub.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=\ngithub.com/briandowns/spinner v1.19.0 h1:s8aq38H+Qju89yhp89b4iIiMzMm8YN3p6vGpwyh/a8E=\ngithub.com/briandowns/spinner v1.19.0/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU=\ngithub.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=\ngithub.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=\ngithub.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=\ngithub.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=\ngithub.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=\ngithub.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=\ngithub.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=\ngithub.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=\ngithub.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=\ngithub.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=\ngithub.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=\ngithub.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI=\ngithub.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=\ngithub.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=\ngithub.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=\ngithub.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=\ngithub.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=\ngithub.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=\ngithub.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=\ngithub.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE=\ngithub.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ=\ngithub.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=\ngithub.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U=\ngithub.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww=\ngithub.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=\ngithub.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0=\ngithub.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=\ngithub.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=\ngithub.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=\ngithub.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=\ngithub.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=\ngithub.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=\ngithub.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=\ngithub.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=\ngithub.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=\ngithub.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=\ngithub.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=\ngithub.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=\ngithub.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A=\ngithub.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=\ngithub.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=\ngithub.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=\ngithub.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg=\ngithub.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8=\ngithub.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=\ngithub.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=\ngithub.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=\ngithub.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=\ngithub.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=\ngithub.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=\ngithub.com/gobuffalo/flect v0.2.3/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc=\ngithub.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=\ngithub.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0=\ngithub.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=\ngithub.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=\ngithub.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU=\ngithub.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=\ngithub.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=\ngithub.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=\ngithub.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=\ngithub.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=\ngithub.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=\ngithub.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=\ngithub.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=\ngithub.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=\ngithub.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=\ngithub.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog=\ngithub.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68=\ngithub.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=\ngithub.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk=\ngithub.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg=\ngithub.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=\ngithub.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=\ngithub.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=\ngithub.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=\ngithub.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=\ngithub.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=\ngithub.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=\ngithub.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=\ngithub.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=\ngithub.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=\ngithub.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8=\ngithub.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=\ngithub.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=\ngithub.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=\ngithub.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=\ngithub.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=\ngithub.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=\ngithub.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=\ngithub.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2 h1:hAHbPm5IJGijwng3PWk09JkG9WeqChjprR5s9bBZ+OM=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=\ngithub.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4=\ngithub.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=\ngithub.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=\ngithub.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=\ngithub.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=\ngithub.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=\ngithub.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=\ngithub.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=\ngithub.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=\ngithub.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=\ngithub.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=\ngithub.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=\ngithub.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=\ngithub.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=\ngithub.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=\ngithub.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=\ngithub.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=\ngithub.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=\ngithub.com/onsi/ginkgo/v2 v2.8.4 h1:gf5mIQ8cLFieruNLAdgijHF1PYfLphKm2dxxcUtcqK0=\ngithub.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=\ngithub.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=\ngithub.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=\ngithub.com/onsi/gomega v1.14.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0=\ngithub.com/onsi/gomega v1.27.2 h1:SKU0CXeKE/WVgIV1T61kSa3+IRE8Ekrv9rdXDwwTqnY=\ngithub.com/onsi/gomega v1.27.2/go.mod h1:5mR3phAHpkAVIDkHEUBY6HGVsU+cpcEscrGPB4oPlZI=\ngithub.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=\ngithub.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=\ngithub.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=\ngithub.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=\ngithub.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=\ngithub.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=\ngithub.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=\ngithub.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=\ngithub.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=\ngithub.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=\ngithub.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0=\ngithub.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=\ngithub.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=\ngithub.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=\ngithub.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=\ngithub.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=\ngithub.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=\ngithub.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=\ngithub.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=\ngithub.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=\ngithub.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=\ngithub.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=\ngithub.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=\ngithub.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=\ngithub.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=\ngithub.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=\ngithub.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=\ngithub.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=\ngithub.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=\ngithub.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=\ngithub.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=\ngithub.com/vmware-tanzu/tanzu-plugin-runtime v0.89.0 h1:DsQgQ+Qa6DiuwZihprPZ62oe7H8eFNh4iAvUjhMzzQk=\ngithub.com/vmware-tanzu/tanzu-plugin-runtime v0.89.0/go.mod h1:y70TLdev7MX8K6CkAA7h92qVUDyjbX8y9/J5q4UmhRs=\ngithub.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=\ngithub.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=\ngithub.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=\ngithub.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngo.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=\ngo.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=\ngo.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=\ngo.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=\ngo.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=\ngo.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0=\ngo.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE=\ngo.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc=\ngo.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=\ngo.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=\ngo.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=\ngo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E=\ngo.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=\ngo.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=\ngo.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM=\ngo.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=\ngo.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=\ngo.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=\ngo.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE=\ngo.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE=\ngo.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=\ngo.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=\ngo.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=\ngo.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=\ngo.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=\ngo.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=\ngo.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=\ngo.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=\ngo.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=\ngo.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=\ngo.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=\ngo.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=\ngo.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=\ngo.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=\ngo.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY=\ngo.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=\ngolang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=\ngolang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s=\ngolang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw=\ngolang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=\ngolang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=\ngolang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=\ngolang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY=\ngomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=\ngoogle.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=\ngoogle.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=\ngoogle.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=\ngoogle.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=\ngoogle.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=\ngoogle.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=\ngoogle.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=\ngoogle.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=\ngoogle.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=\ngoogle.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=\ngoogle.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\ngoogle.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\ngoogle.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=\ngopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=\ngopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=\ngopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=\ngopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=\ngopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=\ngopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=\ngotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nk8s.io/api v0.22.2/go.mod h1:y3ydYpLJAaDI+BbSe2xmGcqxiWHmWjkEeIbiwHvnPR8=\nk8s.io/api v0.25.4 h1:3YO8J4RtmG7elEgaWMb4HgmpS2CfY1QlaOz9nwB+ZSs=\nk8s.io/api v0.25.4/go.mod h1:IG2+RzyPQLllQxnhzD8KQNEu4c4YvyDTpSMztf4A0OQ=\nk8s.io/apiextensions-apiserver v0.22.2/go.mod h1:2E0Ve/isxNl7tWLSUDgi6+cmwHi5fQRdwGVCxbC+KFA=\nk8s.io/apiextensions-apiserver v0.25.2 h1:8uOQX17RE7XL02ngtnh3TgifY7EhekpK+/piwzQNnBo=\nk8s.io/apiextensions-apiserver v0.25.2/go.mod h1:iRwwRDlWPfaHhuBfQ0WMa5skdQfrE18QXJaJvIDLvE8=\nk8s.io/apimachinery v0.22.2/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0=\nk8s.io/apimachinery v0.25.4 h1:CtXsuaitMESSu339tfhVXhQrPET+EiWnIY1rcurKnAc=\nk8s.io/apimachinery v0.25.4/go.mod h1:jaF9C/iPNM1FuLl7Zuy5b9v+n35HGSh6AQ4HYRkCqwo=\nk8s.io/apiserver v0.22.2/go.mod h1:vrpMmbyjWrgdyOvZTSpsusQq5iigKNWv9o9KlDAbBHI=\nk8s.io/client-go v0.22.2/go.mod h1:sAlhrkVDf50ZHx6z4K0S40wISNTarf1r800F+RlCF6U=\nk8s.io/client-go v0.25.4 h1:3RNRDffAkNU56M/a7gUfXaEzdhZlYhoW8dgViGy5fn8=\nk8s.io/client-go v0.25.4/go.mod h1:8trHCAC83XKY0wsBIpbirZU4NTUpbuhc2JnI7OruGZw=\nk8s.io/code-generator v0.22.2/go.mod h1:eV77Y09IopzeXOJzndrDyCI88UBok2h6WxAlBwpxa+o=\nk8s.io/component-base v0.22.2/go.mod h1:5Br2QhI9OTe79p+TzPe9JKNQYvEKbq9rTJDWllunGug=\nk8s.io/component-base v0.25.2 h1:Nve/ZyHLUBHz1rqwkjXm/Re6IniNa5k7KgzxZpTfSQY=\nk8s.io/component-base v0.25.2/go.mod h1:90W21YMr+Yjg7MX+DohmZLzjsBtaxQDDwaX4YxDkl60=\nk8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=\nk8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=\nk8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=\nk8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=\nk8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=\nk8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4=\nk8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=\nk8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=\nk8s.io/kube-openapi v0.0.0-20230118215034-64b6bb138190 h1:5MAqxJfshQZ9NdSNGAn7CJ9vuBxAiTaqn3B4pfqD+PE=\nk8s.io/kube-openapi v0.0.0-20230118215034-64b6bb138190/go.mod h1:/BYxry62FuDzmI+i9B+X2pqfySRmSOW2ARmj5Zbqhj0=\nk8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=\nk8s.io/utils v0.0.0-20230115233650-391b47cb4029 h1:L8zDtT4jrxj+TaQYD0k8KNlr556WaVQylDXswKmX+dE=\nk8s.io/utils v0.0.0-20230115233650-391b47cb4029/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=\nsigs.k8s.io/controller-runtime v0.13.1 h1:tUsRCSJVM1QQOOeViGeX3GMT3dQF1eePPw6sEE3xSlg=\nsigs.k8s.io/controller-runtime v0.13.1/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI=\nsigs.k8s.io/controller-tools v0.7.0 h1:iZIz1vEcavyEfxjcTLs1WH/MPf4vhPCtTKhoHqV8/G0=\nsigs.k8s.io/controller-tools v0.7.0/go.mod h1:bpBAo0VcSDDLuWt47evLhMLPxRPxMDInTEH/YbdeMK0=\nsigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k=\nsigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=\nsigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=\nsigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=\nsigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=\nsigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=\nsigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=\n"
  },
  {
    "path": "cmd/plugin/codegen/main.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage main\n\nimport (\n\t\"github.com/aunum/log\"\n\n\tplugintypes \"github.com/vmware-tanzu/tanzu-plugin-runtime/config/types\"\n\t\"github.com/vmware-tanzu/tanzu-plugin-runtime/plugin\"\n\t\"github.com/vmware-tanzu/tanzu-plugin-runtime/plugin/buildinfo\"\n)\n\nvar descriptor = plugin.PluginDescriptor{\n\tName:        \"codegen\",\n\tDescription: \"Tanzu code generation tool\",\n\tTarget:      plugintypes.TargetGlobal,\n\tGroup:       plugin.AdminCmdGroup,\n\tVersion:     buildinfo.Version,\n\tBuildSHA:    buildinfo.SHA,\n}\n\nfunc main() {\n\tp, err := plugin.NewPlugin(&descriptor)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\tp.AddCommands(\n\t\tGenerateCmd,\n\t)\n\n\tif err := p.Execute(); err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "cmd/plugin/codegen/test/fakeData/mykind_types.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage fakedata\n\nimport metav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\n// MyKindSpec defines the desired state of MyKind\ntype MyKindSpec struct {\n\tFoo string `json:\"foo,omitempty\"`\n}\n\n// MyKindStatus defines the observed state of MyKind\ntype MyKindStatus struct {\n}\n\n//+tanzu:feature:name=foo,stability=Stable\n\n// MyKind is the Schema for the mykinds API\ntype MyKind struct {\n\tStatus            MyKindStatus `json:\"status,omitempty\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tSpec              MyKindSpec `json:\"spec,omitempty\"`\n}\n"
  },
  {
    "path": "cmd/plugin/codegen/test/main.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/spf13/cobra\"\n\t\"sigs.k8s.io/yaml\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n\t\"github.com/vmware-tanzu/tanzu-plugin-runtime/plugin\"\n\tclitest \"github.com/vmware-tanzu/tanzu-plugin-runtime/test/framework\"\n)\n\nvar descriptor = clitest.NewTestFor(\"codegen\")\n\nvar featureGenerationTest *clitest.Test\n\nfunc main() {\n\tp, err := plugin.NewPlugin(descriptor)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\tp.Cmd.RunE = test\n\tif err := p.Execute(); err != nil {\n\t\tos.Exit(1)\n\t}\n}\n\nfunc initialize() error {\n\ttempDir, err := os.MkdirTemp(\"\", \"*\")\n\tif err != nil {\n\t\treturn err\n\t}\n\tfeatureGenerationCommand := fmt.Sprintf(\"codegen generate paths=./cmd/cli/plugin/codegen/test/fakeData/... feature output:feature:artifacts:config=%s\", tempDir)\n\tfeatureGenerationTest = clitest.NewTest(\"feature generation\", featureGenerationCommand, func(t *clitest.Test) error {\n\t\tdefer os.Remove(tempDir)\n\t\tif err := t.Exec(); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tfooFeatureCRBytes, err := os.ReadFile(filepath.Join(tempDir, \"foo.yaml\"))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tvar actualFooFeature corev1alpha2.Feature\n\t\tif err := yaml.Unmarshal(fooFeatureCRBytes, &actualFooFeature); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif actualFooFeature.Name != \"foo\" ||\n\t\t\tactualFooFeature.Spec.Stability != \"Stable\" {\n\t\t\treturn fmt.Errorf(\"feature generation was not successful\")\n\t\t}\n\t\treturn nil\n\t})\n\treturn nil\n}\n\nfunc test(c *cobra.Command, _ []string) error {\n\tm := clitest.NewMain(\"codegen\", c, Cleanup)\n\tdefer m.Finish()\n\n\tif err := initialize(); err != nil {\n\t\treturn err\n\t}\n\n\tm.AddTest(featureGenerationTest)\n\n\treturn featureGenerationTest.Run()\n}\n\n// Cleanup the test.\nfunc Cleanup() error {\n\treturn nil\n}\n"
  },
  {
    "path": "cmd/plugin/feature/README.md",
    "content": "# Feature\n\nFeature plugin gives access to features using featuregates.\n\n## Usage\n\nFeature plugin has three commands:\n\n1. list - allows to list the features that are gated by a particular\n   FeatureGate.\n2. activate - allows to activate a feature.\n3. deactivate - allows to deactivate a feature.\n\nFeature plugin is able to list all discoverable features on the cluster.\nOptionally, a FeatureGate may be specified by using the `featuregate` flag.\n\nExample:\n\n```sh\n# list Features associated with tkg-system FeatureGate\ntanzu feature list\n# list Features associated with tkg-system-sample FeatureGate\ntanzu feature list --featuregate=tkg-system-sample\n```\n\n```sh\n>>> tanzu feature --help\nOperate on features and featuregates\n\nUsage:\n  tanzu feature [command]\n\nAvailable Commands:\n  activate      Activate Features\n  deactivate    Deactivate Features\n  list          List Features\n\nFlags:\n  -h, --help   help for feature\n\nUse \"tanzu feature [command] --help\" for more information about a command.\n```\n\n### list command\n\n```sh\n>>> tanzu feature list --help\nList features\n\nUsage:\n  tanzu feature list [flags]\n\nExamples:\n  \n    # List feature(s) in the cluster.\n    tanzu feature list --activated\n    tanzu feature list --deactivated\n\nFlags:\n  -a, --activated                             List only activated features\n  -d, --deactivated                           List only deactivated features\n  -e, --extended                              Include extended output\n  -f, --featuregate string                    List features gated by a particular FeatureGate\n  -h, --help                                  Help for list\n  -x, --include-experimental                  Allows displaying experimental features\n  -o, --output string                         Output format (yaml|json|table)\n```\n\n### activate command\n\n```sh\n>>> tanzu feature activate --help\nActivate Features\n\nUsage:\n  tanzu feature activate <feature> [flags]\n\nExamples:\n  \n    # Activate a cluster Feature\n    tanzu feature activate myfeature\n\nFlags:\n  -f, --featuregate string   Activate a Feature gated by a particular FeatureGate (default \"tkg-system\")\n  -h, --help                 help for activate\n```\n\n### deactivate command\n\n```sh\n>>> tanzu feature deactivate --help\nDeactivate Features\n\nUsage:\n  tanzu feature deactivate <feature> [flags]\n\nExamples:\n  \n    # Deactivate a cluster Feature\n    tanzu feature deactivate myfeature\n\nFlags:\n  -f, --featuregate string   Deactivate Feature gated by a particular FeatureGate (default \"tkg-system\")\n  -h, --help                 help for deactivate\n```\n"
  },
  {
    "path": "cmd/plugin/feature/activate.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/spf13/cobra\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n\t\"github.com/vmware-tanzu/tanzu-framework/featuregates/client/pkg/featuregateclient\"\n)\n\nvar (\n\tuserAllowsVoidingWarranty bool\n)\n\n// FeatureActivateCmd is for activating Features\nvar FeatureActivateCmd = &cobra.Command{\n\tUse:   \"activate <feature>\",\n\tShort: \"Activate features\",\n\tArgs:  cobra.ExactArgs(1),\n\tExample: `\n\t# Activate a cluster Feature\n\ttanzu feature activate myfeature`,\n\tRunE: featureActivate,\n}\n\nfunc init() {\n\tFeatureActivateCmd.Flags().BoolVar(&userAllowsVoidingWarranty, \"permanentlyVoidAllSupportGuarantees\", false, \"Allow for the permanent voiding of all support guarantees for this environment. For some features, e.g. experimental features, if a user sets the activation status to one that does not match the default activation, all support guarantees for this environment will be permanently voided.\")\n}\n\nfunc featureActivate(cmd *cobra.Command, args []string) error {\n\tfeatureName := args[0]\n\n\tfgClient, err := featuregateclient.NewFeatureGateClient()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"could not get FeatureGateClient: %w\", err)\n\t}\n\n\tctx, cancel := context.WithTimeout(context.Background(), contextTimeout)\n\tdefer cancel()\n\n\tvar userAllows *bool\n\tif cmd.Flags().Changed(\"permanentlyVoidAllSupportGuarantees\") {\n\t\tuserAllows = &userAllowsVoidingWarranty\n\t}\n\n\tgateName, err := activateFeature(ctx, fgClient, featureName, userAllows)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"could not activate Feature %s: %w\", featureName, err)\n\t}\n\n\tcmd.Printf(\"Feature %s gated by FeatureGate %s is activated.\\n\", featureName, gateName)\n\treturn nil\n}\n\nfunc activateFeature(ctx context.Context, fgClient *featuregateclient.FeatureGateClient, featureName string, userAllows *bool) (string, error) {\n\tfeature, err := fgClient.GetFeature(ctx, featureName)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"could not get Feature %s: %w\", featureName, err)\n\t}\n\n\tgates, err := fgClient.GetFeatureGateList(ctx)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"could not get FeatureGate List: %w\", err)\n\t}\n\n\tgateName, featRef := featuregateclient.FeatureRefFromGateList(gates, featureName)\n\n\tvar proceedWithVoidingWarranty bool\n\tif willWarrantyBeVoided(featRef, feature) {\n\t\t// The warranty will be voided with the request, so check that user allows it.\n\t\tproceedWithVoidingWarranty, err = userGivesPermissionToVoidWarranty(feature, userAllows)\n\t\tif err != nil {\n\t\t\treturn gateName, fmt.Errorf(\"could not get user permission to void warranty for Feature %s: %w\", featureName, err)\n\t\t}\n\t}\n\n\terr = fgClient.ActivateFeature(ctx, featureName, proceedWithVoidingWarranty)\n\tif err != nil {\n\t\treturn gateName, fmt.Errorf(\"could not activate Feature %s gated by FeatureGate %s: %w\", featureName, gateName, err)\n\t}\n\n\tdisplayActivationWarnings(feature)\n\n\treturn gateName, nil\n}\n\n// displayActivationWarnings warns the user that technical preview features are\n// unstable and lack support.\nfunc displayActivationWarnings(feature *corev1alpha2.Feature) {\n\tif feature.Spec.Stability == corev1alpha2.TechnicalPreview {\n\t\tfmt.Printf(\"Warning: Technical preview features are not ready, but are not believed to be dangerous. The feature itself is unsupported, but activating technical preview features does not affect the support status of the environment. Use at your own risk.\\n\\n\")\n\t}\n}\n\n// willWarrantyBeVoided checks that activating the Feature will cause warranty to be voided.\n// Warranty will be voided only if all the following conditions are met:\n//   - The stability policy's VoidsWarranty field value is true. This means changing the activation\n//     set point away from default activation (in this case, default activate will have to be false)\n//     will void the warranty.\n//   - The warranty is not already void. If it's void, then it cannot be voided as it's already void.\n//   - The current Feature activation set point in the FeatureGate reference is false. If the opposite is\n//     true--that the Feature is already set to be activated--then there is nothing to change and\n//     the warranty will not be voided.\n//   - Activating the Feature will set it different than its default activation setting. This means the\n//     default activation of a Feature must be false for the warranty to be voided. On the other hand,\n//     if the default activation is true, then activating the Feature will not void the warranty.\n//\n// If all of the above are true, then the warranty will be voided and the function returns true.\n// Otherwise, if any are false, the warranty will not be voided and the function returns false.\nfunc willWarrantyBeVoided(ref corev1alpha2.FeatureReference, feature *corev1alpha2.Feature) bool {\n\tstability := feature.Spec.Stability\n\tpolicy := corev1alpha2.GetPolicyForStabilityLevel(stability)\n\treturn policy.VoidsWarranty && !ref.PermanentlyVoidAllSupportGuarantees && !ref.Activate && !policy.DefaultActivation\n}\n\nfunc userGivesPermissionToVoidWarranty(feature *corev1alpha2.Feature, userAllowsByFlag *bool) (bool, error) {\n\tif userAllowsByFlag == nil {\n\t\t// Request user permission interactively to void the warranty if not already set by flag.\n\t\tfmt.Printf(\"Warning: activating %q, a %s Feature will irrevocably void all support guarantees for this environment. You will need to recreate the environment to return to a supported state.\\nWould you like to continue [y/N]?\", feature.Name, feature.Spec.Stability)\n\t\treturn userAllowsByInteractiveCLI(nil)\n\t}\n\t// If the user did pass a value to the flag, use the user's input. No interactive user input is needed.\n\treturn *userAllowsByFlag, nil\n}\n\nfunc userAllowsByInteractiveCLI(in *os.File) (bool, error) {\n\tif in == nil {\n\t\tin = os.Stdin\n\t}\n\n\tvar userAnswer string\n\tif n, err := fmt.Fscanln(in, &userAnswer); err != nil {\n\t\tif n == 0 {\n\t\t\treturn false, nil\n\t\t}\n\t\treturn false, fmt.Errorf(\"could not read user input: %w\", err)\n\t}\n\n\tuserAnswer = strings.TrimSpace(strings.ToLower(userAnswer))\n\tswitch {\n\tcase userAnswer == \"yes\" || userAnswer == \"y\":\n\t\treturn true, nil\n\tcase userAnswer == \"\" || userAnswer == \"no\" || userAnswer == \"n\":\n\t\treturn false, nil\n\tdefault:\n\t\tfmt.Printf(\"Please respond with %q or %q\\n\", \"y\", \"n\")\n\t\treturn userAllowsByInteractiveCLI(nil)\n\t}\n}\n"
  },
  {
    "path": "cmd/plugin/feature/activate_test.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage main\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/spf13/cobra\"\n\t\"k8s.io/client-go/kubernetes/scheme\"\n\tcrclient \"sigs.k8s.io/controller-runtime/pkg/client/fake\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n\t\"github.com/vmware-tanzu/tanzu-framework/featuregates/client/pkg/featuregateclient\"\n\t\"github.com/vmware-tanzu/tanzu-framework/featuregates/client/pkg/featuregateclient/fake\"\n)\n\nfunc TestActivateFeature(t *testing.T) {\n\ttype nullBool struct {\n\t\twasSet bool\n\t\tsetTo  bool\n\t}\n\n\ttests := []struct {\n\t\tdescription  string\n\t\tfeatureName  string\n\t\tuserAllows   nullBool\n\t\twantErr      error\n\t\twantActivate bool\n\t}{\n\t\t{\n\t\t\tdescription:  \"activate a technical preview feature\",\n\t\t\tfeatureName:  \"tuna\",\n\t\t\twantErr:      nil,\n\t\t\tuserAllows:   nullBool{wasSet: false},\n\t\t\twantActivate: true,\n\t\t},\n\t\t{\n\t\t\tdescription:  \"activate a deprecated feature\",\n\t\t\tfeatureName:  \"biz\",\n\t\t\twantErr:      nil,\n\t\t\tuserAllows:   nullBool{wasSet: false},\n\t\t\twantActivate: true,\n\t\t},\n\t\t{\n\t\t\tdescription:  \"cannot activate a feature that was not found in cluster\",\n\t\t\tfeatureName:  \"hard-to-get\",\n\t\t\tuserAllows:   nullBool{wasSet: false},\n\t\t\twantErr:      featuregateclient.ErrTypeNotFound,\n\t\t\twantActivate: false,\n\t\t},\n\t\t{\n\t\t\tdescription:  \"activate a stable feature that is already activated\",\n\t\t\tfeatureName:  \"super-toaster\",\n\t\t\tuserAllows:   nullBool{wasSet: false},\n\t\t\twantErr:      nil,\n\t\t\twantActivate: true,\n\t\t},\n\t\t{\n\t\t\tdescription:  \"cannot activate a feature that is not gated by feature gate\",\n\t\t\tfeatureName:  \"specialized-toaster\",\n\t\t\tuserAllows:   nullBool{wasSet: false},\n\t\t\twantErr:      featuregateclient.ErrTypeNotFound,\n\t\t\twantActivate: false,\n\t\t},\n\t\t{\n\t\t\tdescription:  \"cannot activate a feature that is gated by more than one feature gate\",\n\t\t\tfeatureName:  \"baz\",\n\t\t\tuserAllows:   nullBool{wasSet: false},\n\t\t\twantErr:      featuregateclient.ErrTypeTooMany,\n\t\t\twantActivate: false,\n\t\t},\n\t\t{\n\t\t\tdescription:  \"activate experimental feature with user permission\",\n\t\t\tfeatureName:  \"cloud-event-speaker\",\n\t\t\tuserAllows:   nullBool{wasSet: true, setTo: true},\n\t\t\twantErr:      nil,\n\t\t\twantActivate: true,\n\t\t},\n\t\t{\n\t\t\tdescription:  \"don't activate experimental feature when user disallows it\",\n\t\t\tfeatureName:  \"cloud-event-relayer\",\n\t\t\tuserAllows:   nullBool{wasSet: true, setTo: false},\n\t\t\twantErr:      featuregateclient.ErrTypeForbidden,\n\t\t\twantActivate: false,\n\t\t},\n\t\t{\n\t\t\tdescription:  \"don't activate experimental feature when user does not give permission\",\n\t\t\tfeatureName:  \"cloud-event-relayer\",\n\t\t\tuserAllows:   nullBool{wasSet: false},\n\t\t\twantErr:      featuregateclient.ErrTypeForbidden,\n\t\t\twantActivate: false,\n\t\t},\n\t}\n\n\tobjs, _, _ := fake.GetTestObjects()\n\ts := scheme.Scheme\n\tif err := corev1alpha2.AddToScheme(s); err != nil {\n\t\tt.Fatalf(\"unable to add config scheme: (%v)\", err)\n\t}\n\n\tcl := crclient.NewClientBuilder().WithRuntimeObjects(objs...).Build()\n\tfgClient, err := featuregateclient.NewFeatureGateClient(featuregateclient.WithClient(cl))\n\tif err != nil {\n\t\tt.Fatalf(\"unable to get FeatureGate client: %v\", err)\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tvar userAllows *bool\n\t\t\tif tc.userAllows.wasSet {\n\t\t\t\tuserAllows = &tc.userAllows.setTo\n\t\t\t}\n\t\t\t_, err := activateFeature(context.Background(), fgClient, tc.featureName, userAllows)\n\n\t\t\tif !errors.Is(err, tc.wantErr) {\n\t\t\t\tt.Fatalf(\"got error: %v, want: %v\", err, tc.wantErr)\n\t\t\t}\n\n\t\t\tgates, err := fgClient.GetFeatureGateList(context.Background())\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"get FeatureGate List: %v\", err)\n\t\t\t}\n\t\t\t_, ref := featuregateclient.FeatureRefFromGateList(gates, tc.featureName)\n\t\t\tif ref.Activate != tc.wantActivate {\n\t\t\t\tt.Errorf(\"got activate: %t, want: %t\", ref.Activate, tc.wantActivate)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestUserAllowsByInteractiveCLI(t *testing.T) {\n\ttests := []struct {\n\t\tdescription string\n\t\tuserInput   string\n\t\twant        bool\n\t}{\n\t\t{\n\t\t\tdescription: \"return true for user input yes\",\n\t\t\tuserInput:   \"yes\",\n\t\t\twant:        true,\n\t\t},\n\t\t{\n\t\t\tdescription: \"return true for user input Y\",\n\t\t\tuserInput:   \"Y\",\n\t\t\twant:        true,\n\t\t},\n\t\t{\n\t\t\tdescription: \"return true for user input no\",\n\t\t\tuserInput:   \"no\",\n\t\t\twant:        false,\n\t\t},\n\t\t{\n\t\t\tdescription: \"return true for user input N\",\n\t\t\tuserInput:   \"N\",\n\t\t\twant:        false,\n\t\t},\n\t\t{\n\t\t\tdescription: \"return false for no user input\",\n\t\t\tuserInput:   \"\",\n\t\t\twant:        false,\n\t\t},\n\t\t{\n\t\t\tdescription: \"return false for bad user input on first try and no user input on second\",\n\t\t\tuserInput:   \"bad-input\",\n\t\t\twant:        false,\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tin, err := os.CreateTemp(\"\", \"tmp_test_feature_activate\")\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif _, err := in.Write([]byte(tc.userInput)); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif _, err := in.Seek(0, 0); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\tgot, err := userAllowsByInteractiveCLI(in)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif got != tc.want {\n\t\t\t\tt.Errorf(\"got: %t, want: %t\", got, tc.want)\n\t\t\t}\n\n\t\t\t// Clean up temporary file.\n\t\t\tif err := in.Close(); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif err := os.Remove(in.Name()); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestExecuteFeatureActivateCommand(t *testing.T) {\n\ttest := struct {\n\t\tdescription string\n\t\tcmd         *cobra.Command\n\t\tfeatName    string\n\t\terrMsg      string\n\t}{\n\t\tdescription: \"FeatureGateClient cannot connect due to bad configuration\",\n\t\tcmd:         FeatureActivateCmd,\n\t\tfeatName:    \"bazzies\",\n\t\terrMsg:      \"could not get FeatureGateClient\",\n\t}\n\n\tstoredKubeConfig, lastEnvVarOK := os.LookupEnv(\"KUBECONFIG\")\n\tif err := os.Setenv(\"KUBECONFIG\", \"test/k8s_config.kube\"); err != nil {\n\t\tt.Fatalf(\"failed to set test kubeconfig: %v\", err)\n\t}\n\n\ttest.cmd.SetArgs([]string{test.featName})\n\n\terr := test.cmd.Execute()\n\n\tif len(test.errMsg) > 0 {\n\t\tif err == nil {\n\t\t\tt.Fatal(\"expected error, but did not get one\")\n\t\t}\n\n\t\tif !strings.Contains(err.Error(), test.errMsg) {\n\t\t\tt.Errorf(\"got: %s, want error to contain: %s\", err, test.errMsg)\n\t\t}\n\t}\n\n\t// Restore previous kubeconfig if it was set.\n\tif err := restoreEnvVar(\"KUBECONFIG\", storedKubeConfig, lastEnvVarOK); err != nil {\n\t\tt.Errorf(\"unable to restore previous KUBECONFIG envvar: %v\", err)\n\t}\n}\n\nfunc restoreEnvVar(env string, previousVal string, wasPreviouslySet bool) error {\n\tif !wasPreviouslySet {\n\t\tif err := os.Unsetenv(env); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to unset environment variable %q: %w\", env, err)\n\t\t}\n\t\treturn nil\n\t}\n\n\tif err := os.Setenv(env, previousVal); err != nil {\n\t\treturn fmt.Errorf(\"failed to set environment variable %q: %w\", env, err)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "cmd/plugin/feature/deactivate.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/spf13/cobra\"\n\n\t\"github.com/vmware-tanzu/tanzu-framework/featuregates/client/pkg/featuregateclient\"\n)\n\n// FeatureDeactivateCmd is for deactivating Features\nvar FeatureDeactivateCmd = &cobra.Command{\n\tUse:   \"deactivate <feature>\",\n\tShort: \"Deactivate Features\",\n\tArgs:  cobra.ExactArgs(1),\n\tExample: `\n\t# Deactivate a cluster Feature\n\ttanzu feature deactivate myfeature`,\n\tRunE: func(cmd *cobra.Command, args []string) error {\n\t\tfeatureName := args[0]\n\n\t\tfgClient, err := featuregateclient.NewFeatureGateClient()\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"could not get FeatureGateClient: %w\", err)\n\t\t}\n\n\t\tctx, cancel := context.WithTimeout(context.Background(), contextTimeout)\n\t\tdefer cancel()\n\n\t\tgateName, err := deactivateFeature(ctx, fgClient, featureName)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"could not deactivate Feature %s gated by FeatureGate %s: %w\", featureName, gateName, err)\n\t\t}\n\n\t\tcmd.Printf(\"Feature %s gated by FeatureGate %s is deactivated.\\n\", featureName, gateName)\n\t\treturn nil\n\t},\n}\n\nfunc deactivateFeature(ctx context.Context, fgClient *featuregateclient.FeatureGateClient, featureName string) (string, error) {\n\treturn fgClient.DeactivateFeature(ctx, featureName)\n}\n"
  },
  {
    "path": "cmd/plugin/feature/deactivate_test.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage main\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"os\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/spf13/cobra\"\n\t\"k8s.io/client-go/kubernetes/scheme\"\n\tcrclient \"sigs.k8s.io/controller-runtime/pkg/client/fake\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n\t\"github.com/vmware-tanzu/tanzu-framework/featuregates/client/pkg/featuregateclient\"\n\t\"github.com/vmware-tanzu/tanzu-framework/featuregates/client/pkg/featuregateclient/fake\"\n)\n\nfunc TestDeactivateFeature(t *testing.T) {\n\ttests := []struct {\n\t\tdescription  string\n\t\tfeatureName  string\n\t\twantErr      error\n\t\twantActivate bool\n\t}{\n\t\t{\n\t\t\tdescription:  \"deactivate a deprecated feature\",\n\t\t\tfeatureName:  \"biz\",\n\t\t\twantErr:      nil,\n\t\t\twantActivate: false,\n\t\t},\n\t\t{\n\t\t\tdescription:  \"deactivate a technical preview feature\",\n\t\t\tfeatureName:  \"tuna\",\n\t\t\twantErr:      nil,\n\t\t\twantActivate: false,\n\t\t},\n\t\t{\n\t\t\tdescription:  \"deactivate experimental feature\",\n\t\t\tfeatureName:  \"cloud-event-listener\",\n\t\t\twantErr:      nil,\n\t\t\twantActivate: false,\n\t\t},\n\t\t{\n\t\t\tdescription:  \"cannot deactivate a stable feature\",\n\t\t\tfeatureName:  \"super-toaster\",\n\t\t\twantErr:      featuregateclient.ErrTypeForbidden,\n\t\t\twantActivate: true,\n\t\t},\n\t\t{\n\t\t\tdescription:  \"cannot deactivate a feature that is not gated by feature gate\",\n\t\t\tfeatureName:  \"hard-to-get\",\n\t\t\twantErr:      featuregateclient.ErrTypeNotFound,\n\t\t\twantActivate: false,\n\t\t},\n\t\t{\n\t\t\tdescription:  \"cannot deactivate a feature that is gated by more than one feature gate\",\n\t\t\tfeatureName:  \"bazzies\",\n\t\t\twantErr:      featuregateclient.ErrTypeTooMany,\n\t\t\twantActivate: true,\n\t\t},\n\t}\n\n\tobjs, _, _ := fake.GetTestObjects()\n\ts := scheme.Scheme\n\tif err := corev1alpha2.AddToScheme(s); err != nil {\n\t\tt.Fatalf(\"unable to add config scheme: (%v)\", err)\n\t}\n\n\tcl := crclient.NewClientBuilder().WithRuntimeObjects(objs...).Build()\n\tfgClient, err := featuregateclient.NewFeatureGateClient(featuregateclient.WithClient(cl))\n\tif err != nil {\n\t\tt.Fatalf(\"unable to get FeatureGate client: %v\", err)\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\t_, err := deactivateFeature(context.Background(), fgClient, tc.featureName)\n\n\t\t\tif !errors.Is(err, tc.wantErr) {\n\t\t\t\tt.Fatalf(\"got error: %v, want: %v\", err, tc.wantErr)\n\t\t\t}\n\n\t\t\tgates, err := fgClient.GetFeatureGateList(context.Background())\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"get FeatureGate List: %v\", err)\n\t\t\t}\n\t\t\t_, ref := featuregateclient.FeatureRefFromGateList(gates, tc.featureName)\n\t\t\tif ref.Activate != tc.wantActivate {\n\t\t\t\tt.Errorf(\"got activate: %t, want: %t\", ref.Activate, tc.wantActivate)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestExecuteFeatureDeactivateCommand(t *testing.T) {\n\ttest := struct {\n\t\tdescription string\n\t\tcmd         *cobra.Command\n\t\tfeatName    string\n\t\terrMsg      string\n\t}{\n\t\tdescription: \"FeatureGateClient cannot connect due to bad configuration\",\n\t\tcmd:         FeatureDeactivateCmd,\n\t\tfeatName:    \"bazzies\",\n\t\terrMsg:      \"could not get FeatureGateClient\",\n\t}\n\n\tstoredKubeConfig, lastEnvVarOK := os.LookupEnv(\"KUBECONFIG\")\n\tif err := os.Setenv(\"KUBECONFIG\", \"test/k8s_config.kube\"); err != nil {\n\t\tt.Fatalf(\"failed to set test kubeconfig: %v\", err)\n\t}\n\n\ttest.cmd.SetArgs([]string{test.featName})\n\n\terr := test.cmd.Execute()\n\n\tif len(test.errMsg) > 0 {\n\t\tif err == nil {\n\t\t\tt.Fatal(\"expected error, but did not get one\")\n\t\t}\n\n\t\tif !strings.Contains(err.Error(), test.errMsg) {\n\t\t\tt.Errorf(\"got: %s, want error to contain: %s\", err, test.errMsg)\n\t\t}\n\t}\n\n\t// Restore previous kubeconfig if it was set.\n\tif err := restoreEnvVar(\"KUBECONFIG\", storedKubeConfig, lastEnvVarOK); err != nil {\n\t\tt.Errorf(\"unable to restore previous KUBECONFIG envvar: %v\", err)\n\t}\n}\n"
  },
  {
    "path": "cmd/plugin/feature/go.mod",
    "content": "module github.com/vmware-tanzu/tanzu-framework/cmd/plugin/feature\n\ngo 1.19\n\nreplace (\n\tgithub.com/vmware-tanzu/tanzu-framework/apis/config => ./../../../apis/config\n\tgithub.com/vmware-tanzu/tanzu-framework/apis/core => ./../../../apis/core\n\tgithub.com/vmware-tanzu/tanzu-framework/featuregates/client => ./../../../featuregates/client\n\tgithub.com/vmware-tanzu/tanzu-framework/util => ./../../../util\n)\n\nrequire (\n\tgithub.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489\n\tgithub.com/spf13/cobra v1.6.1\n\tgithub.com/vmware-tanzu/tanzu-framework/apis/core v0.0.0-00010101000000-000000000000\n\tgithub.com/vmware-tanzu/tanzu-framework/featuregates/client v0.0.0-00010101000000-000000000000\n\tgithub.com/vmware-tanzu/tanzu-plugin-runtime v0.80.0\n\tk8s.io/client-go v0.25.4\n\tsigs.k8s.io/controller-runtime v0.13.1\n)\n\nrequire (\n\tgithub.com/AlecAivazis/survey/v2 v2.3.6 // indirect\n\tgithub.com/Masterminds/goutils v1.1.1 // indirect\n\tgithub.com/Masterminds/semver v1.5.0 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/briandowns/spinner v1.19.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n\tgithub.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.1 // indirect\n\tgithub.com/emicklei/go-restful/v3 v3.9.0 // indirect\n\tgithub.com/evanphx/json-patch v5.6.0+incompatible // indirect\n\tgithub.com/evanphx/json-patch/v5 v5.6.0 // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fsnotify/fsnotify v1.6.0 // indirect\n\tgithub.com/ghodss/yaml v1.0.0 // indirect\n\tgithub.com/go-logr/logr v1.2.3 // indirect\n\tgithub.com/go-openapi/jsonpointer v0.19.6 // indirect\n\tgithub.com/go-openapi/jsonreference v0.20.1 // indirect\n\tgithub.com/go-openapi/swag v0.22.3 // indirect\n\tgithub.com/go-task/slim-sprig v2.20.0+incompatible // indirect\n\tgithub.com/gogo/protobuf v1.3.2 // indirect\n\tgithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/gnostic v0.6.9 // indirect\n\tgithub.com/google/go-cmp v0.5.9 // indirect\n\tgithub.com/google/gofuzz v1.2.0 // indirect\n\tgithub.com/google/uuid v1.3.0 // indirect\n\tgithub.com/huandu/xstrings v1.4.0 // indirect\n\tgithub.com/imdario/mergo v0.3.13 // indirect\n\tgithub.com/inconshreveable/mousetrap v1.0.1 // indirect\n\tgithub.com/josharian/intern v1.0.0 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b // indirect\n\tgithub.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect\n\tgithub.com/logrusorgru/aurora v2.0.3+incompatible // indirect\n\tgithub.com/mailru/easyjson v0.7.7 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.16 // indirect\n\tgithub.com/mattn/go-runewidth v0.0.13 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions v1.0.2 // indirect\n\tgithub.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect\n\tgithub.com/olekukonko/tablewriter v0.0.5 // indirect\n\tgithub.com/pkg/errors v0.9.1 // indirect\n\tgithub.com/prometheus/client_golang v1.14.0 // indirect\n\tgithub.com/prometheus/client_model v0.3.0 // indirect\n\tgithub.com/prometheus/common v0.37.0 // indirect\n\tgithub.com/prometheus/procfs v0.8.0 // indirect\n\tgithub.com/rivo/uniseg v0.2.0 // indirect\n\tgithub.com/russross/blackfriday/v2 v2.1.0 // indirect\n\tgithub.com/spf13/pflag v1.0.5 // indirect\n\tgithub.com/stretchr/testify v1.8.2 // indirect\n\tgo.uber.org/atomic v1.10.0 // indirect\n\tgo.uber.org/multierr v1.8.0 // indirect\n\tgo.uber.org/zap v1.23.0 // indirect\n\tgolang.org/x/crypto v0.6.0 // indirect\n\tgolang.org/x/mod v0.8.0 // indirect\n\tgolang.org/x/net v0.8.0 // indirect\n\tgolang.org/x/oauth2 v0.5.0 // indirect\n\tgolang.org/x/sys v0.6.0 // indirect\n\tgolang.org/x/term v0.6.0 // indirect\n\tgolang.org/x/text v0.8.0 // indirect\n\tgolang.org/x/time v0.3.0 // indirect\n\tgomodules.xyz/jsonpatch/v2 v2.2.0 // indirect\n\tgoogle.golang.org/appengine v1.6.7 // indirect\n\tgoogle.golang.org/protobuf v1.28.1 // indirect\n\tgopkg.in/inf.v0 v0.9.1 // indirect\n\tgopkg.in/yaml.v2 v2.4.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tk8s.io/api v0.25.4 // indirect\n\tk8s.io/apiextensions-apiserver v0.25.4 // indirect\n\tk8s.io/apimachinery v0.25.4 // indirect\n\tk8s.io/component-base v0.25.4 // indirect\n\tk8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54 // indirect\n\tk8s.io/kube-openapi v0.0.0-20230118215034-64b6bb138190 // indirect\n\tk8s.io/utils v0.0.0-20230115233650-391b47cb4029 // indirect\n\tsigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect\n\tsigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect\n\tsigs.k8s.io/yaml v1.3.0 // indirect\n)\n"
  },
  {
    "path": "cmd/plugin/feature/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngithub.com/AlecAivazis/survey/v2 v2.3.6 h1:NvTuVHISgTHEHeBFqt6BHOe4Ny/NwGZr7w+F8S9ziyw=\ngithub.com/AlecAivazis/survey/v2 v2.3.6/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=\ngithub.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=\ngithub.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=\ngithub.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=\ngithub.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s=\ngithub.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w=\ngithub.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=\ngithub.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 h1:DKOk8ZLAPnn4P/qTwGj5x5wAMqHmaE1oL4+nl1laIu8=\ngithub.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489/go.mod h1:ze/JIQHfGKwpM8U2b39e8OH0KHt1ovEcjwPV3yfU+/c=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/briandowns/spinner v1.19.0 h1:s8aq38H+Qju89yhp89b4iIiMzMm8YN3p6vGpwyh/a8E=\ngithub.com/briandowns/spinner v1.19.0/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU=\ngithub.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI=\ngithub.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=\ngithub.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE=\ngithub.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ=\ngithub.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U=\ngithub.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=\ngithub.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww=\ngithub.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0=\ngithub.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=\ngithub.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=\ngithub.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=\ngithub.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=\ngithub.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A=\ngithub.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=\ngithub.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=\ngithub.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8=\ngithub.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=\ngithub.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=\ngithub.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/go-task/slim-sprig v2.20.0+incompatible h1:4Xh3bDzO29j4TWNOI+24ubc0vbVFMg2PMnXKxK54/CA=\ngithub.com/go-task/slim-sprig v2.20.0+incompatible/go.mod h1:N/mhXZITr/EQAOErEHciKvO1bFei2Lld2Ym6h96pdy0=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0=\ngithub.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=\ngithub.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99 h1:Ak8CrdlwwXwAZxzS66vgPt4U8yUZX7JwLvVR58FN5jM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=\ngithub.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog=\ngithub.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68=\ngithub.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU=\ngithub.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk=\ngithub.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg=\ngithub.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=\ngithub.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=\ngithub.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=\ngithub.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=\ngithub.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b h1:FQ7+9fxhyp82ks9vAuyPzG0/vVbWwMwLJ+P6yJI5FN8=\ngithub.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b/go.mod h1:HMcgvsgd0Fjj4XXDkbjdmlbI505rUPBs6WBMYg2pXks=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=\ngithub.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8=\ngithub.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=\ngithub.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=\ngithub.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=\ngithub.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=\ngithub.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=\ngithub.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2 h1:hAHbPm5IJGijwng3PWk09JkG9WeqChjprR5s9bBZ+OM=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=\ngithub.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4=\ngithub.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=\ngithub.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=\ngithub.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=\ngithub.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=\ngithub.com/onsi/ginkgo/v2 v2.8.4 h1:gf5mIQ8cLFieruNLAdgijHF1PYfLphKm2dxxcUtcqK0=\ngithub.com/onsi/gomega v1.27.2 h1:SKU0CXeKE/WVgIV1T61kSa3+IRE8Ekrv9rdXDwwTqnY=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=\ngithub.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=\ngithub.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=\ngithub.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=\ngithub.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=\ngithub.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=\ngithub.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=\ngithub.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk=\ngithub.com/vmware-tanzu/tanzu-plugin-runtime v0.80.0 h1:lUoMXSpa/oH37UJnMY8WFEzjAOQHjcVlwsbxUbEcowg=\ngithub.com/vmware-tanzu/tanzu-plugin-runtime v0.80.0/go.mod h1:y70TLdev7MX8K6CkAA7h92qVUDyjbX8y9/J5q4UmhRs=\ngithub.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=\ngithub.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=\ngithub.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=\ngo.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=\ngo.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=\ngo.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=\ngo.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=\ngo.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=\ngo.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=\ngo.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY=\ngo.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc=\ngolang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=\ngolang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s=\ngolang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw=\ngolang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=\ngolang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=\ngolang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY=\ngomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=\ngoogle.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=\ngoogle.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=\ngopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nk8s.io/api v0.25.4 h1:3YO8J4RtmG7elEgaWMb4HgmpS2CfY1QlaOz9nwB+ZSs=\nk8s.io/api v0.25.4/go.mod h1:IG2+RzyPQLllQxnhzD8KQNEu4c4YvyDTpSMztf4A0OQ=\nk8s.io/apiextensions-apiserver v0.25.4 h1:7hu9pF+xikxQuQZ7/30z/qxIPZc2J1lFElPtr7f+B6U=\nk8s.io/apiextensions-apiserver v0.25.4/go.mod h1:bkSGki5YBoZWdn5pWtNIdGvDrrsRWlmnvl9a+tAw5vQ=\nk8s.io/apimachinery v0.25.4 h1:CtXsuaitMESSu339tfhVXhQrPET+EiWnIY1rcurKnAc=\nk8s.io/apimachinery v0.25.4/go.mod h1:jaF9C/iPNM1FuLl7Zuy5b9v+n35HGSh6AQ4HYRkCqwo=\nk8s.io/client-go v0.25.4 h1:3RNRDffAkNU56M/a7gUfXaEzdhZlYhoW8dgViGy5fn8=\nk8s.io/client-go v0.25.4/go.mod h1:8trHCAC83XKY0wsBIpbirZU4NTUpbuhc2JnI7OruGZw=\nk8s.io/component-base v0.25.4 h1:n1bjg9Yt+G1C0WnIDJmg2fo6wbEU1UGMRiQSjmj7hNQ=\nk8s.io/component-base v0.25.4/go.mod h1:nnZJU8OP13PJEm6/p5V2ztgX2oyteIaAGKGMYb2L2cY=\nk8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54 h1:hWRbsoRWt44OEBnYUd4ceLy4ofBoh+p9vauWp/I5Gdg=\nk8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=\nk8s.io/kube-openapi v0.0.0-20230118215034-64b6bb138190 h1:5MAqxJfshQZ9NdSNGAn7CJ9vuBxAiTaqn3B4pfqD+PE=\nk8s.io/kube-openapi v0.0.0-20230118215034-64b6bb138190/go.mod h1:/BYxry62FuDzmI+i9B+X2pqfySRmSOW2ARmj5Zbqhj0=\nk8s.io/utils v0.0.0-20230115233650-391b47cb4029 h1:L8zDtT4jrxj+TaQYD0k8KNlr556WaVQylDXswKmX+dE=\nk8s.io/utils v0.0.0-20230115233650-391b47cb4029/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/controller-runtime v0.13.1 h1:tUsRCSJVM1QQOOeViGeX3GMT3dQF1eePPw6sEE3xSlg=\nsigs.k8s.io/controller-runtime v0.13.1/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI=\nsigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k=\nsigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=\nsigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=\nsigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=\n"
  },
  {
    "path": "cmd/plugin/feature/list.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/spf13/cobra\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n\t\"github.com/vmware-tanzu/tanzu-framework/featuregates/client/pkg/featuregateclient\"\n\t\"github.com/vmware-tanzu/tanzu-plugin-runtime/component\"\n)\n\nvar (\n\tfeaturegate, outputFormat     string\n\tactivated, deactivated        bool\n\textended, includeExperimental bool\n)\n\n// FeatureListCmd is for listing features in (a) featuregate(s).\nvar FeatureListCmd = &cobra.Command{\n\tUse:   \"list\",\n\tShort: \"List features\",\n\tArgs:  cobra.NoArgs,\n\tExample: `\n\t# List feature(s) in the cluster.\n\ttanzu feature list --activated\n\ttanzu feature list --deactivated`,\n\tRunE: printFeatures,\n}\n\nfunc init() {\n\tFeatureListCmd.Flags().BoolVarP(&extended, \"extended\", \"e\", false, \"Include extended output\")\n\tFeatureListCmd.Flags().StringVarP(&featuregate, \"featuregate\", \"f\", \"\", \"List features gated by specified FeatureGate\")\n\tFeatureListCmd.Flags().BoolVarP(&activated, \"activated\", \"a\", false, \"List only activated features\")\n\tFeatureListCmd.Flags().BoolVarP(&deactivated, \"deactivated\", \"d\", false, \"List only deactivated features\")\n\tFeatureListCmd.PersistentFlags().StringVarP(&outputFormat, \"output\", \"o\", \"\", \"Output format (yaml|json|table)\")\n\tFeatureListCmd.Flags().BoolVarP(&includeExperimental, \"include-experimental\", \"x\", false, \"Include experimental features in list\")\n}\n\n// FeatureInfo is a struct that holds Feature information an if it can be listed by plugin.\ntype FeatureInfo struct {\n\tName         string\n\tDescription  string\n\tStability    corev1alpha2.StabilityLevel\n\tImmutable    bool\n\tDiscoverable bool\n\tFeatureGate  string\n\tActivated    bool\n\tShowInList   bool\n}\n\nfunc printFeatures(cmd *cobra.Command, _ []string) error {\n\tfgClient, err := featuregateclient.NewFeatureGateClient()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"could not get FeatureGateClient: %w\", err)\n\t}\n\n\tctx, cancel := context.WithTimeout(context.Background(), contextTimeout)\n\tdefer cancel()\n\n\tinfos, err := featureInfoList(ctx, fgClient, featuregate)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"could not gather features' information: %w\", err)\n\t}\n\n\tif extended {\n\t\treturn listExtended(cmd, infos)\n\t}\n\treturn listBasic(cmd, infos)\n}\n\n// featureInfoList will determine which features' information will be listed. If a feature's info\n// is displayed or not depends on the flags passed in by the user (e.g., activated, deactivated),\n// as well as the features' discoverable settings and stability levels.\nfunc featureInfoList(ctx context.Context, cl *featuregateclient.FeatureGateClient, featuregate string) ([]FeatureInfo, error) {\n\tclusterFeatures, err := cl.GetFeatureList(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tgateList, err := cl.GetFeatureGateList(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tfeatureInfos := collectFeaturesInfo(gateList.Items, clusterFeatures.Items)\n\n\tsetShowInList(featureInfos, includeExperimental, featuregate)\n\n\tfilteredList := featuresFilteredByFlags(featureInfos, activated, deactivated)\n\treturn filteredList, nil\n}\n\n// collectFeaturesInfo will create a map of features and their information from\n// FeatureGate references and features.\nfunc collectFeaturesInfo(gates []corev1alpha2.FeatureGate, features []corev1alpha2.Feature) map[string]*FeatureInfo {\n\tinfos := map[string]*FeatureInfo{}\n\n\tfor i := range features {\n\t\tpolicy := corev1alpha2.GetPolicyForStabilityLevel(features[i].Spec.Stability)\n\n\t\tinfos[features[i].Name] = &FeatureInfo{\n\t\t\tName:         features[i].Name,\n\t\t\tDescription:  features[i].Spec.Description,\n\t\t\tStability:    features[i].Spec.Stability,\n\t\t\tActivated:    features[i].Status.Activated,\n\t\t\tImmutable:    policy.Immutable,\n\t\t\tDiscoverable: policy.Discoverable,\n\t\t\tFeatureGate:  \"--\",\n\t\t}\n\t}\n\n\tfor i := range gates {\n\t\tfor _, featRef := range gates[i].Spec.Features {\n\t\t\tinfo, ok := infos[featRef.Name]\n\t\t\tif ok {\n\t\t\t\t// FeatureGate referenced Feature is in cluster.\n\t\t\t\tinfo.FeatureGate = gates[i].Name\n\t\t\t}\n\n\t\t\tif !ok {\n\t\t\t\t// FeatureGate referenced Feature is not in cluster. Since the Discoverable policy\n\t\t\t\t// cannot be known until the Feature shows up in cluster, set it to true for now.\n\t\t\t\tinfos[featRef.Name] = &FeatureInfo{\n\t\t\t\t\tName:         featRef.Name,\n\t\t\t\t\tDiscoverable: true,\n\t\t\t\t\tFeatureGate:  gates[i].Name,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn infos\n}\n\n// setShowInList will determine if a Feature will be listed based on Features that can\n// be listed by default and whether or not a FeatureGate was specified by the user.\nfunc setShowInList(infos map[string]*FeatureInfo, inclExperimental bool, gateName string) {\n\tfor _, v := range infos {\n\t\t// Only discoverable features can be listed.\n\t\tv.ShowInList = v.Discoverable\n\n\t\t// Experimental features are not listed by default, but can be listed via flag.\n\t\tif v.Stability == corev1alpha2.Experimental {\n\t\t\tv.ShowInList = inclExperimental\n\t\t}\n\n\t\t// If FeatureGate is specified, delist the Features not gated.\n\t\tif gateName != \"\" && v.FeatureGate != gateName {\n\t\t\tv.ShowInList = false\n\t\t}\n\t}\n}\n\n// featuresFilteredByFlags will determine which features will be listed based on the flags provided.\n// If none of flags were set, then all features will be selected to display.\nfunc featuresFilteredByFlags(infos map[string]*FeatureInfo, activated, deactivated bool) []FeatureInfo {\n\tvar filteredList []FeatureInfo\n\tfor _, v := range infos {\n\t\tif activated && v.Activated && v.ShowInList {\n\t\t\tfilteredList = append(filteredList, *v)\n\t\t}\n\n\t\tif deactivated && !v.Activated && v.ShowInList {\n\t\t\tfilteredList = append(filteredList, *v)\n\t\t}\n\n\t\t// No flags were provided, so only filter out features that shouldn't be listed.\n\t\tif !activated && !deactivated && v.ShowInList {\n\t\t\tfilteredList = append(filteredList, *v)\n\t\t}\n\t}\n\treturn filteredList\n}\n\n// listExtended renders the output with extended feature information\nfunc listExtended(cmd *cobra.Command, features []FeatureInfo) error {\n\tvar t component.OutputWriterSpinner\n\tt, err := component.NewOutputWriterWithSpinner(cmd.OutOrStdout(), outputFormat,\n\t\t\"Retrieving Features...\", true, \"NAME\", \"ACTIVATION STATE\", \"STABILITY\", \"DESCRIPTION\", \"IMMUTABLE\", \"FEATUREGATE\")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"could not get OutputWriterSpinner: %w\", err)\n\t}\n\n\tfor _, info := range features {\n\t\tt.AddRow(info.Name, info.Activated, info.Stability, info.Description, info.Immutable, info.FeatureGate)\n\t}\n\tt.RenderWithSpinner()\n\n\treturn nil\n}\n\n// listBasic renders the output with basic feature information\nfunc listBasic(cmd *cobra.Command, features []FeatureInfo) error {\n\tvar t component.OutputWriterSpinner\n\tt, err := component.NewOutputWriterWithSpinner(cmd.OutOrStdout(), outputFormat,\n\t\t\"Retrieving Features...\", true, \"NAME\", \"ACTIVATION STATE\", \"FEATUREGATE\")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"could not get OutputWriterSpinner: %w\", err)\n\t}\n\n\tfor _, info := range features {\n\t\tt.AddRow(info.Name, info.Activated, info.FeatureGate)\n\t}\n\tt.RenderWithSpinner()\n\n\treturn nil\n}\n"
  },
  {
    "path": "cmd/plugin/feature/list_test.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage main\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/spf13/cobra\"\n\t\"k8s.io/client-go/kubernetes/scheme\"\n\tcrclient \"sigs.k8s.io/controller-runtime/pkg/client/fake\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n\t\"github.com/vmware-tanzu/tanzu-framework/featuregates/client/pkg/featuregateclient\"\n\t\"github.com/vmware-tanzu/tanzu-framework/featuregates/client/pkg/featuregateclient/fake\"\n)\n\nfunc TestFeatureInfoList(t *testing.T) {\n\ttests := []struct {\n\t\tdescription string\n\t\tfeaturegate string\n\t\tfilterVars  map[string]bool\n\t\twant        []string\n\t}{\n\t\t{\n\t\t\tdescription: \"retrieve only discoverable, activated features, including experimental\",\n\t\t\tfeaturegate: \"\",\n\t\t\tfilterVars: map[string]bool{\n\t\t\t\t\"activated\":            true,\n\t\t\t\t\"deactivated\":          false,\n\t\t\t\t\"include-experimental\": true,\n\t\t\t},\n\t\t\twant: []string{\n\t\t\t\t\"cloud-event-listener\",\n\t\t\t\t\"super-toaster\",\n\t\t\t\t\"bazzies\",\n\t\t\t\t\"tuner\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdescription: \"retrieve only discoverable, activated features, including experimental that are gated by specified FeatureGate\",\n\t\t\tfeaturegate: \"tkg-system\",\n\t\t\tfilterVars: map[string]bool{\n\t\t\t\t\"activated\":            true,\n\t\t\t\t\"deactivated\":          false,\n\t\t\t\t\"include-experimental\": true,\n\t\t\t},\n\t\t\twant: []string{\n\t\t\t\t\"cloud-event-listener\",\n\t\t\t\t\"super-toaster\",\n\t\t\t\t\"bazzies\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdescription: \"retrieve only discoverable, activated features, excluding experimental\",\n\t\t\tfeaturegate: \"\",\n\t\t\tfilterVars: map[string]bool{\n\t\t\t\t\"activated\":            true,\n\t\t\t\t\"deactivated\":          false,\n\t\t\t\t\"include-experimental\": false,\n\t\t\t},\n\t\t\twant: []string{\n\t\t\t\t\"super-toaster\",\n\t\t\t\t\"bazzies\",\n\t\t\t\t\"tuner\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdescription: \"retrieve only discoverable, activated features, excluding experimental that are gated by specified FeatureGate\",\n\t\t\tfeaturegate: \"tkg-system\",\n\t\t\tfilterVars: map[string]bool{\n\t\t\t\t\"activated\":            true,\n\t\t\t\t\"deactivated\":          false,\n\t\t\t\t\"include-experimental\": false,\n\t\t\t},\n\t\t\twant: []string{\n\t\t\t\t\"super-toaster\",\n\t\t\t\t\"bazzies\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdescription: \"retrieve only discoverable, deactivated features, including experimental\",\n\t\t\tfeaturegate: \"\",\n\t\t\tfilterVars: map[string]bool{\n\t\t\t\t\"activated\":            false,\n\t\t\t\t\"deactivated\":          true,\n\t\t\t\t\"include-experimental\": true,\n\t\t\t},\n\t\t\twant: []string{\n\t\t\t\t\"cloud-event-speaker\",\n\t\t\t\t\"cloud-event-relayer\",\n\t\t\t\t\"hard-to-get\",\n\t\t\t\t\"bar\",\n\t\t\t\t\"barries\",\n\t\t\t\t\"baz\",\n\t\t\t\t\"biz\",\n\t\t\t\t\"tuna\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdescription: \"retrieve only discoverable, deactivated features, including experimental that are gated by specified FeatureGate\",\n\t\t\tfeaturegate: \"tkg-system\",\n\t\t\tfilterVars: map[string]bool{\n\t\t\t\t\"activated\":            false,\n\t\t\t\t\"deactivated\":          true,\n\t\t\t\t\"include-experimental\": true,\n\t\t\t},\n\t\t\twant: []string{\n\t\t\t\t\"cloud-event-speaker\",\n\t\t\t\t\"cloud-event-relayer\",\n\t\t\t\t\"hard-to-get\",\n\t\t\t\t\"bar\",\n\t\t\t\t\"barries\",\n\t\t\t\t\"baz\",\n\t\t\t\t\"biz\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdescription: \"retrieve only discoverable, deactivated features, excluding experimental\",\n\t\t\tfeaturegate: \"\",\n\t\t\tfilterVars: map[string]bool{\n\t\t\t\t\"activated\":            false,\n\t\t\t\t\"deactivated\":          true,\n\t\t\t\t\"include-experimental\": false,\n\t\t\t},\n\t\t\twant: []string{\n\t\t\t\t\"bar\",\n\t\t\t\t\"barries\",\n\t\t\t\t\"baz\",\n\t\t\t\t\"baz\",\n\t\t\t\t\"biz\",\n\t\t\t\t\"tuna\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdescription: \"retrieve only discoverable, deactivated features, excluding experimental that are gated by specified FeatureGate\",\n\t\t\tfeaturegate: \"tkg-system\",\n\t\t\tfilterVars: map[string]bool{\n\t\t\t\t\"activated\":            false,\n\t\t\t\t\"deactivated\":          true,\n\t\t\t\t\"include-experimental\": false,\n\t\t\t},\n\t\t\twant: []string{\n\t\t\t\t\"bar\",\n\t\t\t\t\"barries\",\n\t\t\t\t\"baz\",\n\t\t\t\t\"biz\",\n\t\t\t\t\"hard-to-get\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdescription: \"retrieve all discoverable features, excluding experimental\",\n\t\t\tfeaturegate: \"\",\n\t\t\tfilterVars: map[string]bool{\n\t\t\t\t\"activated\":            false,\n\t\t\t\t\"deactivated\":          false,\n\t\t\t\t\"include-experimental\": false,\n\t\t\t},\n\t\t\twant: []string{\n\t\t\t\t\"bar\",\n\t\t\t\t\"barries\",\n\t\t\t\t\"baz\",\n\t\t\t\t\"bazzies\",\n\t\t\t\t\"biz\",\n\t\t\t\t\"hard-to-get\",\n\t\t\t\t\"super-toaster\",\n\t\t\t\t\"tuna\",\n\t\t\t\t\"tuner\",\n\t\t\t},\n\t\t},\n\n\t\t{\n\t\t\tdescription: \"retrieve all discoverable features, excluding experimental that are gated by specified FeatureGate\",\n\t\t\tfeaturegate: \"tkg-system\",\n\t\t\tfilterVars: map[string]bool{\n\t\t\t\t\"activated\":            false,\n\t\t\t\t\"deactivated\":          false,\n\t\t\t\t\"include-experimental\": false,\n\t\t\t},\n\t\t\twant: []string{\n\t\t\t\t\"bar\",\n\t\t\t\t\"barries\",\n\t\t\t\t\"baz\",\n\t\t\t\t\"bazzies\",\n\t\t\t\t\"biz\",\n\t\t\t\t\"hard-to-get\",\n\t\t\t\t\"super-toaster\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdescription: \"retrieve all discoverable features, including experimental\",\n\t\t\tfeaturegate: \"\",\n\t\t\tfilterVars: map[string]bool{\n\t\t\t\t\"activated\":            false,\n\t\t\t\t\"deactivated\":          false,\n\t\t\t\t\"include-experimental\": true,\n\t\t\t},\n\t\t\twant: []string{\n\t\t\t\t\"cloud-event-listener\",\n\t\t\t\t\"cloud-event-speaker\",\n\t\t\t\t\"cloud-event-relayer\",\n\t\t\t\t\"bar\",\n\t\t\t\t\"barries\",\n\t\t\t\t\"biz\",\n\t\t\t\t\"hard-to-get\",\n\t\t\t\t\"super-toaster\",\n\t\t\t\t\"baz\",\n\t\t\t\t\"bazzies\",\n\t\t\t\t\"tuna\",\n\t\t\t\t\"tuner\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdescription: \"retrieve all discoverable features, including experimental that are gated by specified FeatureGate\",\n\t\t\tfeaturegate: \"tkg-system\",\n\t\t\tfilterVars: map[string]bool{\n\t\t\t\t\"activated\":            false,\n\t\t\t\t\"deactivated\":          false,\n\t\t\t\t\"include-experimental\": true,\n\t\t\t},\n\t\t\twant: []string{\n\t\t\t\t\"cloud-event-listener\",\n\t\t\t\t\"cloud-event-speaker\",\n\t\t\t\t\"cloud-event-relayer\",\n\t\t\t\t\"bar\",\n\t\t\t\t\"barries\",\n\t\t\t\t\"biz\",\n\t\t\t\t\"hard-to-get\",\n\t\t\t\t\"super-toaster\",\n\t\t\t\t\"baz\",\n\t\t\t\t\"bazzies\",\n\t\t\t},\n\t\t},\n\t}\n\n\tobjs, _, _ := fake.GetTestObjects()\n\ts := scheme.Scheme\n\tif err := corev1alpha2.AddToScheme(s); err != nil {\n\t\tt.Fatalf(\"add config scheme: (%v)\", err)\n\t}\n\n\tcl := crclient.NewClientBuilder().WithRuntimeObjects(objs...).Build()\n\tfgClient, err := featuregateclient.NewFeatureGateClient(featuregateclient.WithClient(cl))\n\tif err != nil {\n\t\tt.Fatalf(\"get FeatureGate client: (%v)\", err)\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\t// Set global variables used by Cobra.\n\t\t\tfeaturegate = tc.featuregate\n\t\t\tactivated = tc.filterVars[\"activated\"]\n\t\t\tdeactivated = tc.filterVars[\"deactivated\"]\n\t\t\tincludeExperimental = tc.filterVars[\"include-experimental\"]\n\n\t\t\tgot, err := featureInfoList(context.Background(), fgClient, featuregate)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"procure featureInfoList: %v\", err)\n\t\t\t}\n\n\t\t\tif len(got) != len(tc.want) {\n\t\t\t\tt.Errorf(\"got: %v Features, but want %v\", got, tc.want)\n\t\t\t}\n\n\t\t\tfor _, want := range tc.want {\n\t\t\t\tif !featureInfoSliceContains(got, want) {\n\t\t\t\t\tt.Errorf(\"got: %+v, but list is missing Feature %s\", got, want)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestListExtended(t *testing.T) {\n\ttests := []struct {\n\t\tdescription string\n\t\tcmd         *cobra.Command\n\t\tfeats       []FeatureInfo\n\t\twantErr     error\n\t}{\n\t\t{\n\t\t\tdescription: \"extended list should not error\",\n\t\t\tcmd:         FeatureListCmd,\n\t\t\tfeats: []FeatureInfo{\n\t\t\t\t{\n\t\t\t\t\tName:         \"cloud-event-relayer\",\n\t\t\t\t\tDescription:  \"Open a port to relay cloud events. Highly experimental!\",\n\t\t\t\t\tStability:    corev1alpha2.Experimental,\n\t\t\t\t\tImmutable:    false,\n\t\t\t\t\tDiscoverable: true,\n\t\t\t\t\tFeatureGate:  \"tkg-system\",\n\t\t\t\t\tActivated:    false,\n\t\t\t\t\tShowInList:   true,\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr: nil,\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tgot := listExtended(tc.cmd, tc.feats)\n\t\tif got != tc.wantErr {\n\t\t\tt.Fatalf(\"got unwanted extended list error: %v\", got)\n\t\t}\n\t}\n}\n\nfunc TestListBasic(t *testing.T) {\n\ttests := []struct {\n\t\tdescription string\n\t\tcmd         *cobra.Command\n\t\tfeats       []FeatureInfo\n\t\twantErr     error\n\t}{\n\t\t{\n\t\t\tdescription: \"basic list should not error\",\n\t\t\tcmd:         FeatureListCmd,\n\t\t\tfeats: []FeatureInfo{\n\t\t\t\t{\n\t\t\t\t\tName:         \"cloud-event-relayer\",\n\t\t\t\t\tDescription:  \"Open a port to relay cloud events. Highly experimental!\",\n\t\t\t\t\tStability:    corev1alpha2.Experimental,\n\t\t\t\t\tImmutable:    false,\n\t\t\t\t\tDiscoverable: true,\n\t\t\t\t\tFeatureGate:  \"tkg-system\",\n\t\t\t\t\tActivated:    false,\n\t\t\t\t\tShowInList:   true,\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr: nil,\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tgot := listBasic(tc.cmd, tc.feats)\n\t\tif got != tc.wantErr {\n\t\t\tt.Fatalf(\"got unwanted basic list error: %v\", got)\n\t\t}\n\t}\n}\n\nfunc TestExecuteFeatureListCommand(t *testing.T) {\n\ttest := struct {\n\t\tdescription string\n\t\tcmd         *cobra.Command\n\t\terrMsg      string\n\t}{\n\t\tdescription: \"FeatureGateClient cannot connect due to bad configuration\",\n\t\tcmd:         FeatureListCmd,\n\t\terrMsg:      \"could not get FeatureGateClient\",\n\t}\n\n\tstoredKubeConfig, lastEnvVarOK := os.LookupEnv(\"KUBECONFIG\")\n\tif err := os.Setenv(\"KUBECONFIG\", \"test/k8s_config.kube\"); err != nil {\n\t\tt.Fatalf(\"failed to set test kubeconfig: %v\", err)\n\t}\n\n\terr := test.cmd.Execute()\n\n\tif len(test.errMsg) > 0 {\n\t\tif err == nil {\n\t\t\tt.Fatal(\"expected error, but did not get one\")\n\t\t}\n\n\t\tif !strings.Contains(err.Error(), test.errMsg) {\n\t\t\tt.Errorf(\"got: %s, want error to contain: %s\", err, test.errMsg)\n\t\t}\n\t}\n\n\t// Restore previous kubeconfig if it was set.\n\tif err := restoreEnvVar(\"KUBECONFIG\", storedKubeConfig, lastEnvVarOK); err != nil {\n\t\tt.Errorf(\"unable to restore previous KUBECONFIG envvar: %v\", err)\n\t}\n}\n\nfunc featureInfoSliceContains(features []FeatureInfo, name string) bool {\n\tfor _, feat := range features {\n\t\tif feat.Name == name {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (feature FeatureInfo) String() string {\n\treturn feature.Name\n}\n"
  },
  {
    "path": "cmd/plugin/feature/main.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage main\n\nimport (\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/aunum/log\"\n\n\tplugintypes \"github.com/vmware-tanzu/tanzu-plugin-runtime/config/types\"\n\t\"github.com/vmware-tanzu/tanzu-plugin-runtime/plugin\"\n\t\"github.com/vmware-tanzu/tanzu-plugin-runtime/plugin/buildinfo\"\n)\n\nvar descriptor = plugin.PluginDescriptor{\n\tName:        \"feature\",\n\tDescription: \"Operate on features and featuregates\",\n\tTarget:      plugintypes.TargetK8s,\n\tVersion:     buildinfo.Version,\n\tGroup:       plugin.RunCmdGroup,\n\tBuildSHA:    buildinfo.SHA,\n}\n\nconst contextTimeout = 300 * time.Second\n\nfunc main() {\n\tp, err := plugin.NewPlugin(&descriptor)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\tp.AddCommands(\n\t\tFeatureListCmd,\n\t\tFeatureActivateCmd,\n\t\tFeatureDeactivateCmd,\n\t)\n\n\tif err := p.Execute(); err != nil {\n\t\tos.Exit(1)\n\t}\n}\n"
  },
  {
    "path": "cmd/plugin/feature/test/main.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage main\n\nimport (\n\t\"log\"\n\t\"os\"\n\n\t\"github.com/spf13/cobra\"\n\n\t\"github.com/vmware-tanzu/tanzu-plugin-runtime/plugin\"\n\tclitest \"github.com/vmware-tanzu/tanzu-plugin-runtime/test/framework\"\n)\n\nvar descriptor = clitest.NewTestFor(\"feature\")\n\nfunc main() {\n\tp, err := plugin.NewPlugin(descriptor)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tp.Cmd.RunE = test\n\tif err := p.Execute(); err != nil {\n\t\tos.Exit(1)\n\t}\n}\n\nfunc test(_ *cobra.Command, _ []string) error {\n\treturn nil\n}\n"
  },
  {
    "path": "cmd/plugin/feature/testdata/k8s_config.kube",
    "content": "apiVersion: v1\nclusters:\n- cluster:\n    server: https://127.0.0.1:51628\n"
  },
  {
    "path": "common.mk",
    "content": "# Copyright 2021 VMware, Inc. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\nGOOS ?= $(shell go env GOOS)\nGOARCH ?= $(shell go env GOARCH)\nGOHOSTOS ?= $(shell go env GOHOSTOS)\nGOHOSTARCH ?= $(shell go env GOHOSTARCH)\n\nROOT_DIR := $(shell git rev-parse --show-toplevel)\nRELATIVE_ROOT ?= .\nCONTROLLER_GEN_SRC ?= \"./...\"\n\n# Framework has lots of components, and many build steps that are disparate.\n# Use docker buildkit so that we get faster image builds and skip redundant work.\n# TODO: We need to measure what this speeds up, and what it doesn't (and why).\nexport DOCKER_BUILDKIT := 1\n\n# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set)\nifeq (,$(shell go env GOBIN))\nGOBIN=$(shell go env GOPATH)/bin\nelse\nGOBIN=$(shell go env GOBIN)\nendif\n\nGO := go\n\nNUL = /dev/null\nifeq ($(GOHOSTOS),windows)\n\tNUL = NUL\nendif\n\nBUILD_SHA ?= $$(git describe --match=$(git rev-parse --short HEAD) --always --dirty)\nBUILD_DATE ?= $$(date -u +\"%Y-%m-%d\")\nBUILD_VERSION ?= $(shell git describe --tags --abbrev=0 2>$(NUL))\n\nifeq ($(strip $(BUILD_VERSION)),)\nBUILD_VERSION = dev\nendif\n\nifdef DEBUG\nLD_FLAGS = -s\nGC_FLAGS = all=-N -l\nelse\nLD_FLAGS = -s -w\nGC_FLAGS =\nendif\n\n# Set buildinfo for modules\nLD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/util/buildinfo.Date=$(BUILD_DATE)'\nLD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/util/buildinfo.SHA=$(BUILD_SHA)'\nLD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/util/buildinfo.Version=$(BUILD_VERSION)'\n\n# Add supported OS-ARCHITECTURE combinations here\nENVS ?= linux-amd64 windows-amd64 darwin-amd64\n\n# Hosts running SELinux need :z added to volume mounts\nSELINUX_ENABLED := $(shell cat /sys/fs/selinux/enforce 2> /dev/null || echo 0)\n\nifeq ($(SELINUX_ENABLED),1)\n  DOCKER_VOL_OPTS?=:z\nendif\n\n# Support DISTROLESS_BASE_IMAGE,GOPROXY,GOPROXY change while building image\nGOPROXY ?= \"https://proxy.golang.org,direct\"\nGOPROXY ?= \"sum.golang.org\"\nDISTROLESS_BASE_IMAGE ?= gcr.io/distroless/static:nonroot\n\n# Directories\nTOOLS_DIR := $(abspath $(ROOT_DIR)/hack/tools)\nTOOLS_BIN_DIR := $(TOOLS_DIR)/bin\n\n\n# Add tooling binaries here and in hack/tools/Makefile\nCONTROLLER_GEN     := $(TOOLS_BIN_DIR)/controller-gen\nGOLANGCI_LINT      := $(TOOLS_BIN_DIR)/golangci-lint\nGOIMPORTS          := $(TOOLS_BIN_DIR)/goimports\nGOBINDATA          := $(TOOLS_BIN_DIR)/gobindata\nKUBEBUILDER        := $(TOOLS_BIN_DIR)/kubebuilder\nKUSTOMIZE          := $(TOOLS_BIN_DIR)/kustomize\nYTT                := $(TOOLS_BIN_DIR)/ytt\nKBLD               := $(TOOLS_BIN_DIR)/kbld\nVENDIR             := $(TOOLS_BIN_DIR)/vendir\nIMGPKG             := $(TOOLS_BIN_DIR)/imgpkg\nKAPP               := $(TOOLS_BIN_DIR)/kapp\nGINKGO             := $(TOOLS_BIN_DIR)/ginkgo\nVALE               := $(TOOLS_BIN_DIR)/vale\nYQ                 := $(TOOLS_BIN_DIR)/yq\nCONVERSION_GEN     := $(TOOLS_BIN_DIR)/conversion-gen\nCOUNTERFEITER      := $(TOOLS_BIN_DIR)/counterfeiter\nTOOLING_BINARIES   := $(CONTROLLER_GEN) $(GOLANGCI_LINT) $(YTT) $(KBLD) $(VENDIR) $(IMGPKG) $(KAPP) $(KUSTOMIZE) $(GOIMPORTS) $(GOBINDATA) $(GINKGO) $(VALE) $(YQ) $(CONVERSION_GEN) $(COUNTERFEITER)\n\n## --------------------------------------\n##@ Tooling Binaries\n## --------------------------------------\n\n.PHONY: tools\ntools: $(TOOLING_BINARIES) ## Build tooling binaries\n.PHONY: $(TOOLING_BINARIES)\n$(TOOLING_BINARIES):\n\tmake -C $(TOOLS_DIR) $(@F)\n\n## --------------------------------------\n##@ API/controller building and generation\n## --------------------------------------\n\n.PHONY: generate-controller-code\ngenerate-controller-code: $(CONTROLLER_GEN) $(GOIMPORTS) ## Generate code via controller-gen\n\t$(CONTROLLER_GEN) $(GENERATOR) object:headerFile=\"$(ROOT_DIR)/hack/boilerplate.go.txt\",year=$(shell date +%Y) paths=\"$(CONTROLLER_GEN_SRC)\" $(OPTIONS)\n\n.PHONY: generate-manifests\ngenerate-manifests:\n\t$(MAKE) generate-controller-code GENERATOR=crd OPTIONS=\"output:crd:artifacts:config=$(RELATIVE_ROOT)/config/crd/bases\" CONTROLLER_GEN_SRC=$(CONTROLLER_GEN_SRC)\n"
  },
  {
    "path": "docs/README.md",
    "content": "# Documentation\n\nThis directory contains documentation for this repo. Refer to the [documentation style guide](style-guide.md) when\nwriting or editing documents.\n\n## Table of Contents\n\n* [API Machinery](runtime-core/README.md)\n* [Dev](dev/README.md)\n* [Documentation Style Guide](style-guide.md)\n* [Release](release/README.md)\n"
  },
  {
    "path": "docs/community/README.md",
    "content": "# Community\n\nDocumentation for the Framework community related processes.\n\n## Table of Contents\n\n* [Contribution Ladder](contribution-ladder.md)\n* [Support Process](community-support/support-process.md)\n* [Severity Definitions](severity-definitions.md)\n"
  },
  {
    "path": "docs/community/contribution-ladder.md",
    "content": "# Contribution Ladder\n\nThis document outlines the various responsibilities of contributor roles for Tanzu Framework\nand how to move from interested user to a reviewer.\n\n## Interested\n\nInterested user is anyone who is interested in the project and wants to try out. If you have\nreached this far by reading this, you are already a community member :)\n\nHere are some ideas for how you can be more involved and participate in the\ncommunity:\n\n* Comment on an issue that you are interested in.\n* Submit a pull request to fix an issue.\n* Review pull requests.\n* Report a bug.\n* Participate in the discussion in GitHub issues etc.\n\n## Contributor\n\nContributors are the people who actively contribute to Framework.\n\n### How to become a contributor\n\nTo become a contributor, one must have read the [contributor guide](../CONTRIBUTING.md)\nand have made multiple contributions to the project such as authoring or\nreviewing PRs, opening issues with bugs, questions, etc, or commenting on\nissues with your experiences and opinions. Contributors and maintainers will\ndo their best to watch for community participants who may make good\ncontributors to promote them.\n\n### Responsibilities\n\n* Actively contribute to Frameworks codebase.\n* Add or update documentation when needed.\n* Have issues and PRs assigned to them.\n* Responsive to the issues and PRs assigned to them.\n* Apply labels, milestones to the issues and PRs.\n* Participate in the proposal discussions.\n* Perform code reviews.\n\n## Reviewer\n\nReviewers are able to review code for quality and correctness on some area of Framework.\nThey are knowledgeable about both the codebase and software engineering principles.\n\n### How to become a reviewer\n\nAfter you have contributed to an area of Framework consistently, you are\nlikely ready to help review pull requests either in just that area, or for the\nentire repository. You should be knowledgeable about the area in which you are\nwilling to be a reviewer. To become a reviewer you need to be nominated by a\nmaintainer.\n\n### Responsibilities\n\n* Expected to be responsive to review requests.\n* Responsible for project quality control via code reviews\n  * Focus on code quality and correctness, including testing and refactoring\n* Responsible for reviewing assigned PRs related to their component of their\n  expertise.\n"
  },
  {
    "path": "docs/community/severity-definitions.md",
    "content": "# Severity Definitions\n\nThis document provides definitions for various severity levels of the support\nprogram.\n\n## Severity 1\n\nCritical issue that severely impacts the use of the software, and the situation\nhalts your operations.\n\n1. No procedural workaround exists.\n1. Data corrupted or lost.\n1. A critical documented feature/function is not available.\n\n## Severity 2\n\nMajor functionality is impacted, or significant performance degradation is\nexperienced. The situation is causing a high impact to portions of your\noperations and no reasonable workaround exists.\n\n1. Service is operational but highly degraded performance to the point of major\n   impact on usage.\n1. Important features of the software are unavailable with no acceptable\n   workaround; however, operations can continue in a restricted fashion.\n\n## Severity 3\n\nThere is a partial, non-critical loss of use of the software with a\nmedium-to-low impact, but your operations continues to function. A\nshort-term workaround is available, but not scalable.\n\n## Severity 4\n\nInquiry regarding routine technical issues\n\n1. Information is requested on application capabilities, navigation,\n   installation, or configuration.\n1. Bug is affecting a small number of users. Acceptable workaround is available\n"
  },
  {
    "path": "docs/community/support-process.md",
    "content": "# Framework Support Process\n\n## Definitions\n\n* **Framework member** - is a person who is an active contributor and with\n  write access to the `tanzu-framework` repo.\n* **Critical urgent issue** - is an issue that severely impacts the use of the\n  software and has no workarounds. This kind of issue should be labeled with\n  [severity-1](severity-definitions.md#severity-1) label.\n\n## Weekly rotation\n\nThe Framework members use a weekly rotation to manage community support.\nEach week, a different member is the point person for triaging the new issues\nand guiding severity-1 issues to the best state to be tackled.\n\nThe point person is not expected to solve every critical(severity-1) issue or\nbe on-call 24x7. Instead, they will communicate expectations for the critical\nurgent issues to the community and ensure the issues are in the best position\nto be addressed.\n\nThe point person is not expected to be involved with normal non-critical\npriority(other than severity-1) issues.\n\n## Start of Week\n\nSupport schedule will be provided to ensure everyone knows when their support\nweek is occurring.\n\nThe schedule will consist of members who provide a week of their expertise to\nensure new issues receive the labeling they need.\n\nThey also work closely with the community to ensure the issue is properly\ndetailed and have steps for reproducing the issue, if appropriate.\n\nPoint people are responsible for ensuring they are active and managing the\nissue backlog during their scheduled week.\n\n## During the Week\n\nThe point person will monitor:\n\n* New issues labeled with [`needs-triage`](https://github.com/vmware-tanzu/tanzu-framework/labels/needs-triage).\n* Currently, open issues labeled as [`investigating` and `triage/needs-info`](https://github.com/vmware-tanzu/tanzu-framework/issues?q=label%3Atriage%2Fneeds-info%2Cinvestigating+is%3Aopen).\n* Open issues labeled as [`severity-1`](https://github.com/vmware-tanzu/tanzu-framework/labels/severity-1).\n\nThese issues can also be viewed [with a single aggregating query](https://github.com/vmware-tanzu/tanzu-framework/issues?q=label%3Atriage%2Fneeds-info%2Cinvestigating%2Cseverity-1%2Cneeds-triage+is%3Aopen).\n\n### GitHub issue flow\n\nGenerally speaking, new GitHub issues will fall into one of several categories.\nThe point person will use the following process for each issue:\n\n* Feature request\n  * Label the issue with `kind/feature`.\n  * Determine the area of the Framework the issue belongs to and add appropriate\n    [area](https://github.com/vmware-tanzu/tanzu-framework/labels?q=area) label.\n  * Remove `needs-triage` label.\n* Bug\n  * Label the issue with `kind/bug`.\n  * Determine the area of the Framework the issue belongs to and add appropriate\n    [area](https://github.com/vmware-tanzu/tanzu-framework/labels?q=area) label.\n  * If the issue is critical urgent, it should be labeled as `severity-1`.\n  * Remove `needs-triage` label.\n* User question/problem that does not fall into one of the previous categories\n  * Assign the issue to yourself.\n  * When you start investigating/responding, label the issue with `investigating`.\n  * Add context for both the user and future support people.\n  * Use the `triage/needs-info` label to indicate an issue is waiting for\n  information from the user. If you do not get a response in 20 days then close\n  the issue with an appropriate comment.\n  * If you resolve the issue, add the resolution as a comment on the issue and\n  close it.\n  * If the issue ends up being a feature request or a bug, update the labels\n  and follow the appropriate process for it.\n\n## End of Week\n\nThe point person will ensure all GitHub issues worked on during the week are\nlabeled with `investigating` and `triage/needs-info` (if appropriate), and have\nupdated comments, so the next person can pick them up.\n"
  },
  {
    "path": "docs/dev/README.md",
    "content": "# Development Docs\n\nDocumentation centered on Tanzu Framework and its development process.\n\n## Table of Contents\n\n* [Local Development With Framework](build.md)\n* [Troubleshooting](troubleshooting.md)\n* [Design Proposal Template](_proposal.md)\n"
  },
  {
    "path": "docs/dev/_proposal.md",
    "content": "# Design proposal template `<replace with your proposal's title>`\n\n_Note_: The name of the file should follow the name pattern `<short meaningful words joined by '-'>_design.md`, e.g:\n`listener-design.md`.\n\n## Abstract\n\nOne to two sentences that describes the goal of this proposal and the problem being solved by the proposed change.\nThe reader should be able to tell by the title, and the opening paragraph, if this document is relevant to them.\n\n## Background\n\nOne to two paragraphs of exposition to set the context for this proposal.\n\n## Goals\n\n* A short list of things which will be accomplished by implementing this proposal.\n* Two things is ok.\n* Three is pushing it.\n* More than three goals suggests that the proposal's scope is too large.\n\n## Non Goals\n\n* A short list of items which are:\n* a. out of scope\n* b. follow on items which are deliberately excluded from this proposal.\n\n## High-Level Design\n\nOne to two paragraphs that describe the high level changes that will be made to implement this proposal.\n\n## Detailed Design\n\nA detailed design describing how the changes to the product should be made.\n\nThe names of types, fields, interfaces, and methods should be agreed on here, not debated in code review.\nThe same applies to changes in CRDs, YAML examples, and so on.\n\nIdeally the changes should be made in sequence so that the work required to implement this design can be done incrementally, possibly in parallel.\n\n## Alternatives Considered\n\nIf there are alternative high level or detailed designs that were not pursued they should be called out here with a brief explanation of why they were not pursued.\n\n## Security Considerations\n\nIf this proposal has an impact to the security of the product, its users, or data stored or transmitted via the product, they must be addressed here.\n\n## Compatibility\n\nA discussion of any compatibility issues that need to be considered\n\n## Implementation\n\nA description of the implementation, timelines, and any resources that have agreed to contribute.\n\n## Open Issues\n\nA discussion of issues relating to this proposal for which the author does not know the solution. This section may be omitted if there are none.\n"
  },
  {
    "path": "docs/dev/build.md",
    "content": "# Developing With Tanzu Framework\n\nFramework is meant to be extended, and these docs will help outline the available dev-centric features.\n\n## Local Builds\n\nThere are Make targets provided to help establish a good workflow for local development.\nWith these workflows you can iterate on changes to APIs, Framework CLI or CLI Plugins.\n\nNote: Go v1.17 or greater is required to build Framework components.\n\n### Building APIs\n\nTo build the APIs in Framework, the following commands exist:\n\n`make generate`: Generates API and boilerplate code via controller-gen.\n\n`make manifests`: Runs controller-gen to output manifests to `config/crd/bases`.\n\n`make install`: To install CRDs into the cluster.\n\nAPI controllers that exist in the Framework repo\n\n* [FeatureGates](https://github.com/vmware-tanzu/tanzu-framework/tree/main/featuregates)\n* [Capabilities](https://github.com/vmware-tanzu/tanzu-framework/tree/main/capabilities)\n\nEach controller directory has its own Dockerfile, Makefile and manifests needed to build the image and\ndeploy the controller to the cluster.\n\n### Capabilities\n\nFramework provides Capability discovery\n[Go package](https://github.com/vmware-tanzu/tanzu-framework/tree/main/capabilities/client/pkg/discovery)\nand Capability API to query a cluster's capabilities. It can be used to understand the API surface area and query for\nobjects in the cluster.\n\nFor more detailed information on Capability functionality offered by Framework check out this\n[doc](../runtime-core/capability-discovery.md)\n\n### Features and FeatureGates\n\nFramework offers Features and FeatureGates APIs to allow developers to deliver new functionality to users rapidly but\nsafely. With these powerful APIs the teams can modify the system behavior without changing the code for more controlled\nexperimentation over the lifecyle of features, these can be incredibly useful for agile management style environments.\n\nFor more detailed information on these APIs check out this [doc](../runtime-core/features-and-featuregates.md)\n"
  },
  {
    "path": "docs/dev/troubleshooting.md",
    "content": "# Troubleshooting\n\n## Open an Issue\n\nIf you stumble into a situation where a clean build of the main branch will not build cleanly, please open an\nissue for Framework so the team can help.\n"
  },
  {
    "path": "docs/framework-use-cases.md",
    "content": "# Use cases\n\nThis document provides some use cases for Framework to understand the project's\ncontext.\n\n## Use Case #1 - Features and FeatureGates\n\n### Context\n\nAllow developers to deliver new functionality to users rapidly but safely.\nIf there is no way to do that, it would be difficult for individual teams to\ndevelop features in parallel without coordinating with the larger team or\nresorting to an expensive branching model. This reduces the velocity, inhibits\nexperimentation, and also makes the development difficult.\n\n### Solution\n\nFramework provides powerful Features and FeatureGates APIs that allows the\nteams to have a system to control rollout and availability of new Features in\ncontroller and plugin logic. With these APIs, it would be easy to modify the\nbehavior of the plugin or controller without changing the code for more\ncontrolled experimentation, these can be incredibly useful for agile management\nstyle environments.\n\nCheck out this [document](runtime-core/features-and-featuregates.md) to\nlearn more about the Features and FeatureGates APIs and how to use them.\n\n## Use Case #2 - Capabilities\n\n### Context\n\nDetermining how to interact with clusters running versioned pieces of software\non various infrastructure providers is complex. The lack of a standard means to\ndiscover details about cluster resource composition and API surface area could\nresult in manual poking and prodding by teams and this approach could\neventually manifest as undesirable patterns.\n\n### Solution\n\nFramework provides Capability discovery [Go package](https://github.com/vmware-tanzu/tanzu-framework/tree/main/capabilities/client/pkg/discovery)\nand [Capability API](https://github.com/vmware-tanzu/tanzu-framework/blob/main/apis/run/v1alpha1/capability_types.go)\nto query a cluster's capabilities. It can be used to understand the API surface\narea and query for objects in the cluster.\n\nFor more detailed information on Capability functionality offered by Framework\ncheck out this [document](runtime-core/capability-discovery.md).\n"
  },
  {
    "path": "docs/glossary.md",
    "content": "# Tanzu Framework Glossary\n\n**Condition:** A Kubernetes concept that communicates the status of a resource during its lifecycle. Conditions can include timestamps for these state changes and so provide a timeline of what happened to a resource. A condition may include a ‘reason’ string which can provide detail especially useful when troubleshooting.\n\n**Discovery API:** How an API consumer discovers the APIs and API versions/revisions supported by a specific instance of the local control plane.\n\n**FeatureGate:** The mechanism that provides a means to control the activation state for a set of Features. FeatureGates are a resource that is managed by Platform Operators.\n\n**Feature Activation:** The reconciled state of all Features. If a FeatureGate exists that references a specific Feature, it is reconciled by the FeatureGate to display the correct Activations and Deactivations. If a FeatureGate doesn't exist, Features will always default to their defined activation.\n\n**Finalizer:** A code function in a K8s controller resource used to help cleanup. Best practice is to provide a timestamp for deletion of objects to avoid further reconciliation overhead the controller needs to do for that object.\n\n**Package** (also known as Addon or Extension): A unit of extensibility for a Kubernetes cluster that leverages the [Carvel](https://carvel.dev/) tools.  A single package is a combination of configuration metadata and OCI images that ultimately inform the package manager what software it holds and how to install it into a Kubernetes cluster.\n\n**Predicate:** A defined condition, such a change in version, used to help filter events that controllers watch when trying to reconcile.\n"
  },
  {
    "path": "docs/packages/README.md",
    "content": "# Packages\n\nDocumentation related to packages and package tooling in Framework repo.\n\n## Table of Contents\n\n* [Definitions](definitions.md)\n* [Add new package to a package repository](add-new-package-to-package-repo.md)\n* [Add PackageInstall to a Meta Package](add-packageinstall-to-meta-package.md)\n* [Development workflow](dev-workflow.md)\n"
  },
  {
    "path": "docs/packages/add-new-package-to-package-repo.md",
    "content": "# Add a package to management package repository\n\nThis document provides guidance on how to add a package to a package repository and test it.\nCheck this [doc](./definitions.md) before going further, to understand some packaging terminology and to understand the\nrequirements of a package being in a particular package repository.\n\n## Steps to add a package to a package repository\n\nLet's take the example of adding a package to `management` package repository.\nBelow are steps to illustrate how that can be done.\n\n1. Scaffold a new package and update the package files\n\n   ```shell\n      PACKAGE_NAME=my-package make create-package\n   ```\n\n   This would scaffold the package under the `packages` directory, and the tree structure of the generated package\n   would look something like below:\n\n   ```plain\n    packages/my-package\n    ├── Makefile\n    ├── README.md\n    ├── bundle\n    │   ├── config\n    │   │   ├── overlay\n    │   │   ├── upstream # This is the directory to add the package contents using ytt templates.\n    │   │   └── values.yaml # Package contents can be configured by providing data values in this file.\n    ├── vendir.yml # To fetch config files from a different data source.\n    ├── metadata.yaml # To provide high level information description about your package.\n    └── package.yaml # Update the Package CR spec to add/modify fields such as releaseNotes etc.\n   ```\n\n   After scaffolding the package, the files in your package directory should be updated with the package config.\n   Significance of each file is provided in the above tree structure.\n\n   The generated Makefile contains `configure-package` and `reset-package` target to configure the package dynamically,\n   which is completely optional.\n\n2. Fetch config files from datasource [optional]\n\n   If you have updated the vendir.yaml to fetch the config from a different source, run\n\n   ```shell\n      make package-vendir-sync\n   ```\n\n3. Update kbld-config.yaml [optional]\n\n   If the container image in your config needs to be replaced by an image at build time, add an entry like below in the\n   kbld-config.yaml file in `packages` directory.\n\n   ```yaml\n       - image: my-package-manager:latest\n         newImage: \"\"\n   ```\n\n4. Update COMPONENTS variable in Makefile [optional]\n\n   If the component needs to have a docker image built is in this repo, append the `COMPONENTS` variable with directory\n   path that contains a Makefile with `docker-build`, `docker-publish` and `kbld-image-replace` targets that can build\n   and push a docker image for that component. ([example Makefile](../../featuregates/Makefile))\n\n5. Update package-values.yaml to add your package details\n\n   `package-values.yaml` contains Ytt data values for all packages and package repositories.\n\n   Add an entry like below to package-values.yaml under `repositories.<packageRepository>.packages`.\n\n   ```yaml\n         #! package name\n       - name: my-package\n         #! Relative path to package bundle\n         path: packages/my-package\n         domain: tanzu.vmware.com\n         version: latest\n         #! this should be name:version(my-package:latest), will be replaced at build time\n         sha256: \"my-package:latest\"\n   ```\n\n6. Test the package and bundle generation\n\n   Follow this [document](dev-workflow.md) to test the package and repo bundle generation and how to test those artifacts.\n\nExample:\n\n* [Commit](https://github.com/vmware-tanzu/tanzu-framework/pull/975/commits/6bd7d7645f51f90bdcf895dd0560c0ade71527cc)\n  adds a new package to management package repository.\n"
  },
  {
    "path": "docs/packages/add-packageinstall-to-meta-package.md",
    "content": "# Add PackageInstall CR to a Meta Package\n\nThis document provides guidance on how to add a PackageInstall CR to a meta package.\nCheck this [doc](./definitions.md#meta-package) to understand some packaging terminology such as\nmeta package in the context of this project.\n\n`tkg`, `framework` are some examples of meta package in this repository.\n\n## Steps to add PackageInstall CR to a Meta Package\n\nLet's take the example of adding `featuregates` PackageInstall to `framework`.\n\n1. Add PackageInstall CR to the meta package config\n\n   To install an actual package and its underlying resources on a Kubernetes cluster, a PackageInstall CR must be\n   created on the Kubernetes cluster. So, for the package to be installed when the meta package is installed,\n   we need to add PackageInstall CR in the meta package config.\n\n   More details on PackageInstall CR can be found [here](https://carvel.dev/kapp-controller/docs/v0.34.0/packaging/#package-install)\n\n2. Add ServiceAccount needed to install the package through meta package\n\n   Every PackageInstall CR must provide ServiceAccount name in the serviceAccountName field for kapp-controller to\n   install the underlying package resources in the Kubernetes cluster. This ServiceAccount provided should have access\n   to needed privileges for management of underlying package resources.\n\n   More info about the kapp-controller security model can be found [here](https://carvel.dev/kapp-controller/docs/v0.34.0/security-model/)\n\n   Ex: Directory structure after adding featuregates PackageInstall CR, ServiceAccount and RBAC rules to\n   framework package\n\n   ```plain\n   packages/framework\n   ├── Makefile\n   ├── README.md\n   ├── bundle\n   │ └── config\n   │     ├── pacakgeinstalls\n   │     │ ├── featuregates-pi.yaml\n   │     │ └── featuregates-service-account.yaml\n   │     └── values.yaml\n   ├── metadata.yaml\n   └── package.yaml\n   ```\n\n3. Repeat steps 1 and 2 if the meta package is part of another meta package\n\nExample: This [PR](https://github.com/vmware-tanzu/tanzu-framework/pull/1848) that adds featuregates PackageInstall to\nthe `framework` meta package and also adds `framework` PackageInstall to `tkg`\nmeta package.\n"
  },
  {
    "path": "docs/packages/definitions.md",
    "content": "# Definitions\n\nThis document provides definitions of some package terminology used in the Tanzu framework.\nTo learn about the Carvel package concepts visit this [page](https://carvel.dev/kapp-controller/docs/latest/packaging)\n\n## Management package\n\nAny package that performs the role of managing and operating a workload cluster is a Management package.\nManagement packages are purpose-built to be installed on the management cluster.\n\nExample: Featuregates, addons-manager, etc.\n\n## Management package repository\n\nA management package repository is a repository for packages that are exclusively intended to be installed on a\nmanagement cluster.\n\n## Meta package\n\nA Package that contains PackageInstall CRs, Secrets and ServiceAccounts, RBAC rules that are needed to install other\npackages and when the meta package is installed, it installs the other packages. A meta Package may describe\na specific version of a Distribution.\n\n## Thick tarball\n\nA tarball that contains a package bundle and its associated images.\nThick tarballs are suitable for air-gapped environments.\n"
  },
  {
    "path": "docs/packages/dev-workflow.md",
    "content": "# Dev workflow\n\nThis document provides guidance on how to build and publish package and repo bundles and test them on your local cluster.\n\n> For detailed info about variables and targets used here, see [build-tooling](https://github.com/vmware-tanzu/build-tooling-for-integrations/blob/main/docs/build-tooling-getting-started.md).\n\n1. Build the container images for all the packages\n\n   Images need to be built by running the below make target, because they are used to generate\n   package bundles.\n\n   ```shell\n      OCI_REGISTRY=\"****\" make docker-build-all\n   ```\n\n2. Publish the container images for all the packages\n\n   ```shell\n      OCI_REGISTRY=\"****\" make docker-publish-all\n   ```\n\n   This would push container images for the components to specified registry and also replaces the newImage path in the [kbld-config.yaml](../../packages/readiness/kbld-config.yaml)\n\n3. Build the package bundles that belong to a particular package repository\n\n   To build the package bundles for all the packages in the `runtime-core` package [repository](../../packages/package-values.yaml) run:\n\n   ```shell\n      OCI_REGISTRY=\"****\" \\\n      PACKAGE_REPOSITORY=\"runtime-core\" \\\n      PACKAGE_VERSION=\"dev.0.0\" \\\n      PACKAGE_SUB_VERSION=\"1\" \\\n      REGISTRY_USERNAME=\"****\" \\\n      REGISTRY_PASSWORD=\"****\" \\\n      REGISTRY_SERVER=\"****\" \\\n      make package-bundle-generate-all\n   ```\n\n   To build a particular package bundle, run the following command. `PACKAGE_NAME` should specify the directory name under [packages](../../packages)\n   Note that included in the package bundle will be a thick tarball that is useful for air-gapped environments.\n\n   ```shell\n      OCI_REGISTRY=\"****\" \\\n      PACKAGE_NAME=\"readiness\" \\\n      PACKAGE_REPOSITORY=\"runtime-core\" \\\n      PACKAGE_VERSION=\"dev.0.0\" \\\n      PACKAGE_SUB_VERSION=\"1\" \\\n      REGISTRY_USERNAME=\"****\" \\\n      REGISTRY_PASSWORD=\"****\" \\\n      REGISTRY_SERVER=\"****\" \\\n      make package-bundle-generate\n   ```\n\n4. Build package repo bundle [Optional]\n\n   After building the package bundles, it is time to build package repository bundle, run the below make\n   target:\n\n   ```shell\n      PACKAGE_REPOSITORY=\"runtime-core\" \\\n      OCI_REGISTRY=\"****\" \\\n      REPO_BUNDLE_VERSION=\"v1.0.0\" \\\n      REPO_BUNDLE_SUB_VERSION=\"0\" \\\n      PACKAGE_VALUES_FILE=packages/package-values.yaml \\\n      make repo-bundle-generate\n   ```\n\n5. Push package bundles\n\n   After the package bundles are generated, now it's time to push them to an OCI registry, so that they can be consumed.\n   Run the below make target to push all the package bundles in the specified package repository:\n\n   ```shell\n      OCI_REGISTRY=\"****\" \\\n      PACKAGE_REPOSITORY=\"runtime-core\" \\\n      PACKAGE_VERSION=\"dev.0.0\" \\\n      PACKAGE_SUB_VERSION=\"1\" \\\n      REGISTRY_USERNAME=\"****\" \\\n      REGISTRY_PASSWORD=\"****\" \\\n      REGISTRY_SERVER=\"****\" \\\n      make package-bundle-push-all\n   ```\n\n   If you are interested in pushing only a specific package bundle, you could do that by running\n\n   ```shell\n      OCI_REGISTRY=\"****\" \\\n      PACKAGE_NAME=\"readiness\" \\\n      PACKAGE_REPOSITORY=\"runtime-core\" \\\n      PACKAGE_VERSION=\"dev.0.0\" \\\n      PACKAGE_SUB_VERSION=\"1\" \\\n      REGISTRY_USERNAME=\"****\" \\\n      REGISTRY_PASSWORD=\"****\" \\\n      REGISTRY_SERVER=\"****\" \\\n      make package-bundle-push\n   ```\n\n6. Push repo bundle [Optional]\n\n   To push the generated repo bundle to an OCI registry, run:\n\n   ```shell\n      PACKAGE_REPOSITORY=\"runtime-core\" \\\n      OCI_REGISTRY=\"****\" \\\n      REPO_BUNDLE_VERSION=\"v1.0.0\" \\\n      REPO_BUNDLE_SUB_VERSION=\"0\" \\\n      REGISTRY_USERNAME=\"****\" \\\n      REGISTRY_PASSWORD=\"****\" \\\n      REGISTRY_SERVER=\"****\" \\\n      make repo-bundle-generate repo-bundle-push\n   ```\n\n----\n\nFollow the below steps to test the artifacts that are generated in previous steps on your local cluster\n\n> **Note**: A local cluster can be any k8s cluster. There are 2 ways to install the packages\n\n**To install on a cluster without `kapp-controller` installed in it**\n\n1. Download the package bundle. The image sha tag can be noted from the registry where package was published.\n\n   ```shell\n      imgpkg pull -b ${OCI_REGISTRY}/readiness@sha256:1fb9f9c6f0c6ba1f995440885b02806551a79d9cef5b9c7c3d6f53a586facddd -o readiness-pkg\n   ```\n\n2. Install the package\n\n   ```shell\n      ytt -f readiness-pkg/config/ | kbld -f - -f readiness-pkg/.imgpkg/images.yml | kubectl apply -f-\n   ```\n\n**To install on a cluster with `kapp-controller` installed in it**\n\n> For more details about these steps, see kapp [packaging tutorial](https://carvel.dev/kapp-controller/docs/v0.31.0/packaging-tutorial)\n\n1. Create a `PackageRepository` resource. The image sha tag can be noted from the registry where **repo bundle** was published.\n\n   Create `repo.yaml`\n\n   ```yaml\n      ---\n      apiVersion: packaging.carvel.dev/v1alpha1\n      kind: PackageRepository\n      metadata:\n      name: tanzu-runtime-core-repo\n      spec:\n      fetch:\n         imgpkgBundle:\n            image: ${OCI_REGISTRY}/runtime-core@sha256:1fb9f9c6f0c6ba1f995440885b02806551a79d9cef5b9c7c3d6f53a586facddd\n   ```\n\n   ```bash\n      kapp deploy -a repo -f repo.yaml -y\n   ```\n\n2. Install kapp-controller service account [Optional if already present]\n\n   ```bash\n      kapp deploy -a default-ns-rbac -f https://raw.githubusercontent.com/vmware-tanzu/carvel-kapp-controller/develop/examples/rbac/default-ns.yml -y\n   ```\n\n   This will create a service account named `default-ns-sa`.\n\n3. Install the package\n\n   Create `pkginstall.yaml`\n\n   ```yaml\n      ---\n      apiVersion: packaging.carvel.dev/v1alpha1\n      kind: PackageInstall\n      metadata:\n      name: tanzu-readiness-pkg\n      spec:\n      serviceAccountName: default-ns-sa # service account from step 2\n      packageRef:\n         refName: readiness.tanzu.vmware.com\n   ```\n\n   ```shell\n      kapp deploy -a tanzu-readiness-package -f pkginstall.yaml -y\n   ```\n"
  },
  {
    "path": "docs/release/README.md",
    "content": "# Release\n\nDocumentation for the release process.\n\n## Table of Contents\n\n* [Kind Labels](kind-labels.md)\n* [Release Notes](release-notes.md)\n* [Release Process](release-process.md)\n* [Release Notes Gathering Process](release-notes-gathering-process.md)\n* [Cherry Pick process](cherry-pick.md)\n"
  },
  {
    "path": "docs/release/cherry-pick.md",
    "content": "Cherry-pick process\n===================\n\n- Know the target release branches your PR must be cherry-picked into\n- Raise your PR against main branch and add label `cherry-pick/release-0.28` where `release-0.28` is branch name, where you'd like to cherry-pick this change\n- Get your PR against main tested, reviewed and merged. Once merged, github action workflow will create cherry-pick PR against desired release branch.\n- The workflow adds a comment on the PR about the status of cherry-pick workflow for success (comment the resulting cherry-pick PR), failure or cancelled (if workflow is cancelled).\n- If there are merge conflicts while raising the cherry-pick PR, the workflow fails and adds respective comment on the merged PR. In this case, please raise the cherry-pick PR manually.\n"
  },
  {
    "path": "docs/release/kind-labels.md",
    "content": "# Kind Labels\n\nThe kind label is used to help identify the types of changes going into the\nrelease over time.\n\nOne of the following labels must be added to the pull request:\n\n* kind/api-change: Adds, removes, or changes an API\n* kind/bug: Fixes a newly discovered bug.\n* kind/cleanup: Adding tests, refactoring, fixing old bugs.\n* kind/design: Related to design\n* kind/deprecation: Deprecates CLI or an API.\n* kind/documentation: Adds documentation\n* kind/failing-test: CI test case is failing consistently.\n* kind/feature: New functionality.\n* kind/flake: CI test case is showing intermittent failures.\n* kind/other: Anything other than above.\n"
  },
  {
    "path": "docs/release/release-notes-gathering-process.md",
    "content": "# Release notes process\n\nThis document provides guidance on how to gather release notes from the pull\nrequests that have user-visible changes that will be part of the release.\n\nWe would be using a tool called [release-notes](https://github.com/kubernetes/release/tree/master/cmd/release-notes)\nthat is responsible for fetching, contextualizing, and rendering the release\nnotes for Tanzu Framework.\n\n## Installation\n\nThe simplest way to install the release-notes CLI is via `go install`:\n\n```sh\ngo install k8s.io/release/cmd/release-notes@v0.13.0\n```\n\n## Usage\n\nTo generate release notes for a commit range, we would be needing some basic\ninformation that we need to pass to the `release-notes` command.\n\n* GitHub API token.\n* Branch or tag name.\n* The commit hash to start processing from (inclusive).\n* The commit hash to end processing at (inclusive).\n\nThen run the below command to generate the release notes for a commit range:\n\n```sh\nexport GITHUB_TOKEN=${GITHUB_API_TOKEN}\nrelease-notes \\\n    --github-base-url https://github.com \\\n    --org vmware-tanzu-private \\\n    --repo core \\\n    --branch ${tag_or_branch} \\\n    --required-author \"\" \\\n    --start-sha ${start_sha} \\\n    --end-sha ${end_sha}\n```\n\nThe above command writes the release notes to a file that will be printed in\noutput of this command. The contents of the generated file should be pasted in\nrelease description when publishing the release.\n\nFor more information on the `release-notes` command and the options to run it,\ncheck [here](https://github.com/kubernetes/release/tree/master/cmd/release-notes)\n"
  },
  {
    "path": "docs/release/release-notes.md",
    "content": "# Release notes\n\nThis document provides guidance on providing release notes for changes made to\nTanzu Framework. Release notes act as a direct line of communication with the\nusers, making them aware of the changes and act as reference points for users\nabout to install or upgrade to a particular release.\n\n## Table of Contents\n\n* [Does my pull request need a release note?](#does-my-pull-request-need-a-release-note)\n* [Contents of a release note](#contents-of-a-release-note)\n* [Applying a Release Note](#applying-a-release-note)\n* [Reviewing Release Notes](#reviewing-release-notes)\n\n## Does my pull request need a release note?\n\nAny pull request with user-visible changes are required to add release notes,\nthis could mean:\n\n* User facing, critical bug-fixes\n* Notable feature additions\n* Output format changes\n* Deprecations or removals\n* Metrics changes\n* Dependency changes\n* API changes\n* CLI Changes\n* Configuration schema change\n* Fix of a vulnerability (CVE)\n\nNo release notes are required for changes to:\n\n* Tests\n* Build infrastructure\n\n## Contents of a release note\n\nA release note needs a clear, concise description of the change in simple plain language.\nThis includes:\n\n* an indicator if the pull request Added, Changed, Fixed, Removed, Deprecated\n  functionality or changed enhancement.\n* the name of the affected API or configuration fields, CLI commands/flags.\n* a link to relevant user documentation about the enhancement/feature.\n\nYour release note should be written in clear and straightforward sentences.\nNot all users are familiar with the technical details of your pull request,\nso consider what they need to know when you write your release note.\n\nWrite the release note like you are in the future like:\n\n* \"Added\" instead of \"add\"\n* \"Fixed\" instead of \"fix\"\n* \"Bumped\" instead of \"bump\"\n\nSome examples of release notes:\n\n* The command foo has been deprecated, will be removed in version \"1.5.0\".\n  Users of this command should use \"bar\" instead.\n* Fixed a bug that prevents CLI from initializing.\n\n## Applying a Release Note\n\nAny pull request with user visible changes, should\n\n* include a release-note block in the pull request description.\n* add an appropriate [kind label](kind-labels.md) to the pull request.\n\nFor pull requests with a release note:\n\n```text\n    ```release-note\n    Your release note here\n    ```\n```\n\nFor pull requests with no release note:\n\n```text\n    ```release-note\n    NONE\n    ```\n```\n\n## Reviewing Release Notes\n\nRelease note should be reviewed as a dedicated step in the overall pull request\nreview process.\n\nA release note needs to be changed or rephrased if one of the following cases\napply:\n\n* The release note does not communicate the full purpose of the change.\n* The release note is grammatically incorrect.\n* The release does not comply with the guidelines on the contents of the\n  release note.\n"
  },
  {
    "path": "docs/release/release-process.md",
    "content": "# Release process\n\nThe person who is responsible for cutting a release, pushes a tag to the\nGitHub repo to trigger the automation. A GitHub action then does the\nfollowing things:\n\n1. Runs a full build via `make` targets.\n2. Runs the tests.\n3. Creates a draft github release.\n\nAfter the GitHub action runs successfully without failure, the person who is\ncutting the release:\n\n1. Runs the [release-notes](release-notes-gathering-process.md) command to gather the\n   release notes from the pull requests that are part of the release.\n2. Goes to the releases page and adds the release notes to the Draft release\n   and publishes the release.\n"
  },
  {
    "path": "docs/runtime-core/README.md",
    "content": "# API Machinery\n\nDocumentation for API Machinery related things.\n\n## Table of Contents\n\n* [Tanzu Framework Controllers Using Kubebuilder](tanzu-core-controllers.md)\n* [Features and FeatureGates](features-and-featuregates.md)\n* [Capability Discovery](capability-discovery.md)\n"
  },
  {
    "path": "docs/runtime-core/capability-discovery.md",
    "content": "# Capability Discovery\n\n## Table of Contents\n\n* [Capability Discovery](#capability-discovery)\n  * [Discovery Go Package](#discovery-go-package)\n    * [Building a ClusterQueryClient](#building-a-clusterqueryclient)\n    * [Building and Executing Queries](#building-and-executing-queries)\n  * [Executing Pre-defined TKG queries](#executing-pre-defined-tkg-queries)\n  * [Capability CRD](#capability-crd)\n    * [Example Capability Custom Resource](#example-capability-custom-resource)\n\n------------------------\n\nThe capability discovery Go package in `github.com/vmware-tanzu/tanzu-framework/capabilities/client/pkg/discovery` go module, along\nwith the `Capability` CRD offer the ability to query a cluster's capabilities. A \"capability\" is defined as anything a\nKubernetes cluster can do or have, such as objects and the API surface area. Capability discovery can be used to answer\nquestions such as `Is this a TKG cluster?`, `Does this cluster have a resource Foo?` etc.\n\n## Discovery Go Package\n\nThe [`capabilities/client/pkg/discovery`](https://github.com/vmware-tanzu/tanzu-framework/tree/main/capabilities/client/pkg/discovery)\nprovides methods to query a Kubernetes cluster for the state of its API surface.\n\n`ClusterQueryClient` allows clients to build queries to inspect a cluster and evaluate results.\n\nThe sections below illustrate how to build a client and query for APIs and objects.\n\n### Building a ClusterQueryClient\n\nUse the constructor(s) from `discovery` package to get a query client.\n\n```go\nimport (\n    \"sigs.k8s.io/controller-runtime/pkg/client/config\"\n    \"github.com/vmware-tanzu/tanzu-framework/capabilities/client/pkg/discovery\"\n)\n\ncfg := config.GetConfig()\n\nclusterQueryClient, err := discovery.NewClusterQueryClientForConfig(cfg)\nif err != nil {\n    log.Error(err)\n}\n```\n\n### Building and Executing Queries\n\nUse `Group`, `Object` and `Schema` functions in the `discovery` package to build queries and execute them.\n\n```go\nimport \"github.com/vmware-tanzu/tanzu-framework/capabilities/client/pkg/discovery\"\n\n// Define objects to query.\nvar pod = corev1.ObjectReference{\n    Kind:       \"Pod\",\n    Name:       \"testpod\",\n    Namespace:  \"testns\",\n    APIVersion: \"v1\",\n}\n\nvar testAnnotations = map[string]string{\n    \"cluster.x-k8s.io/provider\": \"infrastructure-fake\",\n}\n\n// Define queries.\nvar testObject = Object(\"podObj\", &pod).WithAnnotations(testAnnotations)\n\nvar testGVR = Group(\"podResource\", testapigroup.SchemeGroupVersion.Group).WithVersions(\"v1\").WithResource(\"pods\")\n\n// Build query client.\nc := clusterQueryClient.Query(testObject, testGVR)\n\n// Execute returns combined result of all queries.\nfound, err := c.Execute()\nif err != nil {\n    log.Error(err)\n}\n\nif found {\n    log.Info(\"Queries successful\")\n}\n\n// Inspect granular results of each query using the Results method (should be called after Execute).\nif result := c.Results().ForQuery(\"podResource\"); result != nil {\n    if result.Found {\n        log.Info(\"Pod resource found\")\n    } else {\n        log.Infof(\"Pod resource not found. Reason: %s\", result.NotFoundReason)\n    }\n}\n```\n\n## Executing Pre-defined TKG queries\n\nThe `capabilities/client/pkg/discovery/tkg` package builds on top of the generic discovery package and exposes\npre-defined queries to determine a TKG cluster's capabilities.\n\nSome examples are shown below.\n\n```go\nimport tkgdiscovery \"github.com/vmware-tanzu/tanzu-framework/capabilities/client/pkg/discovery/tkg\"\n\nc, err := tkgdiscovery.NewDiscoveryClientForConfig(cfg)\nif err != nil {\n    log.Fatal(err)\n}\n\nif c.IsTKGm() {\n    log.Info(\"This is a TKGm cluster\")\n}\n\nif c.IsManagementCluster() {\n    log.Info(\"Management cluster\")\n}\n\nif c.IsWorkloadCluster() {\n    log.Info(\"Workload cluster\")\n}\n\nif c.HasCloudProvider(ctx, tkgdiscovery.CloudProviderVsphere) {\n    log.Info(\"Cluster has vSphere cloud provider\")\n}\n```\n\n## Capability CRD\n\nEvery TKG cluster starting from v1.4.0 includes a `Capability` CRD and an associated controller. Like the Go package\ndescribed above, a `Capability` CR can be used to craft queries to inspect a cluster's state and store the results the\nCR's `status` field. `Capability` CRD's specification allows for different types of queries to inspect a cluster.\n\nThe full API can be found in [apis/core/v1alpha2/capability_types.go](../../apis/core/v1alpha2/capability_types.go)\n\n### Example Capability Custom Resource\n\nThe following custom resource checks if the cluster is a TKG cluster which supports feature gating\nabilities, and if it has NSX networking capabilities.\n\n```yaml\napiVersion: core.tanzu.vmware.com/v1alpha2\nkind: Capability\nmetadata:\n  name: tkg-capabilities\nspec:\n  serviceAccountName: my-service-account\n  queries:\n    - name: \"tanzu-cluster-with-feature-gating\"\n      groupVersionResources:\n        - name: \"tanzu-resource\"\n          group: \"run.tanzu.vmware.com\"\n          versions:\n            - v1alpha1\n          resource: \"tanzukubernetesreleases\"\n        - name: \"featuregate-resource\"\n          group: \"config.tanzu.vmware.com\"\n          versions:\n            - v1alpha1\n          resource: \"featuregates\"\n    - name: \"nsx-support\"\n      objects:\n        - name: \"nsx-namespace\"\n          objectReference:\n            kind: \"Namespace\"\n            name: \"vmware-system-nsx\"\n            apiVersion: \"v1\"\n```\n\nTo execute the queries with the above CR, a serviceAccountName needs to be specified to give capabilities controller\nenough privileges to query for resources. Refer to [Security model](#security-model) to understand how a ServiceAccount\nis used to query for resources.\n\nThe capabilities controller:\n\n1. Watches `Capability` resources that are created or updated.\n1. Executes queries specified in the spec.\n1. Writes the results to the status field of the resource.\n\nAfter reconciliation, results can be inspected by looking at the status field. Results are grouped by GVK, Object and\nPartial Schema queries, and provide a predictable data structure for consumers to parse. They can be accessed by the\npaths `status.results.groupVersionResources`, `status.results.objects` and `status.results.partialSchemas` respectively.\n\nAn example of query results is shown below.\n\n```yaml\napiVersion: core.tanzu.vmware.com/v1alpha2\nkind: Capability\nmetadata:\n  name: tkg-capabilities\nspec:\n  # Omitted\nstatus:\n  results:\n  - groupVersionResources:\n    - found: true\n      name: tanzu-resource\n    - found: true\n      name: featuregate-resource\n    name: tanzu-cluster-with-feature-gating\n  - name: nsx-support\n    objects:\n    - found: false\n      name: nsx-namespace\n```\n\n### Security Model\n\nCapabilities controller container runs with a service account that has access to all service accounts and secrets in the\ncluster. This service account is not used for querying resources. If a user is querying for objects, then each\nCapabilities CR must specify a service account to allow the Capabilities CR owner to query for only resources they have\naccess to. This avoids the problem of privilege escalation by not relying on the shared service account to query for\nresources. The additional benefit of users specifying the service account is they can query for more resources than\nwhat the shared service account has access to. But, if the user is querying for the existence of a GVR, then\nservice account name is not needed as part of the spec as the Capabilities controller uses a default service account\n(`tanzu-capabilities-manager-default-sa`) which doesn't have any permissions to access cluster resources to execute\nthose queries.\n\n**Ex 1:**\n\nIf you as a user want to query for a particular resource, for example a pod named `nginx` in `foo` namespace, create a\nRole, RoleBinding and add the ServiceAccount as a subject in the RoleBinding and specify the ServiceAccount in the\nCapability CR.\n\nCreate RBAC rules:\n\n```yaml\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: my-sa\n  namespace: default\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n  namespace: foo\n  name: pod-reader\nrules:\n  - apiGroups: [\"\"]\n    resources: [\"pods\"]\n    verbs: [\"get\", \"watch\", \"list\"]\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: RoleBinding\nmetadata:\n  name: my-role-binding\n  namespace: foo\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: Role\n  name: pod-reader\nsubjects:\n  - kind: ServiceAccount\n    name: my-sa\n    namespace: default\n```\n\nCreate a Capability CR in the same namespace as the ServiceAccount(in this case `default` namespace).\n\n```yaml\napiVersion: core.tanzu.vmware.com/v1alpha2\nkind: Capability\nmetadata:\n  name: nginx-capability\nspec:\n  serviceAccountName: my-sa\n  queries:\n    - name: \"Query for nginx pod\"\n      objects:\n        - name: \"query nginx\"\n          objectReference:\n            kind: \"Pod\"\n            name: \"nginx\"\n            apiVersion: \"v1\"\n            namespace: \"foo\"\n```\n\n**Ex 2:**\n\nIf you are just querying to check the existence of a GVR, lets say FeatureGate API, then you need not specify the\nservice account name in the Capability CR.\n\n```yaml\napiVersion: core.tanzu.vmware.com/v1alpha2\nkind: Capability\nmetadata:\n  name: tkg-capabilities\nspec:\n  queries:\n    - name: \"tanzu-cluster-with-feature-gating\"\n      groupVersionResources:\n        - name: \"featuregate-resource\"\n          group: \"config.tanzu.vmware.com\"\n          versions:\n            - v1alpha1\n          resource: \"featuregates\"\n```\n"
  },
  {
    "path": "docs/runtime-core/features-and-featuregates.md",
    "content": "# Framework Features\n\nFramework offers Features and Featuregates APIs to allow developers to have a\nsystem to control rollout and availability of new Features in controller logic.\n\n## Key Concepts\n\n* **Feature**: Functionality that is being introduced to a codebase which will\n  be gated by FeatureGate. Features can be activated/deactivated based on the\n  stability level policy. Features are created and managed by the API developers\n  creating the functionality.\n* **FeatureGate**: The mechanism that provides a means to control the state for\n  a set of Features. FeatureGates are a resource that is managed by Platform\n  Operators.\n* **Feature Activation**: The reconciled state of a Feature. If a FeatureGate\n  exists that references a specific Feature, it is reconciled by the Feature controller\n  to set the correct state of the Feature in its status. If a FeatureGate doesn't exist\n  for a Feature, Feature will always default to their defined activation state in the\n  stability policy.\n* **TKG SDK**: A collection of packages and tools provided by Framework intended\n  to provide developers with additional integration capabilities.\n\n## Features API\n\nThe Features API provides controller developers a means to roll out new code in a more\npredictable manner, using a standard durable API.\n\nFeatures are a Cluster-level resources and are set to default activation state when\nthey are created.\n\nThe [Features API Spec](apis/core/v1alpha2/feature_types.go) provides following fields:\n\n* **description**: To provide description about the feature.\n* **stability**: To indicate the stability level of the feature. Valid stability levels are\n  Work In Progress, Experimental, Technical Preview, Stable and Deprecated. Each stability\n  level has a policy associated with it and the Feature should adhere to that policy. Learn\n  more about the stability level policies [here](##stability-level-policies).\n\nThe status of the Feature resource has the observed state of the feature.\n\n### Example\n\nIn this example, we will define a `Technical Preview` feature, which is deactivated by default\nand is discoverable and mutable. Also, it doesn't void the warranty support if activated for\nthe environment.\n\n```yaml\napiVersion: core.tanzu.vmware.com/v1alpha2\nkind: Feature\nmetadata:\n  name: big-cache\nspec:\n  description: \"A sample big cache Feature\"\n  stability: \"Technical Preview\"\n```\n\n## FeatureGates API\n\nThe [FeatureGates API](apis/core/v1alpha2/featuregate_types.go) provides a\nmeans for operators to set Feature state in an eventually consistent,\nlevel-triggered manner. FeatureGates are a Cluster-level resources.\n\nFeatureGates can be set at cluster creation time or anytime afterword.\n\nThe Spec offers the following fields:\n\n* **Features**: A list of Features to set activated/deactivated.\n\nThere are two possible outcomes for the features listed in the spec:\n\n* Applied - indicates that the feature intent has been successfully applied.\n* Invalid - indicates that the feature intent specified in the spec is invalid.\n\n### Example\n\nThis example FeatureGate will be used to toggle our big-cache Feature to activated\nin our cluster, overriding its default.\n\n```yaml\napiVersion: core.tanzu.vmware.com/v1alpha2\nkind: FeatureGate\nmetadata:\n  name: featuregate-sample\nspec:\n  features:\n    - name: big-cache\n      activate: true\n```\n\n## Stability Level Policies\n\nEvery Feature has a stability level and that Feature should adhere to the policy\ndefined for that stability level. Below are the various stability levels that\nare currently supported:\n\n| Stability Level   | Default Activation State | Discoverable | State Immutable ? | Voids Warranty If Activated? | Stability Level Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n|-------------------|--------------------------|--------------|-------------------|------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| Work In Progress  | false                    | false        | false             | true                         | Feature is still under development. It is not ready to be used, except by the team working on it. Activating this feature is not recommended under any circumstances.                                                                                                                                                                                                                                                                                                                           |\n| Experimental      | false                    | true         | false             | true                         | Feature is not ready, but may be used in pre-production environments. However, if an experimental feature has ever been used in an environment, that environment will not be supported. Activating an experimental feature requires you to permanently, irrevocably void all support guarantees for this environment by setting permanentlyVoidAllSupportGuarantees in feature reference in featuregate spec to true. You will need to recreate the environment to return to a supported state. |\n| Technical Preview | false                    | true         | false             | false                        | Feature is not ready, but is not believed to be dangerous. The feature itself is unsupported, but activating a technical preview feature does not affect the support status of the environment.                                                                                                                                                                                                                                                                                                 |\n| Stable            | true                     | true         | true              | false                        | Feature is ready and fully supported                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n| Deprecated        | true                     | true         | false             | false                        | Feature is destined for removal, usage is discouraged. Deactivate this feature prior to upgrading to a release which has removed it to validate that you are not still using it and to prevent users from introducing new usage of it.                                                                                                                                                                                                                                                          |\n"
  },
  {
    "path": "docs/runtime-core/guide/README.md",
    "content": "# Tanzu Framework API Machinery Guide\n\nThe purpose of this walkthrough is to provide a good starting place for those writing new features atop Framework.\n\nThe primary aim is to introduce the APIs and tools available in Framework to developers of new APIs.\n\nWe will use stock Kubebuilder and manually setup a Feature, and the Query for the controller via Capabilities API.\n\nThere are experimental Kubebuilder plugins for Framework under development which will remove the majority of the manual\ntoil below, but this guide will continue to walk through this code manually to ensure the concepts are clear.\n\nThese new APIs are documented here:\n\n* [Features](../features-and-featuregates.md#features-api)\n* [FeatureGate](../features-and-featuregates.md#featuregates-api)\n* [Capability](../capability-discovery.md)\n\n## Generate a new API\n\nWe recommend using [Kubebuilder](https://kubebuilder.io/) and [Controller-Runtime](https://github.com/kubernetes-sigs/controller-runtime)\nbased tools to create your new Resources, but the good news is that the Features API and Capabilities will probably work\nwith any method of creating and running controllers.\n\nFirst, initialize a new project.\n\n```sh\nkubebuilder init --domain mydomain.com\n```\n\nLets generate a new API using stock Kubebuilder plugins:\n\n```sh\nkubebuilder create api --group example --version v1alpha1 --kind MegaCache\n```\n\n## Add a Feature\n\nYou may reference [this example of the types file](examples/megacache_types.go.sample).\n\nOpen the new API type file in your editor of choice. One way to define a feature and manage its lifecycle is via\nfeature tags and our codegen plugin.\n\n```sh\nvim api/v1alpha1/megacache_types.go\n```\n\nAdd the following line to your types file one line above the type itself.\n\n```go\n//+tanzu:feature:name=mega-cache,stability=Technical Preview\n```\n\nThis tag states that this Type makes use of a feature `mega-cache` with stability level as `Technical Preview`, which is\nmutable, discoverable, deactivated by default and does not void support warranty of the environment if activated.\n\nMore info on these levels is available [here](../features-and-featuregates.md##stability-level-policies).\n\n## Modify the type\n\nAlso in the types file, add a field to your new MegacacheSpec type named CacheSize.\nThis will dictate the size of our experimental cache.\n\n```go\ntype MegaCacheSpec struct {\n        Size int `json:\"bool,omitempty\"`\n}\n```\n\n## Register FeatureGate Scheme\n\nTo do so, open `main.go` in the editor of your choice.\n\nHere, the FeatureGate Kind needs be registered in Scheme for type v1alpha2.FeatureGate after importing the appropriate package.\n\nThe init function should look like below after adding the appropriate Kinds to the scheme:\n\n```go\nimport corev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n...\n\nfunc init() {\n        utilruntime.Must(clientgoscheme.AddToScheme(scheme))\n        utilruntime.Must(corev1alpha2.AddToScheme(scheme))\n        utilruntime.Must(examplev1alpha1.AddToScheme(scheme))\n        //+kubebuilder:scaffold:scheme\n}\n```\n\n## Modify the Controller\n\nYou may reference [this example of the controller code](examples/controller.go.sample).\n\nNext, the controller code needs some updating. We want it to provide a manager that listens for Feature updates,\nand we want to provide a simple means of checking the feature in our reconciler function.\n\n### Update Imports\n\nFirst add the import for the Framework Core API package and the SDK FeatureGate package.\n\n```go\ncorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\ngate \"github.com/vmware-tanzu/tanzu-framework/featuregates/client/pkg/featuregateclient\"\n```\n\n### Update Manager\n\nWe need to update the manager setup to listen for the Feature updates.\n\nIt should look like this afterword:\n\n```go\n// SetupWithManager sets up the controller with the Manager.\nfunc (r *MegaCacheReconciler) SetupWithManager(mgr ctrl.Manager) error {\n    return ctrl.NewControllerManagedBy(mgr).\n        For(&mygroupv1alpha1.MegaCache{}).\n        Watches(&source.Kind{Type: &corev1alpha2.Feature{}}, eventHandler(mgr.GetClient())).\n        Complete(r)\n}\n\nfunc eventHandler(c client.Client) handler.EventHandler {\n    return handler.EnqueueRequestsFromMapFunc(func(object client.Object) []reconcile.Request {\n        MegaCacheList := &mygroupv1alpha1.MegaCacheList{}\n        if err := c.List(context.Background(), MegaCacheList); err != nil {\n            log.Infof(\"list-failed err=%q\", err)\n        }\n        var requests []reconcile.Request\n        for _, item := range MegaCacheList.Items {\n            requests = append(requests, reconcile.Request{NamespacedName: types.NamespacedName{\n                Name:      item.Name,\n                Namespace: item.Namespace,\n            }})\n        }\n        return requests\n    })\n}\n```\n\n### Manage Feature\n\nNow we can control our controller behavior based on Feature status.\n\nTo do so, in this case we will add the following functionality in the reconcile logic.\n\nThis code will essentially toggle the logic of the entire controller, but your code should be more granular.\n\n```go\nenabled, err := gate.IsFeatureActivated(ctx, r.Client, \"megacache\")\nif err != nil {\n        return ctrl.Result{}, err\n}\nif !enabled {\n        log.Info(\"feature deactivated\")\n        return ctrl.Result{}, nil\n}\n```\n\n## Generate and Install\n\nNow you can generate your code and manifests as normal. After this, your directory will be populated with\ngenerated code and manifests that reference them in `config/`.\n\n```sh\nmake generate\nmake manifests\n```\n\n## Run the controller\n\nFrom here, run `make run` to boot your dev controller for development purposes. This boots your controller in your local\nenvironment and does not require building or pushing docker images.\n\nOpen a new console tab, and leave this controller running for now.\n\nWe are going to toggle the Feature and watch the output in this console.\n\n```sh\nmake run\n```\n\n### Deploying to Real Clusters\n\nTo use the controller and API outside development, you will need to provide an authenticated docker repository in the\nenv variable `IMG`, and then the docker images can be built with:\n\n```sh\nexport IMG=your.docker.image.tag\n\nmake docker-build && make docker-push\n```\n\nThe deploy command will deploy the controller to the K8s cluster specified in `~/.kube/config`:\n\n```sh\nmake deploy\n```\n\nThese commands are not required for the purposes of this guide.\n\n## Create an Example MegaCache\n\nLets create an example MegaCache resource. To do so, copy the follow YAML and apply it to your cluster:\n\n```yaml\napiVersion: example.mydomain.com/v1alpha1\nkind: MegaCache\nmetadata:\n  name: mycache\n  size: 10000\n```\n\nOnce applied, we can query for this using Capabilities.\n\n## Create a Capability resource\n\nAs described above, Capability Discovery provides an API to query a Kubernetes cluster about its current state. We will do so\nnow to determine if our new API exists.\n\nWe can create a Capability to define whether our new resource exists. Create the following in a text file:\n\n```yaml\napiVersion: run.tanzu.vmware.com/v1alpha1\nkind: Capability\nmetadata:\n  name: my-megacache\nspec:\n  queries:\n    - name: \"megacache-v1alpha1\"\n      groupVersionResources:\n        - name: \"megacache\"\n          group: \"example.mydomain.com\"\n          versions:\n            - v1alpha1\n```\n\nThe above resource defines a query that determines if this cluster provides the megacache v1alpha1 GVR.\n\nOnce applied, this resource will provide us with an example we can use Capability Discovery to query for.\n\n### Install Capability Resource\n\nNow kubectl apply this resource:\n\n```sh\nkubectl apply -f megacache-capability.yaml\n```\n\nAnd view the Status to see the state of the queries!\n\n```sh\nkubectl get capability my-megacache -o yaml\n```\n\nWe can see that our new Capability clearly denotes that our capability exists - both the API and the my-cache object are present!\n\n```yaml\nstatus:\n  results:\n  - groupVersionResources:\n    - found: true\n      name: megacache\n    name: megacache-v1alpha1\n```\n\n## Summary\n\nNow we have created a new Feature, a new API and used a new Capability to assert their presence. Great job!\n"
  },
  {
    "path": "docs/runtime-core/guide/examples/controller.go.sample",
    "content": "/*\nCopyright 2021.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage controllers\n\nimport (\n\t\"context\"\n\n\t\"github.com/go-logr/logr\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\tctrl \"sigs.k8s.io/controller-runtime\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\n\t\"k8s.io/apimachinery/pkg/types\"\n\t\"sigs.k8s.io/controller-runtime/pkg/handler\"\n\t\"sigs.k8s.io/controller-runtime/pkg/reconcile\"\n\t\"sigs.k8s.io/controller-runtime/pkg/source\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n\n\tgate \"github.com/vmware-tanzu/tanzu-framework/pkg/v1/sdk/features/featuregate\"\n\tmygroupv1alpha1 \"my.domain/demo-operator/api/v1alpha1\"\n)\n\n// MegaCacheReconciler reconciles a MegaCache object\ntype MegaCacheReconciler struct {\n\tclient.Client\n\tLog    logr.Logger\n\tScheme *runtime.Scheme\n}\n\n//+kubebuilder:rbac:groups=mygroup.my.domain,resources=megacaches,verbs=get;list;watch;create;update;patch;delete\n//+kubebuilder:rbac:groups=mygroup.my.domain,resources=megacaches/status,verbs=get;update;patch\n//+kubebuilder:rbac:groups=mygroup.my.domain,resources=megacaches/finalizers,verbs=update\n\n// For more details, check Reconcile and its Result here:\n// - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.7.2/pkg/reconcile\nfunc (r *MegaCacheReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {\n\tlog := r.Log.WithValues(\"megacache\", req.NamespacedName)\n\tlog.Info(\"Starting reconcile\")\n\n\tns := req.NamespacedName.Namespace\n\t// Lets gate our experimental logic. Or, all of our logic. or, none.\n\tenabled, err := gate.FeatureActivatedInNamespace(ctx, r.Client, ns, \"megacache\")\n\tif err != nil {\n\t\treturn ctrl.Result{}, err\n\t}\n\tif !enabled {\n\t\tlog.Info(\"feature deactivated\")\n\t\treturn ctrl.Result{}, nil\n\t}\n\n\treturn ctrl.Result{}, nil\n}\n\n// SetupWithManager sets up the controller with the Manager.\nfunc (r *MegaCacheReconciler) SetupWithManager(mgr ctrl.Manager) error {\n\treturn ctrl.NewControllerManagedBy(mgr).\n\t\tFor(&mygroupv1alpha1.MegaCache{}).\n\t\tWatches(&source.Kind{Type: &corev1alpha2.Feature{}}, eventHandler(mgr.GetClient())).\n\t\tComplete(r)\n}\n\nfunc eventHandler(c client.Client) handler.EventHandler {\n\treturn handler.EnqueueRequestsFromMapFunc(func(object client.Object) []reconcile.Request {\n\t\tvar requests []reconcile.Request\n\n\t\tMegaCacheList := &mygroupv1alpha1.MegaCacheList{}\n\t\tif err := c.List(context.Background(), MegaCacheList); err != nil {\n\t\t\treturn requests\n\t\t}\n\t\tfor _, item := range MegaCacheList.Items {\n\t\t\trequests = append(requests, reconcile.Request{NamespacedName: types.NamespacedName{\n\t\t\t\tName:      item.Name,\n\t\t\t\tNamespace: item.Namespace,\n\t\t\t}})\n\t\t}\n\t\treturn requests\n\t})\n}\n"
  },
  {
    "path": "docs/runtime-core/guide/examples/megacache_types.go.sample",
    "content": "/*\nCopyright 2021.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage v1alpha1\n\nimport (\n        metav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n)\n\n// MegaCacheSpec defines the desired state of MegaCache\ntype MegaCacheSpec struct {}\n\n// MegaCacheStatus defines the observed state of MegaCache\ntype MegaCacheStatus struct {\n        // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster\n        // Important: Run \"make\" to regenerate code after modifying this file\n}\n\n//+kubebuilder:object:root=true\n//+kubebuilder:subresource:status\n//+tanzu:feature:name=megacache,stability=Technical Preview\n\n// MegaCache is the Schema for the megacaches API\ntype MegaCache struct {\n        metav1.TypeMeta   `json:\",inline\"`\n        metav1.ObjectMeta `json:\"metadata,omitempty\"`\n\n        Spec   MegaCacheSpec   `json:\"spec,omitempty\"`\n        Status MegaCacheStatus `json:\"status,omitempty\"`\n}\n\n//+kubebuilder:object:root=true\n\n// MegaCacheList contains a list of MegaCache\ntype MegaCacheList struct {\n        metav1.TypeMeta `json:\",inline\"`\n        metav1.ListMeta `json:\"metadata,omitempty\"`\n        Items           []MegaCache `json:\"items\"`\n}\n\nfunc init() {\n        SchemeBuilder.Register(&MegaCache{}, &MegaCacheList{})\n}\n"
  },
  {
    "path": "docs/runtime-core/readiness-framework/deploy-local-changes.md",
    "content": "# Deploying the local changes to a Kind cluster\n\n## Pre-requisites\n\n1. Docker\n2. Kind\n3. ytt\n4. Kubectl\n5. Make\n\n### Create Kind cluster\n\nThe kind cluster can be created by the following command.\n\n```bash\nKIND_CLUSTER_NAME=<cluster_name> KUBE_VERSION=<kubernetes_version> make create-kind-cluster\n```\n\nFor example, the following command creates a kind cluster with name `kind1` and k8s version `v1.26.3`.\n\n```bash\nKIND_CLUSTER_NAME=kind1 KUBE_VERSION=v1.26.3 make create-kind-cluster\n```\n\n## Deploy local changes to a kind cluster\n\nRun the following command to install the readiness framework in the Kind cluster created.\n\n```bash\nKIND_CLUSTER_NAME=<cluster_name> make deploy-local-readiness\n```\n\nExample:\n\n```bash\nKIND_CLUSTER_NAME=kind1 make deploy-local-readiness\n```\n\n## Run end-to-end tests\n\nThe end-to-end tests can be triggered on the local Kind cluster by running the following command.\n\n```bash\nmake e2e-readiness\n```\n"
  },
  {
    "path": "docs/runtime-core/readiness-framework/guide-with-examples.md",
    "content": "# Usage Guide\n\n## Abstractions\n\n### Readiness Check\n\nAn organization can have a set of approved checks. Each check is a free form string. Some examples of checks are as follows:\n\n1. com.org1.k8s.certificate-management\n2. com.org1.k8s.fips\n\n### Readiness Definition\n\nReadiness definition is represented by the CRD `Readiness`. Readiness definition is a collection of checks. Any given Readiness definition is said to be ready if all the mentioned checks are true.\n\nGiven k8s cluster can have multiple Readiness definitions.\n\nAny given check can be present in zero or more readiness definitions. This means, an approved check may not be present in any of the readiness definitions in the cluster. Also, any given check can be present in more than one readiness defintions.\n\n### Readiness Provider\n\nReadiness provider is represented by the CRD `ReadinessProvider`. The readiness provider has a collection of conditions that will be evaluated by the readiness controller and a set of readiness checks that will be set to true if all the conditions evaluate to true.\n\nA readiness provider can provide zero or more readiness checks. For example, a cluster essentials provider can provide the checks `secretgen` and `kapp-controller`.\n\nA readiness provider has zero or more conditions. The provider evaluates to `Success` if there are no conditions defined. The provider evaluates to `Success` if there is at least one condition defined and all the defined conditions evaluate to `true`.\n\n## Example\n\n### Checks\n\nLet's assume we have the following checks approved by the organization org1\n\n1. com.org1.k8s.package-management\n2. com.org1.k8s.secret-management\n3. com.org1.k8s.certificate-management\n\n### Service Account\n\nFor the readiness providers to be able to query various reources, a service account which has required role bindings can be provided in the spec.\nA sample yaml is defined below, which grants permissions to read CRDs. For creating these resources, run `kubectl apply -f <filename>`. We'll be referring to the details of the created service account in the following sections.\n\n```yaml\n---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: crd-read-sa\n  namespace: default\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n  name: crd-read-role\n  namespace: default\nrules:\n  - apiGroups:\n    - \"apiextensions.k8s.io\"\n    resources:\n      - customresourcedefinitions\n    verbs:\n      - get\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: RoleBinding\nmetadata:\n  name: crd-read-rolebinding\n  namespace: default\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: Role\n  name: crd-read-role\nsubjects:\n  - kind: ServiceAccount\n    name: crd-read-sa\n    namespace: default\n\n```\n\n### Readiness Providers\n\nNow, let's defined three readiness providers, one for each of the above checks.\n\n#### Package Management Provider\n\nThe following readiness provider manifest has one `checkRef` for `com.org1.k8s.package-management`. This denotes that this provider provides the readiness check `com.org1.k8s.package-management`.\n\nAlso note that the following manifest contains four different conditions where each condition check for existence of a CRD with a certain name. In this example, we assume that the package management is ready if these four CRDs are present in the cluster.\n\n```yaml\napiVersion: core.tanzu.vmware.com/v1alpha2\nkind: ReadinessProvider\nmetadata:\n  name: kapp-controller\nspec:\n  checkRefs:\n  - com.org1.k8s.package-management\n  conditions:\n  - name: internal-package-metadata\n    resourceExistenceCondition:\n      apiVersion: apiextensions.k8s.io/v1\n      kind: CustomResourceDefinition\n      name: internalpackagemetadatas.internal.packaging.carvel.dev\n  - name: internal-package\n    resourceExistenceCondition:\n      apiVersion: apiextensions.k8s.io/v1\n      kind: CustomResourceDefinition\n      name: internalpackages.internal.packaging.carvel.dev\n  - name: package-install\n    resourceExistenceCondition:\n      apiVersion: apiextensions.k8s.io/v1\n      kind: CustomResourceDefinition\n      name: packageinstalls.packaging.carvel.dev\n  - name: package-repository\n    resourceExistenceCondition:\n      apiVersion: apiextensions.k8s.io/v1\n      kind: CustomResourceDefinition\n      name: packagerepositories.packaging.carvel.dev\n  serviceAccountRef:\n    name: crd-read-sa\n    namespace: default\n```\n\nSave the above manifest in a file and run `kubectl apply -f <filename>` to deploy it on the Kubernetes cluster where the readiness framework is already installed.\n\n#### Secret Management Provider\n\nSimilar to package management provider, install the secret management provider into the cluster by applying the manifest given below.\n\n```yaml\napiVersion: core.tanzu.vmware.com/v1alpha2\nkind: ReadinessProvider\nmetadata:\n  name: secretgen\nspec:\n  checkRefs:\n  - com.org1.k8s.secret-management\n  conditions:\n  - name: certificate\n    resourceExistenceCondition:\n      apiVersion: apiextensions.k8s.io/v1\n      kind: CustomResourceDefinition\n      name: certificates.secretgen.k14s.io\n  - name: password\n    resourceExistenceCondition:\n      apiVersion: apiextensions.k8s.io/v1\n      kind: CustomResourceDefinition\n      name: passwords.secretgen.k14s.io\n  - name: rsakey\n    resourceExistenceCondition:\n      apiVersion: apiextensions.k8s.io/v1\n      kind: CustomResourceDefinition\n      name: rsakeys.secretgen.k14s.io\n  - name: secretexport\n    resourceExistenceCondition:\n      apiVersion: apiextensions.k8s.io/v1\n      kind: CustomResourceDefinition\n      name: secretexports.secretgen.carvel.dev\n  - name: secretimport\n    resourceExistenceCondition:\n      apiVersion: apiextensions.k8s.io/v1\n      kind: CustomResourceDefinition\n      name: secretimports.secretgen.carvel.dev\n  - name: sshkey\n    resourceExistenceCondition:\n      apiVersion: apiextensions.k8s.io/v1\n      kind: CustomResourceDefinition\n      name: sshkeys.secretgen.k14s.io\n  - name: secrettemplate\n    resourceExistenceCondition:\n      apiVersion: apiextensions.k8s.io/v1\n      kind: CustomResourceDefinition\n      name: secrettemplates.secretgen.carvel.dev\n  serviceAccountRef:\n    name: crd-read-sa\n    namespace: default\n```\n\n#### Certificate Management Provider\n\nThe manifest for the certificate management provider is given as follows. Install this manifest to the cluster\n\n```yaml\napiVersion: core.tanzu.vmware.com/v1alpha2\nkind: ReadinessProvider\nmetadata:\n  name: cert-manager\nspec:\n  checkRefs:\n  - com.org1.k8s.certificate-management\n  conditions:\n  - name: certificate\n    resourceExistenceCondition:\n      apiVersion: apiextensions.k8s.io/v1\n      kind: CustomResourceDefinition\n      name: certificates.cert-manager.io\n  - name: certificate-request\n    resourceExistenceCondition:\n      apiVersion: apiextensions.k8s.io/v1\n      kind: CustomResourceDefinition\n      name: certificaterequests.cert-manager.io\n  - name: challenge\n    resourceExistenceCondition:\n      apiVersion: apiextensions.k8s.io/v1\n      kind: CustomResourceDefinition\n      name: challenges.acme.cert-manager.io\n  - name: cluster-issuer\n    resourceExistenceCondition:\n      apiVersion: apiextensions.k8s.io/v1\n      kind: CustomResourceDefinition\n      name: clusterissuers.cert-manager.io\n  - name: issuer\n    resourceExistenceCondition:\n      apiVersion: apiextensions.k8s.io/v1\n      kind: CustomResourceDefinition\n      name: issuers.cert-manager.io\n  - name: order\n    resourceExistenceCondition:\n      apiVersion: apiextensions.k8s.io/v1\n      kind: CustomResourceDefinition\n      name: orders.acme.cert-manager.io\n  serviceAccountRef:\n    name: crd-read-sa\n    namespace: default\n```\n\n### Readiness Definition\n\nIn this example, let's define three readiness definitions namely `dev`, `canary` and `prod` as shown below.\n\n| Readiness Definition   |      Required Checks                                          |\n|------------------------|---------------------------------------------------------------|\n| dev                    | package-management                                            |\n| canary                 | package-management, secret-management                         |\n| prod                   | package-management, secret-management, certificate-management |\n\nThe manifests for the above readiness definitions are as follows\n\n```yaml\napiVersion: core.tanzu.vmware.com/v1alpha2\nkind: Readiness\nmetadata:\n  name: dev-class\nspec:\n  checks:\n  - name: com.org1.k8s.package-management\n    type: basic\n    category: Packaging  \n---\napiVersion: core.tanzu.vmware.com/v1alpha2\nkind: Readiness\nmetadata:\n  name: canary-class\nspec:\n  checks:\n  - name: com.org1.k8s.package-management\n    type: basic\n    category: Packaging\n  - name: com.org1.k8s.secret-management\n    type: basic\n    category: Security\n---\napiVersion: core.tanzu.vmware.com/v1alpha2\nkind: Readiness\nmetadata:\n  name: prod-class\nspec:\n  checks:\n  - name: com.org1.k8s.certificate-management\n    type: basic\n    category: Security\n  - name: com.org1.k8s.package-management\n    type: basic\n    category: Packaging\n  - name: com.org1.k8s.secret-management\n    type: basic\n    category: Security\n```\n\nLet's add the given manifests to the kubernetes cluster.\n\n### Install packages\n\nBefore proceeding further into the demo, let's check the status of each of the resources that we have created.\n\n```bash\nshell> kubectl get readiness,readinessprovider\nNAME                                           READY   AGE\nreadiness.core.tanzu.vmware.com/canary-class   false   45s\nreadiness.core.tanzu.vmware.com/dev-class      false   45s\nreadiness.core.tanzu.vmware.com/prod-class     false   45s\n\nNAME                                                      STATE     AGE\nreadinessprovider.core.tanzu.vmware.com/cert-manager      failure   63s\nreadinessprovider.core.tanzu.vmware.com/kapp-controller   failure   104s\nreadinessprovider.core.tanzu.vmware.com/secretgen         failure   77s\n```\n\nWe can see all the providers are in failure state and all the readiness definition are not ready.\n\n#### Install kapp-controller\n\nInstall kapp-controller into the cluster by running the following command.\n\n```bash\nkubectl apply -f https://github.com/vmware-tanzu/carvel-kapp-controller/releases/latest/download/release.yml\n```\n\nFew minutes after installation, query the readiness resources. We can see the kapp-controller transitioned to success state and the dev-class is set to ready.\n\n```bash\nshell> kubectl get readiness,readinessprovider\nNAME                                           READY   AGE\nreadiness.core.tanzu.vmware.com/canary-class   false   5m26s\nreadiness.core.tanzu.vmware.com/dev-class      true    5m26s\nreadiness.core.tanzu.vmware.com/prod-class     false   5m26s\n\nNAME                                                      STATE     AGE\nreadinessprovider.core.tanzu.vmware.com/cert-manager      failure   5m44s\nreadinessprovider.core.tanzu.vmware.com/kapp-controller   success   6m25s\nreadinessprovider.core.tanzu.vmware.com/secretgen         failure   5m58s\n```\n\n#### Install secrentgen-controller\n\nInstall secretgen-controller into the cluster using the following command.\n\n```bash\nkubectl apply -f https://github.com/carvel-dev/secretgen-controller/releases/latest/download/release.yml\n```\n\nAfter few minutes, we can see the secretgen provider in success state and the canary class (in addition to dev class) is marked as ready.\n\n```bash\nshell> kubectl get readiness,readinessprovider\nNAME                                           READY   AGE\nreadiness.core.tanzu.vmware.com/canary-class   true    9m33s\nreadiness.core.tanzu.vmware.com/dev-class      true    9m33s\nreadiness.core.tanzu.vmware.com/prod-class     false   9m33s\n\nNAME                                                      STATE     AGE\nreadinessprovider.core.tanzu.vmware.com/cert-manager      failure   9m51s\nreadinessprovider.core.tanzu.vmware.com/kapp-controller   success   10m\nreadinessprovider.core.tanzu.vmware.com/secretgen         success   10m\n```\n\n#### Install cert-manager\n\nInstall cert-manager using the following command.\n\n```bash\nkubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.11.0/cert-manager.yaml\n```\n\nIn few minutes, we can see all the providers in success state and all the readiness definitions in ready state.\n\n```bash\nshell> kubectl get readiness,readinessprovider\nNAME                                           READY   AGE\nreadiness.core.tanzu.vmware.com/canary-class   true    11m\nreadiness.core.tanzu.vmware.com/dev-class      true    11m\nreadiness.core.tanzu.vmware.com/prod-class     true    11m\n\nNAME                                                      STATE     AGE\nreadinessprovider.core.tanzu.vmware.com/cert-manager      success   11m\nreadinessprovider.core.tanzu.vmware.com/kapp-controller   success   12m\nreadinessprovider.core.tanzu.vmware.com/secretgen         success   12m\n```\n"
  },
  {
    "path": "docs/runtime-core/readiness-framework.md",
    "content": "# Readiness Framework\n\nThe readiness framework provides functionality to define and evaluate k8s clusters for suitability of running enterprise workloads.\n\n## Key Concepts\n\n* **Readiness**: Readiness of a cluster is a measure of whether that cluster can make that set of capabilities available to application workloads running on that cluster. These capabilities can be related to areas like security, compliance, scalability and resiliency.\n* **ReadinessChecks**: A Readiness definition constitutes one or more Readiness Checks. Each check relies on availablility of atleast one **active** ReadinessProviders for fulfilment.\n* **ReadinessProviders**: The Readiness Provider defines the set of checks that it fulfills along with the conditions that should be evaluated to true.\n* **ReadinessProviderConditions**:  The Readiness Condition is one of the basic building blocks of the Readiness definition. It can convert the state of the cluster to a boolean value.\n\n## Readiness API\n\nThe Readiness API allows users to define cluster evaluation criterion as a set of readiness checks. For a readiness resource to be \"ready\", all the constituent checks must be fulfilled.\n\nReadiness checks can be of 2 types:\n\n1. Basic: These checks rely on the state of cluster for their fulfillment.\n2. Composite: These checks rely on a group of other basic checks for their fulfilment.\n\n### Example\n\nThe following manifest defines a Readiness resource with two checks.\nThese checks are required to be satisfied by atleast one **active** ReadinessProvider (See [ReadinessProvider Example](#example-1)), so that `my-org-baseline` can be evaluated to ready.\n\n```yaml\n---\napiVersion: core.tanzu.vmware.com/v1alpha2\nkind: Readiness\nmetadata:\n  name: my-org-baseline\nspec:\n  checks:\n    - category: Security\n      name: com.vmware.tanzu.certificate-management\n      type: basic\n    - category: Packaging\n      name: com.vmware.tanzu.package-management\n      type: basic\n```\n\n## ReadinessProvider API\n\nThe ReadinessProvider API allows users to define a set of conditions. These conditions map the state of the cluster to a boolean value. A logical AND of all the ReadinessProviderConditions determines whether the ReadinessProvider is active.\n\n### Example\n\nThe below manifest creates two ReadinessProvider resources which will evaluate if `cert-manager` and `kapp-controller` are available in the cluster. The providers also specify `checkRefs` which will aid in making the `my-org-baseline` Readiness resource **_ready_**.\n\n```yaml\n---\napiVersion: core.tanzu.vmware.com/v1alpha2\nkind: ReadinessProvider\nmetadata:\n  name: cert-manager-provider\nspec:\n  checkRefs:\n    - com.vmware.tanzu.certificate-management # This is the reference to check name defined in one of the readiness resources\n  conditions:\n    - name: certificate-crd\n      resourceExistenceCondition:\n        apiVersion: apiextensions.k8s.io/v1\n        kind: CustomResourceDefinition\n        name: certificates.cert-manager.io\n\n---\napiVersion: core.tanzu.vmware.com/v1alpha2\nkind: ReadinessProvider\nmetadata:\n  name: kapp-provider\nspec:\n  checkRefs:\n    - com.vmware.tanzu.package-management\n  conditions:\n    - name: kapp-controller-deployment\n      resourceExistenceCondition: # Namespaced resource\n        apiVersion: apps/v1\n        kind: Deployment\n        name: kapp-controller\n        namespace: kapp-controller\n    - name: kapp-crd\n      resourceExistenceCondition: # Clustered resource\n        apiVersion: apiextensions.k8s.io/v1\n        kind: CustomResourceDefinition\n        name: apps.kappctrl.k14s.io\n```\n"
  },
  {
    "path": "docs/runtime-core/tanzu-core-controllers.md",
    "content": "# Tanzu Framework Controllers Using Kubebuilder\n\n## Table of Contents\n\n* [Summary](#summary)\n* [Goals](#goals)\n* [Non Goals](#non-goals)\n* [Building Framework Controllers](#building-Framework-controllers)\n  * [Create a new API and Controller](#create-a-new-api-and-controller)\n  * [Change API and Controller](#change-api-and-controller)\n  * [Generate Deepcopy Functions and Manifests](#generate-deepcopy-functions-and-manifests)\n* [Advanced Use Cases With Builder](#advanced-use-cases-with-builder)\n  * [Watching and Owning Multiple Resource Types](#watching-and-owning-multiple-resource-types)\n  * [Event Filtering with Predicates](#event-filtering-with-predicates)\n* [Writing Conversion Webhooks](#writing-conversion-webhooks)\n  * [Choosing the Hub Version](#choosing-the-hub-version)\n  * [Conversion Round Trip-ability](#conversion-round-trip-ability)\n  * [Storage Version Migration](#storage-version-migration)\n* [Best Practices](#best-practices)\n  * [CRD Changes](#crd-changes)\n  * [Validation and Defaulting](#validation-and-defaulting)\n  * [Requeue and Rate Limiting](#requeue-and-rate-limiting)\n  * [Logging](#logging)\n  * [Metrics](#metrics)\n  * [Events](#events)\n  * [Status Conditions](#status-conditions)\n  * [OwnerReference](#ownerreference)\n  * [Finalizers for Deletion](#finalizers-for-deletion)\n* [References](#references)\n\n## Summary\n\nThis document provides guidance for controller development in `vmware-tanzu/tanzu-framework` repo using Kubebuilder and\noutlines some best practices.\n\n## Goals\n\n* Standardize Framework controller development using Kubebuilder.\n* Provide guidance on how to get started with writing new controllers.\n* Provide best practices for controller development and webhook conversion.\n\n## Non Goals\n\n* Provide guidance on resource naming and versioning.\n\n## Building Framework Controllers\n\nThe `tanzu-framework` repo is already set up for using Kubebuilder with the domain `tanzu.vmware.com`, which means all the resources\ncreated in `tanzu-framework` will end with `tanzu.vmware.com` in its API group.\n\n### Create a new API and Controller\n\nTo create a new API and controller with Kubebuilder, do the following:\n\n```shell\n$ kubebuilder create api --group foo --version v1alpha1 --kind Bar\nCreate Resource [y/n]\ny\nCreate Controller [y/n]\ny\nWriting scaffold for you to edit...\napis/foo/v1alpha1/bar_types.go\ncontrollers/foo/bar_controller.go\n```\n\n### Change API and Controller\n\nAPI changes go in the file `apis/foo/v1alpha1/bar_types.go`, where the kind `Bar` is defined. Typically, each kind has\na `spec` and a `status`. The `spec` specifies the desired state of an object and `status` represents the observed state\nof the object by the controller.\n\nController changes go in the file `controllers/foo/bar_controller.go`. This is where the reconciliation of the desired\nstate of the object happens, so this is the place where most of the business logic is written.\n\n### Generate Deepcopy Functions and Manifests\n\nEvery custom resource (and builtin) object in Kubernetes implements\nthe [`runtime.Object`](https://pkg.go.dev/k8s.io/apimachinery@v0.20.5/pkg/runtime#Object) interface. A requirement for\nimplementing the interface is to implement the `DeepCopyObject()` method, which defines how to make a deep copy of the\nobject. To avoid API authors hand-writing deep copy functions, Kubernetes and controller-runtime provide utilities for\nautomatically generating deep copy functions.\n\nTo generate deep copy functions for the API, do the following:\n\n```shell\n$ make generate\n~/go/bin/controller-gen object:headerFile=\"hack/boilerplate.go.txt\",year=2021 paths=\"./...\"\n```\n\nThis results in a deep copy file called `apis/foo/v1alpha1/zz_generated.deepcopy.go`.\n\nKubebuilder can also generate Kustomize manifests for deploying the controller(s) on a Kubernetes cluster.\n\nTo generate manifests for the controller, do:\n\n```shell\n$ make manifests\n~/go/bin/controller-gen \\\n\"crd\" \\\npaths=./apis/... \\\noutput:crd:artifacts:config=config/crd/bases\n```\n\nNote that deepcopy functions and manifests need to be generated every time there is a change to the API or markers.\n\n## Advanced Use Cases With Builder\n\n### Watching and Owning Multiple Resource Types\n\nThe [`Builder`](https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.8.3/pkg/builder#Builder) pattern allows the\ncontroller to watch or own multiple resource types. This flexibility allows the controller to manage lifecycle of a\ndifferent resource or respond to events of arbitrary resources. For example, the `ReplicaSet` controller creates and\nwatches `Pod` objects. When the `Pod` objects change, it can trigger a reconcile to the parent `ReplicaSet` object.\n\n`Builder` functions allow controller authors to setup watches for different resource types and respond to changes.\n\nThis example from cluster-api (CAPI) illustrates that the MachineSet controller responds to both events of\n`clusterv1.MachineSet` resource and the `clusterv1.Machine` resources it owns. The map function allows you to map which\n`clusterv1.MachineSet` custom resource is reconciled when a particular `clusterv1.Machine` resource is updated.\n\n```go\nc, err := ctrl.NewControllerManagedBy(mgr).\n    For(&clusterv1.MachineSet{}).\n    Owns(&clusterv1.Machine{}).\n    Watches(\n        &source.Kind{Type: &clusterv1.Machine{}},\n        &handler.EnqueueRequestsFromMapFunc{ToRequests: handler.ToRequestsFunc(r.MachineToMachineSets)},\n    ).\n    WithOptions(options).\n    WithEventFilter(predicates.ResourceNotPaused(r.Log)).\n    Build(r)\n```\n\n### Event Filtering with Predicates\n\nWith predicates, you can filter events that result in a reconcile. For example, the following code illustrates filtering\nout events that don’t result in resource version changes for the Bar custom resource.\n\n```go\nfunc (r *BarReconciler) SetupWithManager(mgr ctrl.Manager) error {\n    return ctrl.NewControllerManagedBy(mgr).\n            For(&foov1alpha1.Bar{}).\n            WithEventFilter(predicate.ResourceVersionChangedPredicate{}).\n            Complete(r)\n}\n```\n\n## Writing Conversion Webhooks\n\nTo handle API version changes, Kubebuilder provides a way to\nscaffold [conversion webhooks](https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definition-versioning/#webhook-conversion)\nto convert custom resources between API versions. To cut down on the number of permutations of conversions between\ndifferent versions, controller-runtime employs a “hub and spoke” model. One version is designated as the “hub” (by\nimplementing the Hub interface) and all the other versions define conversions to and from the “hub”.\n\nNote that regardless of multiple versions of an API, only one version is ever stored in API server/etcd and that is\ncalled the “storage version” of the resource.\n\n### Choosing the Hub Version\n\nKubebuilder docs provide an example of a multi-version API going from v1 -> v2 -> v3, where v1 is designated as the hub\nversion. This means your controller is likely operating on v1 objects i.e. doing a GET for the v1 version of resource\nwhere the webhook may be converting to v1 if the storage version is different and using v1 imports in the code.\n\nIn practice, API authors might not want to designate an old version as the hub. This is because when introducing newer\nversions, features are added via new fields to the custom resource and the controller is updated to handle new features.\nConverting to and operating on an old version might mean losing or discarding new information.\n\nDepending on what your controller does, care must be taken when designating a hub version. In most cases, it’s better to\ndesignate the newest version you are introducing as the hub and update your controller imports to work on the newest\nversion of the custom resource. The downside is that this will result in more changes to the conversion functions.\n\n### Conversion Round Trip-ability\n\nIn Kubernetes, all versions of a resource must be round trippable through each other with no information loss. In other\nwords, conversions should not result in losing any field’s value on a round trip.\n\nThis gets into unwieldy territory when there are new fields added in a new API version and the old versions do not/need\nnot support these fields. This means when you convert a v2 resource with new fields to v1 and convert back to v2, you\ncould lose information about the new fields since v1 would not know about them. The common solution for this scenario is\nto adjust the v2 -> v1 conversion functions to carry those fields as annotations on the v1 resource and set those fields\nin v2 objects using the annotations in the v1 -> v2 conversion functions.\n\nTo make writing conversions easier, Kubernetes provides a handy tool\ncalled [`conversion-gen`](https://pkg.go.dev/k8s.io/code-generator/cmd/conversion-gen) for auto-generating conversion\nfunctions for structs and fields that have the same name across two versions of the resource. Cluster API provides a\nnice [example](https://github.com/kubernetes-sigs/cluster-api/blob/102c753ec14c3f6ebfbce7084e1176eb62e6d80d/Makefile#L261)\nof using conversion-gen to generate conversion functions.\n\n### Storage Version Migration\n\nThere is only one storage version for a resource in Kubernetes. In Kubebuilder, the storage version can be set using the\n`//+kubebuilder:storageversion` marker. When the storage version changes for a resource, existing objects in etcd are\nnot automatically converted to the new storage version. But newly created or updated objects are written at the new\nstorage version.\n\nWhen you are deprecating and dropping an old version, you will need to make sure there are no objects stored in that\nversion.\nUpstream [docs](https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definition-versioning/#upgrade-existing-objects-to-a-new-stored-version)\noffer a couple of options to handle that migration. But in most cases, when you upgrade a controller which works\nexclusively on the newest API version (as mentioned in the “hub” section and assuming the new version is also set as the\nstorage version), the objects will be automatically converted when the new controller comes up, lists all existing\nobjects as part of “list and watch” and writes it back at the new storage version using the conversion functions you’ve\nwritten. That is, the controller asks for objects in the new version, the webhook converts all objects to the new\nversion, and the controller writes it back to the new version which is also the storage version now.\n\nAlso note that when you no longer want to support an API version, you can use the `//+kubebuilder:unservedversion`\nmarker to not serve that version i.e. you will get an error if you try to GET or POST an object with that version.\n\n## Best Practices\n\n### CRD Changes\n\n* Changing CRD properties (short names, categories, print columns etc) must be done via\n  Kubebuilder [markers](https://book.kubebuilder.io/reference/markers/crd.html) and never by hand. Always consider\n  backward compatibility and user experience when changing properties.\n\n### Validation and Defaulting\n\n* API authors should add [validation markers](https://book.kubebuilder.io/reference/markers/crd-validation.html) for\n  fields wherever applicable, so it’s reflected in the generated OpenAPI schema. Kubebuilder markers provide basic\n  validation such as required, max, min, enum etc.\n* In addition to OpenAPI schema\n  validation, [validation webhooks](https://kubebuilder.io/cronjob-tutorial/webhook-implementation.html) should be\n  written for APIs for fields that cannot be easily validated by the markers. Example: Is this subnet CIDR field valid?\n  Are these two fields mutually exclusive?\n* For optional fields, sane defaults must be provided\n  via [defaulting webhooks](https://kubebuilder.io/cronjob-tutorial/webhook-implementation.html) wherever applicable.\n* Note that validation and defaulting webhooks should only be defined for the “hub” version. This also means that if a\n  new version v2 is added, the webhooks should be moved to the v2 package and updated to work on the v2 type.\n\n### Requeue and Rate Limiting\n\n* Use `RequeueAfter` when\n  returning [`ctrl.Result`](https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.8.3/pkg/reconcile#Result) from your\n  reconcile function for requests you don’t need to be requeued immediately.\n* Decide if you want to reconcile periodically or only when an object changes. For controllers that are managing\n  external resources, it might make sense to reconcile periodically to account for out-of-band changes to external\n  resources (example: VM is deleted and needs to be recreated). You can use `RequeueAfter` to manage this behavior.\n* The default workqueue rate limiter used for controlling rate of reconcile for a custom resource may not be appropriate\n  for all use cases. Depending on what the controller is doing, the default exponential backoff time may be too low (\n  resulting in a lot of quick reconciles which might overload an external API that’s being called) or too high (large\n  delays between reconciles that cause not to react to an external object’s changes).\n\nIn such cases, you can use a different workqueue rate limiter.\nClient-go [provides](https://github.com/kubernetes/client-go/blob/master/util/workqueue/default_rate_limiters.go) some\nrate limiters for use. But if you need a more specific rate limiting behavior, you can write your own by implementing\nthe [`Ratelimiter`](https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.8.3/pkg/ratelimiter#RateLimiter)\ninterface and passing it as an [option](https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.8.3/pkg/controller#Options)\nto your controller. For example:\n\n```go\nfunc (r *BarReconciler) SetupWithManager(mgr ctrl.Manager) error {\n    return ctrl.NewControllerManagedBy(mgr).\n            For(&foov1alpha1.Bar{}).\n            WithOptions(controller.Options{\n                RateLimiter: workqueue.DefaultItemBasedRateLimiter(),\n            }).\n            Complete(r)\n}\n```\n\n### Logging\n\n* Use structured logging.\n* Controller-runtime expects a [logr](https://github.com/go-logr/logr) logger implementation and provides helpers to set\n  zap as a logr backend in [`pkg/log`](https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.8.3/pkg/log/zap).\n\n### Metrics\n\n* By default,\n  controller-runtime [publishes](https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.8.3/pkg/metrics#pkg-constants)\n  some performance metrics for each controller and exposes a prometheus metrics\n  server.\n* Controller authors can also publish relevant additional metrics using\n  the [`pkg/metrics`](https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.8.3/pkg/metrics) package.\n\n### Events\n\n* Controller-runtime makes an `EventRecorder` available to emit events from within the controller.\n* Events are useful for observability when users do a `kubectl describe` on a resource. Controller authors can create\n  important events in the reconcile loop (such as VM created/deleted), including warnings that provide easier to digest\n  information than users digging through logs.\n\n### Status Conditions\n\n* Use status [conditions](https://dev.to/maelvls/what-the-heck-are-kubernetes-conditions-for-4je7) to indicate readiness\n  status of the resource that is being reconciled. Conditions provide a good user experience for knowing the status of a\n  resource.\n\n### OwnerReference\n\n* If you are creating resources owned by the main resource from within the controller and if you need the owned resource\n  to be deleted when the main resource is deleted, you will need to set an owner reference using\n  the [`ctrl.SetControllerReference`](https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.8.3/pkg/controller/controllerutil#SetControllerReference)\n  function.\n\n### Finalizers for Deletion\n\n* Finalizers let controllers run pre-delete hooks. Any controller which creates and manages external resources must add\n  finalizer(s) and must clean up the external resources before the custom resource is deleted to avoid leakage.\n* A custom resource with a finalizer set will not be immediately deleted. Instead, it’s DeletionTimestamp is set. The\n  controller can check if the operation was a DELETE by checking if `bar.ObjectMeta.DeletionTimestamp.IsZero()`\n  is `false`.\n* Finalizers must have a meaningful name with the group version appended to avoid collisions since they are just a\n  string slice attached to the custom resource object. Example: `virtualmachine.finalizers.foo.tanzu.vmware.com`.\n\n## References\n\n1. [controller-runtime FAQ](https://github.com/kubernetes-sigs/controller-runtime/blob/master/FAQ.md)\n1. [Kubebuilder book](https://book.kubebuilder.io)\n1. [Kubernetes API conventions](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md)\n"
  },
  {
    "path": "docs/style-guide.md",
    "content": "# Documentation Style Guide\n\n## Table of Contents\n\n* [Content best practices](#content-best-practices)\n  * [Use present tense](#use-present-tense)\n  * [Use active voice](#use-active-voice)\n  * [Use simple and direct language](#use-simple-and-direct-language)\n  * [Address the reader as \"you\"](#address-the-reader-as-you)\n  * [Avoid Latin phrases](#avoid-latin-phrases)\n* [Patterns to avoid](#patterns-to-avoid)\n  * [Avoid using \"we\"](#avoid-using-we)\n  * [Avoid jargon and idioms](#avoid-jargon-and-idioms)\n  * [Avoid statements about the future or that will soon be out of date](#avoid-statements-about-the-future-or-that-will-soon-be-out-of-date)\n  * [Language](#language)\n* [Documentation formatting standards](#documentation-formatting-standards)\n  * [Use camel case for API objects](#use-camel-case-for-api-objects)\n  * [Use angle brackets for placeholders](#use-angle-brackets-for-placeholders)\n  * [Use bold for user interface elements](#use-bold-for-user-interface-elements)\n  * [Use italics to define or introduce new terms](#use-italics-to-define-or-introduce-new-terms)\n  * [Use code style for filenames, directories, paths, object field names and namespaces](#use-code-style-for-filenames-directories-paths-object-field-names-and-namespaces)\n  * [Use punctuation inside quotes](#use-punctuation-inside-quotes)\n* [Inline code formatting](#inline-code-formatting)\n  * [Use code style for inline code and commands](#use-code-style-for-inline-code-and-commands)\n  * [Starting a sentence with a component tool or component name](#starting-a-sentence-with-a-component-tool-or-component-name)\n  * [Use normal style for string and integer field values](#use-normal-style-for-string-and-integer-field-values)\n* [Code snippet formatting](#code-snippet-formatting)\n  * [Don't include the command prompt](#dont-include-the-command-prompt)\n  * [Separate commands from output](#separate-commands-from-output)\n* [Tanzu word list](#tanzu-word-list)\n* [Markdown elements](#markdown-elements)\n  * [Headings](#headings)\n  * [Paragraphs](#paragraphs)\n  * [Links](#links)\n  * [Lists](#lists)\n  * [Tables](#tables)\n\n_This style guide is adapted from the [Kubernetes documentation style guide](https://kubernetes.io/docs/contribute/style/style-guide/)._\n\nThis page outlines writing style guidelines for documentation related to this repo. Use this guide as a reference when\nwriting documents. Note that these are guidelines, not rules. Use your best judgement when writing and feel free to\npropose changes to these guidelines by creating PRs.\n\n## Content best practices\n\n### Use present tense\n\n|Do|Don't|\n|--- |--- |\n|This `command` starts a proxy.|This command will start a proxy.|\n\nException: Use future or past tense if it is required to convey the correct meaning.\n\n### Use active voice\n\n|Do|Don't|\n|--- |--- |\n|You can explore the API using a browser.|The API can be explored using a browser.|\n|The YAML file specifies the replica count.|The replica count is specified in the YAML file.|\n\nException: Use passive voice if active voice leads to an awkward sentence construction.\n\n### Use simple and direct language\n\nUse simple and direct language. Avoid using unnecessary phrases, such as saying \"please.\"\n\n|Do|Don't|\n|--- |--- |\n|To create a ReplicaSet, ...|In order to create a ReplicaSet, ...|\n|See the configuration file.|Please see the configuration file.|\n|View the Pods.|With this next command, we'll view the Pods.|\n\n### Address the reader as \"you\"\n\n|Do|Don't|\n|--- |--- |\n|You can create a Deployment by ...|We'll create a Deployment by ...|\n|In the preceding output, you can see...|In the preceding output, we can see ...|\n\n### Avoid Latin phrases\n\nPrefer English terms over Latin abbreviations.\n\n|Do|Don't|\n|--- |--- |\n|For example, ...|e.g., ...|\n|That is, ...|i.e., ...|\n\nException: Use \"etc.\" for et cetera.\n\n## Patterns to avoid\n\n### Avoid using \"we\"\n\nUsing \"we\" in a sentence can be confusing, because the reader might not know\nwhether they're part of the \"we\" you're describing.\n\n|Do|Don't|\n|--- |--- |\n|Version 1.4 includes ...|In version 1.4, we have added ...|\n|Kubernetes provides a new feature for ...|We provide a new feature ...|\n|This page teaches you how to use Pods.|In this page, we are going to learn about Pods.|\n\n### Avoid jargon and idioms\n\nMany readers speak English as a second language. Avoid jargon and idioms to help them understand better.\n\n|Do|Don't|\n|--- |--- |\n|Internally, ...|Under the hood, ...|\n|Create a new cluster.|Turn up a new cluster.|\n\n### Avoid statements about the future or that will soon be out of date\n\nAvoid making promises or giving hints about the future. If you need to talk about\na beta feature, put the text under a heading that identifies it as beta\ninformation.\n\nAlso avoid words like “recently”, \"currently\" and \"new.\" A feature that is new today might not be\nconsidered new in a few months.\n\n|Do|Don't|\n|--- |--- |\n|In version 1.4, ...|In the current version, ...|\n|The Federation feature provides ...|The new Federation feature provides ...|\n\n### Language\n\nThis documentation uses U.S. English spelling and grammar.\n\n## Documentation formatting standards\n\n### Use camel case for API objects\n\nWhen you refer to an API object, use the same uppercase and lowercase letters\nthat are used in the actual object name. Typically, the names of API\nobjects use\n[camel case](https://en.wikipedia.org/wiki/Camel_case).\n\nDon't split the API object name into separate words. For example, use\nPodTemplateList, not Pod Template List.\n\nRefer to API objects without saying \"object,\" unless omitting \"object\"\nleads to an awkward sentence construction.\n\n|Do|Don't|\n|--- |--- |\n|The Pod has two containers.|The pod has two containers.|\n|The Deployment is responsible for ...|The Deployment object is responsible for ...|\n|A PodList is a list of Pods.|A Pod List is a list of pods.|\n|The two ContainerPorts ...|The two ContainerPort objects ...|\n|The two ContainerStateTerminated objects ...|The two ContainerStateTerminateds ...|\n\n### Use angle brackets for placeholders\n\nUse angle brackets for placeholders. Tell the reader what a placeholder represents.\n\n1. Display information about a Pod:\n\n```sh\nkubectl describe pod <pod-name> -n <namespace>\n```\n\nIf the pod is in the default namespace, you can omit the '-n' parameter.\n\n### Use bold for user interface elements\n\n|Do|Don't|\n|--- |--- |\n|Click **Fork**.|Click \"Fork\".|\n|Select **Other**.|Select \"Other\".|\n\n### Use italics to define or introduce new terms\n\n|Do|Don't|\n|--- |--- |\n|A _cluster_ is a set of nodes ...|A \"cluster\" is a set of nodes ...|\n|These components form the _control plane_.|These components form the **control plane**.|\n\n### Use code style for filenames, directories, paths, object field names and namespaces\n\n|Do|Don't|\n|--- |--- |\n|Open the `envars.yaml` file.|Open the envars.yaml file.|\n|Go to the `/docs/tutorials` directory.|Go to the /docs/tutorials directory.|\n|Open the `/_data/concepts.yaml` file.|Open the /\\_data/concepts.yaml file.|\n\n### Use punctuation inside quotes\n\n|Do|Don't|\n|--- |--- |\n|events are recorded with an associated \"stage.\"|events are recorded with an associated \"stage\".|\n|The copy is called a \"fork.\"|The copy is called a \"fork\".|\n\nException: When the quoted word is a user input.\n\nExample:\n\n* My user ID is “IM47g”.\n* Did you try the password “mycatisawesome”?\n\n## Inline code formatting\n\n### Use code style for inline code and commands\n\nFor inline code in an HTML document, use the `<code>` tag. In a Markdown\ndocument, use the backtick (`` ` ``).\n\n|Do|Don't|\n|--- |--- |\n|The `kubectl run` command creates a Deployment.|The \"kubectl run\" command creates a Deployment.|\n|For declarative management, use `kubectl apply`.|For declarative management, use \"kubectl apply\".|\n|Use single backticks to enclose inline code. For example, `var example = true`.|Use two asterisks (`**`) or an underscore (`_`) to enclose inline code. For example, **var example = true**.|\n|Use triple backticks (\\`\\`\\`) before and after a multi-line block of code for fenced code blocks.|Use multi-line blocks of code to create diagrams, flowcharts, or other illustrations.|\n|Use meaningful variable names that have a context.|Use variable names such as 'foo','bar', and 'baz' that are not meaningful and lack context.|\n|Remove trailing spaces in the code.|Add trailing spaces in the code, where these are important, because a screen reader will read out the spaces as well.|\n\n### Starting a sentence with a component tool or component name\n\n|Do|Don't|\n|--- |--- |\n|The `kubeadm` tool bootstraps and provisions machines in a cluster.|`kubeadm` tool bootstraps and provisions machines in a cluster.|\n|The kube-scheduler is the default scheduler for Kubernetes.|kube-scheduler is the default scheduler for Kubernetes.|\n\n### Use normal style for string and integer field values\n\nFor field values of type string or integer, use normal style without quotation marks.\n\n|Do|Don't|\n|--- |--- |\n|Set the value of `imagePullPolicy` to `Always`.|Set the value of `imagePullPolicy` to \"Always\".|\n|Set the value of `image` to `nginx:1.16`.|Set the value of `image` to nginx:1.16.|\n|Set the value of the `replicas` field to `2`.|Set the value of the `replicas` field to 2.|\n\n## Code snippet formatting\n\n### Don't include the command prompt\n\n|Do|Don't|\n|--- |--- |\n|kubectl get pods|$ kubectl get pods|\n\n### Separate commands from output\n\nVerify that the Pod is running on your chosen node:\n\n```sh\nkubectl get pods --output=wide\n```\n\nThe output is similar to this:\n\n```sh\nNAME     READY     STATUS    RESTARTS   AGE    IP           NODE\nnginx    1/1       Running   0          13s    10.200.0.4   worker0\n```\n\n## Tanzu word list\n\nA list of Tanzu-specific terms and words to be used consistently across the repo.\n\n|Term|Usage|\n|--- |--- |\n|Kubernetes|Kubernetes should always be capitalized.|\n|Docker|Docker should always be capitalized.|\n|Tanzu|Tanzu should always be capitalized.|\n|Tanzu Kubernetes Grid|Tanzu Kubernetes Grid should always be capitalized.|\n|TKG|TKG should always be capitalized.|\n|CLI|CLI should always be capitalized.|\n|VMware|VMware should always be correctly capitalized.|\n|On-premises|On-premises or on-prem rather than on-premise or other variations.|\n|Plugin|Plugin rather than plug-in or other variations.|\n\n## Markdown elements\n\nIn addition to the guidelines below, we check markdown syntax structure using\nthe markdownlint tool. Local validation can be done by running:\n\n```sh\nmake doc-lint\n```\n\nAdditional information about any errors can be found in the\n[markdownlint rules](https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md)\nby searching for the `MD0xx` error code provided with the error output.\n\n### Headings\n\nPeople accessing this documentation may use a screen reader or other assistive technology (AT). [Screen readers](https://en.wikipedia.org/wiki/Screen_reader) are linear output devices, they output items on a page one at a time. If there is a lot of content on a page, you can use headings to give the page an internal structure. A good page structure helps all readers to easily navigate the page or filter topics of interest.\n\n|Do|Don't|\n|--- |--- |\n|Include a title on each page or blog post.|Include more than one title headings (#) in a page.|\n|Use ordered headings to provide a meaningful high-level outline of your content.|Use headings level 4 through 6, unless it is absolutely necessary. If your content is that detailed, it may need to be broken into separate articles.|\n|Use sentence case for headings. For example, **Extend kubectl with plugins**|Use title case for headings. For example, **Extend Kubectl With Plugins**|\n\n### Paragraphs\n\n|Do|Don't|\n|--- |--- |\n|Try to keep paragraphs under 6 sentences.|Write long-winded paragraphs.|\n|Use three hyphens (`---`) to create a horizontal rule for breaks in paragraph content.|Use horizontal rules for decoration.|\n\n### Links\n\n|Do|Don't|\n|--- |--- |\n|Write hyperlinks that give you context for the content they link to. For example: Certain ports are open on your machines. See [check required ports](#check-required-ports) for more details.|Use ambiguous terms such as “click here”. For example: Certain ports are open on your machines. See [here](#check-required-ports) for more details.|\n|Write Markdown-style links: `[link text](URL)`. For example: `[TKG documentation](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/index.html)` and the output is  [TKG documentation](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/index.html).|Write HTML-style links: `Visit our tutorial!`|\n\n### Lists\n\nGroup items in a list that are related to each other and need to appear in a specific order or to indicate a correlation between multiple items. When a screen reader comes across a list—whether it is an ordered or unordered list—it will be announced to the user that there is a group of list items. The user can then use the arrow keys to move up and down between the various items in the list.\n\n* End each item in a list with a period if one or more items in the list are complete sentences. For the sake of consistency, normally either all items or none should be complete sentences.\n\n* Ordered lists that are part of an incomplete introductory sentence can be in lowercase and punctuated as if each item was a part of the introductory sentence.\n\n* Use the number one (`1.`) for ordered lists.\n\n* Use (`+`), (`*`), or (`-`) for unordered lists - be consistent within the same document.\n\n* Leave a blank line after each list.\n\n* Indent nested lists with four spaces (for example, ⋅⋅⋅⋅).\n\n* List items may consist of multiple paragraphs. Each subsequent paragraph in a list item must be indented by either four spaces or one tab.\n\n### Tables\n\nThe semantic purpose of a data table is to present tabular data. If you need to create a table, create the table in\nmarkdown.\n\n```sh\nParameter | Description | Default\n:---------|:------------|:-------\n`timeout` | The timeout for requests | `30s`\n`logLevel` | The log level for log output | `INFO`\n```\n"
  },
  {
    "path": "e2e.mk",
    "content": "# Copyright 2021 VMware, Inc. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\ncreate-kind-cluster:\n\tkind create cluster --name ${KIND_CLUSTER_NAME} --image \"kindest/node:${KUBE_VERSION}\"\n\nbuild-local-readiness: manifests package-vendir-sync\n\tCOMPONENTS=readiness/controller.readiness-controller-manager.readiness make docker-build-all\n\tdocker tag projects.registry.vmware.com/tanzu_framework/readiness-controller-manager:latest readiness-controller-manager:latest \n\ndeploy-local-readiness: build-local-readiness\t\n\tkind load docker-image readiness-controller-manager:latest --name ${KIND_CLUSTER_NAME}\n\tytt -f packages/readiness/bundle/config | kubectl apply -f-\n\ne2e-readiness:\n\tcd readiness/e2e && go test -timeout 10m -v github.com/vmware-tanzu/tanzu-framework/readiness/e2e\n\n\n\n"
  },
  {
    "path": "featuregates/client/go.mod",
    "content": "module github.com/vmware-tanzu/tanzu-framework/featuregates/client\n\ngo 1.19\n\nreplace (\n\tgithub.com/vmware-tanzu/tanzu-framework/apis/config => ../../apis/config\n\tgithub.com/vmware-tanzu/tanzu-framework/apis/core => ../../apis/core\n\tgithub.com/vmware-tanzu/tanzu-framework/util => ../../util\n)\n\nrequire (\n\tgithub.com/vmware-tanzu/tanzu-framework/apis/config v0.0.0-00010101000000-000000000000\n\tgithub.com/vmware-tanzu/tanzu-framework/apis/core v0.0.0-00010101000000-000000000000\n\tgithub.com/vmware-tanzu/tanzu-framework/util v0.0.0-00010101000000-000000000000\n\tgithub.com/vmware-tanzu/tanzu-plugin-runtime v0.80.0\n\tk8s.io/api v0.25.4\n\tk8s.io/apimachinery v0.25.4\n\tk8s.io/client-go v0.25.4\n\tsigs.k8s.io/controller-runtime v0.12.3\n)\n\nrequire (\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.1.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.1 // indirect\n\tgithub.com/emicklei/go-restful/v3 v3.9.0 // indirect\n\tgithub.com/evanphx/json-patch v5.6.0+incompatible // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/go-logr/logr v1.2.3 // indirect\n\tgithub.com/go-openapi/jsonpointer v0.19.5 // indirect\n\tgithub.com/go-openapi/jsonreference v0.20.0 // indirect\n\tgithub.com/go-openapi/swag v0.22.3 // indirect\n\tgithub.com/gogo/protobuf v1.3.2 // indirect\n\tgithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/gnostic v0.6.9 // indirect\n\tgithub.com/google/go-cmp v0.5.9 // indirect\n\tgithub.com/google/gofuzz v1.2.0 // indirect\n\tgithub.com/google/uuid v1.3.0 // indirect\n\tgithub.com/imdario/mergo v0.3.13 // indirect\n\tgithub.com/josharian/intern v1.0.0 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b // indirect\n\tgithub.com/kr/pretty v0.2.1 // indirect\n\tgithub.com/mailru/easyjson v0.7.7 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect\n\tgithub.com/onsi/ginkgo/v2 v2.8.4 // indirect\n\tgithub.com/pkg/errors v0.9.1 // indirect\n\tgithub.com/prometheus/client_golang v1.14.0 // indirect\n\tgithub.com/prometheus/client_model v0.3.0 // indirect\n\tgithub.com/prometheus/common v0.37.0 // indirect\n\tgithub.com/prometheus/procfs v0.8.0 // indirect\n\tgithub.com/spf13/pflag v1.0.5 // indirect\n\tgolang.org/x/net v0.8.0 // indirect\n\tgolang.org/x/oauth2 v0.3.0 // indirect\n\tgolang.org/x/sys v0.6.0 // indirect\n\tgolang.org/x/term v0.6.0 // indirect\n\tgolang.org/x/text v0.8.0 // indirect\n\tgolang.org/x/time v0.3.0 // indirect\n\tgomodules.xyz/jsonpatch/v2 v2.2.0 // indirect\n\tgoogle.golang.org/appengine v1.6.7 // indirect\n\tgoogle.golang.org/protobuf v1.28.1 // indirect\n\tgopkg.in/inf.v0 v0.9.1 // indirect\n\tgopkg.in/yaml.v2 v2.4.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tk8s.io/apiextensions-apiserver v0.25.4 // indirect\n\tk8s.io/component-base v0.25.4 // indirect\n\tk8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54 // indirect\n\tk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect\n\tk8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 // indirect\n\tsigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect\n\tsigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect\n\tsigs.k8s.io/yaml v1.3.0 // indirect\n)\n"
  },
  {
    "path": "featuregates/client/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=\ngithub.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE=\ngithub.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ=\ngithub.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U=\ngithub.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=\ngithub.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=\ngithub.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A=\ngithub.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=\ngithub.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA=\ngithub.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo=\ngithub.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=\ngithub.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=\ngithub.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0=\ngithub.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=\ngithub.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=\ngithub.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk=\ngithub.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg=\ngithub.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=\ngithub.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=\ngithub.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b h1:FQ7+9fxhyp82ks9vAuyPzG0/vVbWwMwLJ+P6yJI5FN8=\ngithub.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b/go.mod h1:HMcgvsgd0Fjj4XXDkbjdmlbI505rUPBs6WBMYg2pXks=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=\ngithub.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=\ngithub.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=\ngithub.com/onsi/ginkgo/v2 v2.8.4 h1:gf5mIQ8cLFieruNLAdgijHF1PYfLphKm2dxxcUtcqK0=\ngithub.com/onsi/ginkgo/v2 v2.8.4/go.mod h1:427dEDQZkDKsBvCjc2A/ZPefhKxsTTrsQegMlayL730=\ngithub.com/onsi/gomega v1.27.2 h1:SKU0CXeKE/WVgIV1T61kSa3+IRE8Ekrv9rdXDwwTqnY=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=\ngithub.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=\ngithub.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=\ngithub.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk=\ngithub.com/vmware-tanzu/tanzu-plugin-runtime v0.80.0 h1:lUoMXSpa/oH37UJnMY8WFEzjAOQHjcVlwsbxUbEcowg=\ngithub.com/vmware-tanzu/tanzu-plugin-runtime v0.80.0/go.mod h1:y70TLdev7MX8K6CkAA7h92qVUDyjbX8y9/J5q4UmhRs=\ngithub.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=\ngithub.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=\ngithub.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=\ngo.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=\ngo.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=\ngo.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=\ngo.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=\ngolang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8=\ngolang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw=\ngolang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=\ngolang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=\ngolang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY=\ngomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=\ngoogle.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=\ngoogle.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=\ngopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nk8s.io/api v0.25.4 h1:3YO8J4RtmG7elEgaWMb4HgmpS2CfY1QlaOz9nwB+ZSs=\nk8s.io/api v0.25.4/go.mod h1:IG2+RzyPQLllQxnhzD8KQNEu4c4YvyDTpSMztf4A0OQ=\nk8s.io/apiextensions-apiserver v0.25.4 h1:7hu9pF+xikxQuQZ7/30z/qxIPZc2J1lFElPtr7f+B6U=\nk8s.io/apiextensions-apiserver v0.25.4/go.mod h1:bkSGki5YBoZWdn5pWtNIdGvDrrsRWlmnvl9a+tAw5vQ=\nk8s.io/apimachinery v0.25.4 h1:CtXsuaitMESSu339tfhVXhQrPET+EiWnIY1rcurKnAc=\nk8s.io/apimachinery v0.25.4/go.mod h1:jaF9C/iPNM1FuLl7Zuy5b9v+n35HGSh6AQ4HYRkCqwo=\nk8s.io/client-go v0.25.4 h1:3RNRDffAkNU56M/a7gUfXaEzdhZlYhoW8dgViGy5fn8=\nk8s.io/client-go v0.25.4/go.mod h1:8trHCAC83XKY0wsBIpbirZU4NTUpbuhc2JnI7OruGZw=\nk8s.io/component-base v0.25.4 h1:n1bjg9Yt+G1C0WnIDJmg2fo6wbEU1UGMRiQSjmj7hNQ=\nk8s.io/component-base v0.25.4/go.mod h1:nnZJU8OP13PJEm6/p5V2ztgX2oyteIaAGKGMYb2L2cY=\nk8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54 h1:hWRbsoRWt44OEBnYUd4ceLy4ofBoh+p9vauWp/I5Gdg=\nk8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=\nk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s=\nk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4=\nk8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 h1:GfD9OzL11kvZN5iArC6oTS7RTj7oJOIfnislxYlqTj8=\nk8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio=\nsigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0=\nsigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k=\nsigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=\nsigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=\nsigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=\n"
  },
  {
    "path": "featuregates/client/pkg/featuregateclient/client.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage featuregateclient\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\tcorev1 \"k8s.io/api/core/v1\"\n\tapierrors \"k8s.io/apimachinery/pkg/api/errors\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"k8s.io/client-go/rest\"\n\t\"k8s.io/client-go/tools/clientcmd\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n\t\"github.com/vmware-tanzu/tanzu-plugin-runtime/config\"\n\t\"github.com/vmware-tanzu/tanzu-plugin-runtime/config/types\"\n)\n\n// FeatureGateClient defines methods to interact with FeatureGate resources\ntype FeatureGateClient struct {\n\tcrClient client.Client\n}\n\n// NewFeatureGateClient returns an instance of FeatureGateClient.\nfunc NewFeatureGateClient(options ...Option) (*FeatureGateClient, error) {\n\tfeatureGateClient := &FeatureGateClient{}\n\t// Apply options\n\tfor _, option := range options {\n\t\tfeatureGateClient = option(featureGateClient)\n\t}\n\tif featureGateClient.crClient == nil {\n\t\tc, err := getFeatureGateClient()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tfeatureGateClient.crClient = c\n\t}\n\treturn featureGateClient, nil\n}\n\n// Option is FeatureGateClient Option definition\ntype Option func(*FeatureGateClient) *FeatureGateClient\n\n// WithClient function is for setting the passed in client when creating FeatureGateClient\nfunc WithClient(cl client.Client) Option {\n\treturn func(featureGateClient *FeatureGateClient) *FeatureGateClient {\n\t\tfeatureGateClient.crClient = cl\n\t\treturn featureGateClient\n\t}\n}\n\n// getFeatureGateClient returns a new FeatureGate client\nfunc getFeatureGateClient() (client.Client, error) {\n\tvar err error\n\n\tscheme := runtime.NewScheme()\n\tif err := corev1alpha2.AddToScheme(scheme); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := corev1.AddToScheme(scheme); err != nil {\n\t\treturn nil, err\n\t}\n\n\trestConfig, err := getCurrentClusterConfig()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcrClient, err := client.New(restConfig, client.Options{Scheme: scheme})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"could not create cluster client: %w\", err)\n\t}\n\treturn crClient, nil\n}\n\n// GetFeatureGate fetches the specified FeatureGate resource.\nfunc (f *FeatureGateClient) GetFeatureGate(ctx context.Context, featureGateName string) (*corev1alpha2.FeatureGate, error) {\n\tgate := &corev1alpha2.FeatureGate{}\n\terr := f.crClient.Get(ctx, client.ObjectKey{Name: featureGateName}, gate)\n\tif err != nil {\n\t\tif apierrors.IsNotFound(err) {\n\t\t\treturn nil, ErrTypeNotFound\n\t\t}\n\t\treturn nil, fmt.Errorf(\"could not get featuregate %s: %w\", featureGateName, err)\n\t}\n\treturn gate, nil\n}\n\n// GetFeatureGateList fetches all featuregates on the cluster.\nfunc (f *FeatureGateClient) GetFeatureGateList(ctx context.Context) (*corev1alpha2.FeatureGateList, error) {\n\tgates := &corev1alpha2.FeatureGateList{}\n\terr := f.crClient.List(ctx, gates)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"could not get featuregates on cluster: %w\", err)\n\t}\n\treturn gates, nil\n}\n\n// GetFeature fetches the specified Feature resource.\nfunc (f *FeatureGateClient) GetFeature(ctx context.Context, featureName string) (*corev1alpha2.Feature, error) {\n\tfeature := &corev1alpha2.Feature{}\n\terr := f.crClient.Get(ctx, client.ObjectKey{Name: featureName}, feature)\n\tif err != nil {\n\t\tif apierrors.IsNotFound(err) {\n\t\t\treturn nil, ErrTypeNotFound\n\t\t}\n\t\treturn nil, err\n\t}\n\treturn feature, nil\n}\n\n// GetFeatureList fetches all features on the cluster.\nfunc (f *FeatureGateClient) GetFeatureList(ctx context.Context) (*corev1alpha2.FeatureList, error) {\n\tfeatures := &corev1alpha2.FeatureList{}\n\terr := f.crClient.List(ctx, features)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"could not get features on cluster: %w\", err)\n\t}\n\treturn features, nil\n}\n\n// ActivateFeature activates a Feature if it passes validation and warranty checks.\n// Warning: Before sending `true` via the warrantyVoidAllowed function argument, ensure\n// explicit user awareness and approval if activating a Feature will cause the support\n// warranty to be void. Once warranty is void, it is is permanent for the environment.\nfunc (f *FeatureGateClient) ActivateFeature(ctx context.Context, featureName string, warrantyVoidAllowed bool) error {\n\t// A Feature must exist in the cluster to be activated.\n\tfeature, err := f.GetFeature(ctx, featureName)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"could not get Feature %s: %w\", featureName, err)\n\t}\n\n\tgates, err := f.GetFeatureGateList(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"could not get FeatureGateList: %w\", err)\n\t}\n\n\tgateName, featRef := FeatureRefFromGateList(gates, featureName)\n\n\tif featRef.Activate {\n\t\tfmt.Printf(\"The Feature Reference %s is already set to be activated in FeatureGate %s.\\n\", featureName, gateName)\n\t\treturn nil\n\t}\n\n\tif err := validateFeatureActivationToggle(gates, feature); err != nil {\n\t\treturn err\n\t}\n\n\tgate, err := f.GetFeatureGate(ctx, gateName)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tok, err := setVoidWarrantyChecksPass(featRef, feature, warrantyVoidAllowed)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif ok {\n\t\tif err := f.setVoidWarranty(ctx, gate, feature.Name); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn f.setActivated(ctx, gate, featureName)\n}\n\n// FeatureRefFromGateList finds the requested Feature from a list of featuregates. If found,\n// the name of the FeatureGate and the FeatureReference is returned.\nfunc FeatureRefFromGateList(gates *corev1alpha2.FeatureGateList, featureName string) (string, corev1alpha2.FeatureReference) {\n\tfor i := range gates.Items {\n\t\tfor _, featRef := range gates.Items[i].Spec.Features {\n\t\t\tif featureName == featRef.Name {\n\t\t\t\treturn gates.Items[i].Name, featRef\n\t\t\t}\n\t\t}\n\t}\n\treturn \"\", corev1alpha2.FeatureReference{}\n}\n\n// setVoidWarrantyChecksPass will check if voiding the support warranty will happen for a Feature and if so,\n// that it is allowed. The following will pass the set void warranty check, indicating that the warranty\n// can be voided. All conditions must be met to pass the check.\n//   - The stability policy dictates that deviating from the activation default will void warranty.\n//   - Warranty will be voided (it has not already been voided).\n//   - The new activation setting request is different than the default. Another way to say this is that\n//     the old activation setting is the same as the default (policy.DefaultActivation == ref.Activate).\n//   - The user gave permission to void the warranty.\n//\n// Not passing conditions, however, need one or more of the following to not pass:\n//   - Warranty is not going to be voided.\n//   - Warranty will be voided, but user does not give permission to do so.\n//   - The new activation setting is the same as the default. Another way to say this is that the old\n//     activation setting is different than the default (policy.DefaultActivation != ref.Activate)\nfunc setVoidWarrantyChecksPass(ref corev1alpha2.FeatureReference, feature *corev1alpha2.Feature, warrantyVoidAllowed bool) (bool, error) {\n\tstability := feature.Spec.Stability\n\tpolicy := corev1alpha2.GetPolicyForStabilityLevel(stability)\n\n\t// Check if toggling activation state will void the warranty if not already voided.\n\tif policy.VoidsWarranty && !ref.PermanentlyVoidAllSupportGuarantees && policy.DefaultActivation == ref.Activate {\n\t\t// Ensure it is acceptable to the user to void the support warranty of a Feature.\n\t\tif warrantyVoidAllowed {\n\t\t\treturn true, nil\n\t\t}\n\t\treturn false, fmt.Errorf(\"warranty will be voided with new activation set point, but user has not given express permission to void the warranty: %w\", ErrTypeForbidden)\n\t}\n\n\t// The requested Feature activation set point is already the same as default and will not void warranty,\n\t// or the warranty is already permanently voided. Nothing needs to change with the warranty state.\n\treturn false, nil\n}\n\nfunc (f *FeatureGateClient) setVoidWarranty(ctx context.Context, gate *corev1alpha2.FeatureGate, featureName string) error {\n\tfor i, featureRef := range gate.Spec.Features {\n\t\tif featureRef.Name == featureName {\n\t\t\tgate.Spec.Features[i].PermanentlyVoidAllSupportGuarantees = true\n\t\t\treturn f.crClient.Update(ctx, gate)\n\t\t}\n\t}\n\treturn fmt.Errorf(\"could not void warranty for Feature %s as it was not found in any FeatureGate\", ErrTypeNotFound)\n}\n\n// setActivated sets the Feature to activate in FeatureGate\nfunc (f *FeatureGateClient) setActivated(ctx context.Context, gate *corev1alpha2.FeatureGate, featureName string) error {\n\tfor i := range gate.Spec.Features {\n\t\tif gate.Spec.Features[i].Name == featureName {\n\t\t\tgate.Spec.Features[i].Activate = true\n\t\t\treturn f.crClient.Update(ctx, gate)\n\t\t}\n\t}\n\treturn fmt.Errorf(\"could not activate Feature %s as it was not found in FeatureGate %s: %w\", featureName, gate.Name, ErrTypeNotFound)\n}\n\n// DeactivateFeature deactivates a Feature. Along with the error, it returns the name of the FeatureGate\n// that gates the Feature.\nfunc (f *FeatureGateClient) DeactivateFeature(ctx context.Context, featureName string) (string, error) {\n\t// A Feature must exist in the cluster to be deactivated.\n\tfeature, err := f.GetFeature(ctx, featureName)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"could not get Feature %s: %w\", featureName, err)\n\t}\n\n\tgates, err := f.GetFeatureGateList(ctx)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"could not get FeatureGateList: %w\", err)\n\t}\n\n\tgateName, featRef := FeatureRefFromGateList(gates, featureName)\n\n\tif gateName != \"\" && !featRef.Activate {\n\t\tfmt.Printf(\"The Feature Reference %s is already set to be deactivated in FeatureGate %s.\\n\", featureName, gateName)\n\t\treturn gateName, nil\n\t}\n\n\tif err := validateFeatureActivationToggle(gates, feature); err != nil {\n\t\treturn gateName, err\n\t}\n\n\tgate, err := f.GetFeatureGate(ctx, gateName)\n\tif err != nil {\n\t\treturn gateName, err\n\t}\n\n\treturn gateName, f.setDeactivated(ctx, gate, featureName)\n}\n\n// setDeactivated sets the Feature to 'deactivate' in the FeatureGate resource.\nfunc (f *FeatureGateClient) setDeactivated(ctx context.Context, gate *corev1alpha2.FeatureGate, featureName string) error {\n\tfor i, featureRef := range gate.Spec.Features {\n\t\tif featureRef.Name == featureName {\n\t\t\tgate.Spec.Features[i].Activate = false\n\t\t\treturn f.crClient.Update(ctx, gate)\n\t\t}\n\t}\n\treturn nil\n}\n\n// getCurrentClusterConfig gets the config of current logged in cluster\nfunc getCurrentClusterConfig() (*rest.Config, error) {\n\tc, err := config.GetCurrentContext(types.TargetK8s)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif c.ClusterOpts == nil {\n\t\treturn nil, fmt.Errorf(\"unexpected error: context options is nil\")\n\t}\n\trestConfig, err := getRestConfigWithContext(c.ClusterOpts.Context, c.ClusterOpts.Path)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"could not get rest config: %w\", err)\n\t}\n\treturn restConfig, nil\n}\n\n// getRestConfigWithContext returns config using the passed context.\nfunc getRestConfigWithContext(ctx, kubeconfigPath string) (*rest.Config, error) {\n\treturn clientcmd.NewNonInteractiveDeferredLoadingClientConfig(\n\t\t&clientcmd.ClientConfigLoadingRules{ExplicitPath: kubeconfigPath},\n\t\t&clientcmd.ConfigOverrides{\n\t\t\tCurrentContext: ctx,\n\t\t}).ClientConfig()\n}\n"
  },
  {
    "path": "featuregates/client/pkg/featuregateclient/client_test.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage featuregateclient\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"testing\"\n\t\"time\"\n\n\t\"k8s.io/client-go/kubernetes/scheme\"\n\tcrclient \"sigs.k8s.io/controller-runtime/pkg/client/fake\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n\t\"github.com/vmware-tanzu/tanzu-framework/featuregates/client/pkg/featuregateclient/fake\"\n)\n\nconst contextTimeout = 30 * time.Second\n\nfunc TestGetFeature(t *testing.T) {\n\tctx, cancel := context.WithTimeout(context.Background(), contextTimeout)\n\tdefer cancel()\n\n\tobjs, features, _ := fake.GetTestObjects()\n\ts := scheme.Scheme\n\tif err := corev1alpha2.AddToScheme(s); err != nil {\n\t\tt.Fatalf(\"unable to add config scheme: (%v)\", err)\n\t}\n\tcl := crclient.NewClientBuilder().WithRuntimeObjects(objs...).Build()\n\tfeatureGateClient, err := NewFeatureGateClient(WithClient(cl))\n\tif err != nil {\n\t\tt.Fatalf(\"unable to get FeatureGateClient: (%v)\", err)\n\t}\n\n\tgetFeatureTestCases := []struct {\n\t\tdescription string\n\t\tfeatureName string\n\t\treturnErr   bool\n\t}{\n\t\t{\n\t\t\tdescription: \"should successfully return feature\",\n\t\t\tfeatureName: \"cloud-event-listener\",\n\t\t\treturnErr:   false,\n\t\t},\n\t\t{\n\t\t\tdescription: \"should return an error when querying for feature that doesn't exist\",\n\t\t\tfeatureName: \"xyz\",\n\t\t\treturnErr:   true,\n\t\t},\n\t}\n\n\tfor _, tc := range getFeatureTestCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tfeature, err := featureGateClient.GetFeature(ctx, tc.featureName)\n\t\t\tif err != nil {\n\t\t\t\tif !tc.returnErr {\n\t\t\t\t\tt.Errorf(\"error not expected, but got error: %v\", err)\n\t\t\t\t}\n\t\t\t} else if tc.returnErr {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Errorf(\"error expected, but got nothing\")\n\t\t\t\t}\n\t\t\t}\n\t\t\tif feature != nil && (feature.Name != features[tc.featureName].Name ||\n\t\t\t\tfeature.Status.Activated != features[tc.featureName].Status.Activated ||\n\t\t\t\tfeature.Spec.Stability != features[tc.featureName].Spec.Stability ||\n\t\t\t\tfeature.Spec.Description != features[tc.featureName].Spec.Description) {\n\t\t\t\tt.Errorf(\"feature returned is not the correct feature, Expected: %v, Got: %v\", features[tc.featureName], feature)\n\t\t\t}\n\t\t})\n\t}\n}\nfunc TestGetFeatureList(t *testing.T) {\n\tctx, cancel := context.WithTimeout(context.Background(), contextTimeout)\n\tdefer cancel()\n\n\tobjs, _, _ := fake.GetTestObjects()\n\ts := scheme.Scheme\n\tif err := corev1alpha2.AddToScheme(s); err != nil {\n\t\tt.Fatalf(\"unable to add config scheme: (%v)\", err)\n\t}\n\tcl := crclient.NewClientBuilder().WithRuntimeObjects(objs...).Build()\n\tfeatureGateClient, err := NewFeatureGateClient(WithClient(cl))\n\tif err != nil {\n\t\tt.Fatalf(\"unable to get FeatureGateClient: (%v)\", err)\n\t}\n\n\ttest := struct {\n\t\tdescription string\n\t\twant        []string\n\t\treturnErr   bool\n\t}{\n\t\tdescription: \"should successfully return features on cluster\",\n\t\twant: []string{\n\t\t\t\"bar\",\n\t\t\t\"barries\",\n\t\t\t\"baz\",\n\t\t\t\"bazzies\",\n\t\t\t\"biz\",\n\t\t\t\"cloud-event-listener\",\n\t\t\t\"cloud-event-speaker\",\n\t\t\t\"cloud-event-relayer\",\n\t\t\t\"dodgy-experimental-periscope\",\n\t\t\t\"foo\",\n\t\t\t\"super-toaster\",\n\t\t\t\"tuna\",\n\t\t\t\"tuner\",\n\t\t},\n\t\treturnErr: false,\n\t}\n\n\tt.Run(test.description, func(t *testing.T) {\n\t\tfeatures, err := featureGateClient.GetFeatureList(ctx)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"unable to get FeatureList: %v\", err)\n\t\t}\n\n\t\tfor _, feature := range test.want {\n\t\t\tif !featureListContainsFeature(features, feature) {\n\t\t\t\tt.Errorf(\"got: %#v, want: %s feature in list\", features.Items, feature)\n\t\t\t}\n\t\t}\n\t})\n}\n\nfunc TestGetFeaturegate(t *testing.T) {\n\tctx, cancel := context.WithTimeout(context.Background(), contextTimeout)\n\tdefer cancel()\n\n\tobjs, _, _ := fake.GetTestObjects()\n\ts := scheme.Scheme\n\tif err := corev1alpha2.AddToScheme(s); err != nil {\n\t\tt.Fatalf(\"unable to add config scheme: (%v)\", err)\n\t}\n\tcl := crclient.NewClientBuilder().WithRuntimeObjects(objs...).Build()\n\tfeatureGateClient, err := NewFeatureGateClient(WithClient(cl))\n\tif err != nil {\n\t\tt.Fatalf(\"unable to get FeatureGateClient: (%v)\", err)\n\t}\n\n\ttests := []struct {\n\t\tdescription  string\n\t\tfeatureGate  string\n\t\twantGate     string\n\t\twantFeatures []string\n\t}{\n\t\t{\n\t\t\tdescription: \"should return specified FeatureGate in cluster\",\n\t\t\tfeatureGate: \"tkg-system\",\n\t\t\twantGate:    \"tkg-system\",\n\t\t\twantFeatures: []string{\n\t\t\t\t\"cloud-event-listener\",\n\t\t\t\t\"dodgy-experimental-periscope\",\n\t\t\t\t\"super-toaster\",\n\t\t\t\t\"bar\",\n\t\t\t\t\"foo\",\n\t\t\t\t\"baz\",\n\t\t\t\t\"hard-to-get\",\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tgot, err := featureGateClient.GetFeatureGate(ctx, tc.featureGate)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"unable to get FeatureGate %s: %v\", tc.featureGate, err)\n\t\t\t}\n\n\t\t\tif got.Name != tc.wantGate {\n\t\t\t\tt.Errorf(\"got: %s, want: %s\", got.Name, tc.wantGate)\n\t\t\t}\n\n\t\t\tfor _, want := range tc.wantFeatures {\n\t\t\t\tif !featureGateContainsFeature(got, want) {\n\t\t\t\t\tt.Errorf(\"got: %#v, but missing wanted Feature: %s\", got, want)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestGetFeaturegateList(t *testing.T) {\n\tctx, cancel := context.WithTimeout(context.Background(), contextTimeout)\n\tdefer cancel()\n\n\tobjs, _, _ := fake.GetTestObjects()\n\ts := scheme.Scheme\n\tif err := corev1alpha2.AddToScheme(s); err != nil {\n\t\tt.Fatalf(\"unable to add config scheme: (%v)\", err)\n\t}\n\tcl := crclient.NewClientBuilder().WithRuntimeObjects(objs...).Build()\n\tfeatureGateClient, err := NewFeatureGateClient(WithClient(cl))\n\tif err != nil {\n\t\tt.Fatalf(\"unable to get FeatureGateClient: (%v)\", err)\n\t}\n\n\ttests := []struct {\n\t\tdescription string\n\t\twantGates   []string\n\t}{\n\t\t{\n\t\t\tdescription: \"should return all featuregates in cluster\",\n\t\t\twantGates: []string{\n\t\t\t\t\"tkg-system\",\n\t\t\t\t\"empty-fg\",\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tgot, err := featureGateClient.GetFeatureGateList(ctx)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"get FeatureGateList: %v\", err)\n\t\t\t}\n\n\t\t\tfor _, want := range tc.wantGates {\n\t\t\t\tif !featureGateListContainsFeatureGate(got, want) {\n\t\t\t\t\tt.Errorf(\"got: %#v, but missing wanted FeatureGate: %s\", got, want)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestActivateFeature(t *testing.T) {\n\tctx, cancel := context.WithTimeout(context.Background(), contextTimeout)\n\tdefer cancel()\n\n\tobjs, _, _ := fake.GetTestObjects()\n\ttestScheme := scheme.Scheme\n\tif err := corev1alpha2.AddToScheme(testScheme); err != nil {\n\t\tt.Fatalf(\"unable to add config scheme: (%v)\", err)\n\t}\n\tcl := crclient.NewClientBuilder().WithRuntimeObjects(objs...).Build()\n\tfeatureGateClient, err := NewFeatureGateClient(WithClient(cl))\n\tif err != nil {\n\t\tt.Fatalf(\"unable to get FeatureGateClient: (%v)\", err)\n\t}\n\n\ttests := []struct {\n\t\tdescription       string\n\t\tfeatureName       string\n\t\tallowWarrantyVoid bool\n\t\twantErr           error\n\t\twantGateName      string\n\t\twantActivated     bool\n\t\twantVoidWarranty  bool\n\t}{\n\t\t{\n\t\t\tdescription:       \"should successfully activate a technical preview Feature\",\n\t\t\tfeatureName:       \"bar\",\n\t\t\tallowWarrantyVoid: false,\n\t\t\twantErr:           nil,\n\t\t\twantGateName:      \"tkg-system\",\n\t\t\twantActivated:     true,\n\t\t\twantVoidWarranty:  false,\n\t\t},\n\t\t{\n\t\t\tdescription:       \"should do nothing if Feature is already activated and a previously voided warranty stays voided\",\n\t\t\tfeatureName:       \"cloud-event-listener\",\n\t\t\tallowWarrantyVoid: false,\n\t\t\twantErr:           nil,\n\t\t\twantGateName:      \"tkg-system\",\n\t\t\twantActivated:     true,\n\t\t\twantVoidWarranty:  true,\n\t\t},\n\t\t{\n\t\t\tdescription:       \"should throw an error when warranty will be voided without user permission\",\n\t\t\tfeatureName:       \"foo\",\n\t\t\tallowWarrantyVoid: false,\n\t\t\twantErr:           ErrTypeForbidden,\n\t\t\twantGateName:      \"tkg-system\",\n\t\t\twantActivated:     false,\n\t\t\twantVoidWarranty:  false,\n\t\t},\n\t\t{\n\t\t\tdescription:       \"should not throw an error if warranty would've been voided but is already void\",\n\t\t\tfeatureName:       \"cloud-event-listener\",\n\t\t\tallowWarrantyVoid: false,\n\t\t\twantErr:           nil,\n\t\t\twantGateName:      \"tkg-system\",\n\t\t\twantActivated:     true,\n\t\t\twantVoidWarranty:  true,\n\t\t},\n\t\t{\n\t\t\tdescription:       \"should set warranty void if warranty is allowed and activating voids warranty\",\n\t\t\tfeatureName:       \"dodgy-experimental-periscope\",\n\t\t\tallowWarrantyVoid: true,\n\t\t\twantErr:           nil,\n\t\t\twantGateName:      \"tkg-system\",\n\t\t\twantActivated:     true,\n\t\t\twantVoidWarranty:  true,\n\t\t},\n\t\t{\n\t\t\tdescription:       \"should throw an error when the feature doesn't exist\",\n\t\t\tfeatureName:       \"bax\",\n\t\t\tallowWarrantyVoid: false,\n\t\t\twantErr:           ErrTypeNotFound,\n\t\t},\n\t\t{\n\t\t\tdescription:       \"should throw an error when the Feature is not referenced in a FeatureGate\",\n\t\t\tfeatureName:       \"specialized-toaster\",\n\t\t\tallowWarrantyVoid: false,\n\t\t\twantErr:           ErrTypeNotFound,\n\t\t\twantActivated:     false,\n\t\t\twantVoidWarranty:  false,\n\t\t},\n\t\t{\n\t\t\tdescription:       \"should throw an error when the Feature is referenced in more than one FeatureGate\",\n\t\t\tfeatureName:       \"baz\",\n\t\t\tallowWarrantyVoid: false,\n\t\t\twantErr:           ErrTypeTooMany,\n\t\t\twantActivated:     false,\n\t\t\twantVoidWarranty:  false,\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\terr := featureGateClient.ActivateFeature(ctx, tc.featureName, tc.allowWarrantyVoid)\n\n\t\t\t// Error is expected for ActivateFeature.\n\t\t\tif tc.wantErr != nil {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Errorf(\"no error, want: %v\", tc.wantErr)\n\t\t\t\t}\n\n\t\t\t\tif !errors.Is(err, tc.wantErr) {\n\t\t\t\t\tt.Errorf(\"%v, want: %v\", err, tc.wantErr)\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Error is not expected for ActivateFeature.\n\t\t\tif err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t} else {\n\t\t\t\tgateList, err := featureGateClient.GetFeatureGateList(ctx)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Error(err)\n\t\t\t\t}\n\n\t\t\t\tgateName, featRef := FeatureRefFromGateList(gateList, tc.featureName)\n\t\t\t\tif gateName != tc.wantGateName {\n\t\t\t\t\tt.Errorf(\"got FeatureGate %s, want: %s\", gateName, tc.wantGateName)\n\t\t\t\t}\n\n\t\t\t\tif featRef.Name != tc.featureName {\n\t\t\t\t\tt.Errorf(\"got Feature %s, want: %s\", featRef.Name, tc.featureName)\n\t\t\t\t}\n\n\t\t\t\tif featRef.Activate != tc.wantActivated {\n\t\t\t\t\tt.Errorf(\"got Feature %s activated %t, want: %t\", tc.featureName, featRef.Activate, tc.wantActivated)\n\t\t\t\t}\n\n\t\t\t\tif featRef.PermanentlyVoidAllSupportGuarantees != tc.wantVoidWarranty {\n\t\t\t\t\tt.Errorf(\"got Feature %s warranty voided: %t, want: %t\", featRef.Name, featRef.PermanentlyVoidAllSupportGuarantees, tc.wantVoidWarranty)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestDeactivateFeature(t *testing.T) {\n\tctx, cancel := context.WithTimeout(context.Background(), contextTimeout)\n\tdefer cancel()\n\n\tobjs, _, _ := fake.GetTestObjects()\n\ts := scheme.Scheme\n\tif err := corev1alpha2.AddToScheme(s); err != nil {\n\t\tt.Fatalf(\"unable to add config scheme: (%v)\", err)\n\t}\n\tcl := crclient.NewClientBuilder().WithRuntimeObjects(objs...).Build()\n\tfeatureGateClient, err := NewFeatureGateClient(WithClient(cl))\n\tif err != nil {\n\t\tt.Fatalf(\"unable to get FeatureGateClient: (%v)\", err)\n\t}\n\n\ttests := []struct {\n\t\tdescription       string\n\t\tfeatureName       string\n\t\tallowWarrantyVoid bool\n\t\twantErr           error\n\t\twantGateName      string\n\t\twantActivated     bool\n\t\twantVoidWarranty  bool\n\t}{\n\t\t{\n\t\t\tdescription:       \"should successfully deactivate a technical preview Feature\",\n\t\t\tfeatureName:       \"barries\",\n\t\t\tallowWarrantyVoid: false,\n\t\t\twantErr:           nil,\n\t\t\twantGateName:      \"tkg-system\",\n\t\t\twantActivated:     false,\n\t\t\twantVoidWarranty:  false,\n\t\t},\n\t\t{\n\t\t\tdescription:       \"should throw an error when deactivating a stable (immutable) Feature\",\n\t\t\tfeatureName:       \"super-toaster\",\n\t\t\tallowWarrantyVoid: false,\n\t\t\twantErr:           ErrTypeForbidden,\n\t\t\twantGateName:      \"tkg-system\",\n\t\t\twantActivated:     true,\n\t\t\twantVoidWarranty:  false,\n\t\t},\n\t\t{\n\t\t\tdescription:       \"should throw an error when the feature doesn't exist\",\n\t\t\tfeatureName:       \"bax\",\n\t\t\tallowWarrantyVoid: false,\n\t\t\twantErr:           ErrTypeNotFound,\n\t\t},\n\t\t{\n\t\t\tdescription:       \"should throw an error when the feature doesn't exist\",\n\t\t\tfeatureName:       \"bax\",\n\t\t\tallowWarrantyVoid: false,\n\t\t\twantErr:           ErrTypeNotFound,\n\t\t},\n\t\t{\n\t\t\tdescription:       \"should throw an error when the Feature is not referenced in a FeatureGate\",\n\t\t\tfeatureName:       \"specialized-toaster\",\n\t\t\tallowWarrantyVoid: false,\n\t\t\twantErr:           ErrTypeNotFound,\n\t\t\twantActivated:     false,\n\t\t\twantVoidWarranty:  false,\n\t\t},\n\t\t{\n\t\t\tdescription:       \"should throw an error when the Feature is referenced in more than one FeatureGate\",\n\t\t\tfeatureName:       \"bazzies\",\n\t\t\tallowWarrantyVoid: false,\n\t\t\twantErr:           ErrTypeTooMany,\n\t\t\twantActivated:     true,\n\t\t\twantVoidWarranty:  false,\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\t_, err := featureGateClient.DeactivateFeature(ctx, tc.featureName)\n\n\t\t\t// Error is expected for DeactivateFeature.\n\t\t\tif tc.wantErr != nil {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Errorf(\"no error, want: %v\", tc.wantErr)\n\t\t\t\t}\n\n\t\t\t\tif !errors.Is(err, tc.wantErr) {\n\t\t\t\t\tt.Errorf(\"%v, want: %v\", err, tc.wantErr)\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Error is not expected for DeactivateFeature.\n\t\t\tif err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t} else {\n\t\t\t\tgateList, err := featureGateClient.GetFeatureGateList(ctx)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Error(err)\n\t\t\t\t}\n\n\t\t\t\tgateName, featRef := FeatureRefFromGateList(gateList, tc.featureName)\n\t\t\t\tif gateName != tc.wantGateName {\n\t\t\t\t\tt.Errorf(\"got FeatureGate %s, want: %s\", gateName, tc.wantGateName)\n\t\t\t\t}\n\n\t\t\t\tif featRef.Name != tc.featureName {\n\t\t\t\t\tt.Errorf(\"got Feature %s, want: %s\", featRef.Name, tc.featureName)\n\t\t\t\t}\n\n\t\t\t\tif featRef.Activate != tc.wantActivated {\n\t\t\t\t\tt.Errorf(\"got Feature %s activated %t, want: %t\", tc.featureName, featRef.Activate, tc.wantActivated)\n\t\t\t\t}\n\n\t\t\t\tif featRef.PermanentlyVoidAllSupportGuarantees != tc.wantVoidWarranty {\n\t\t\t\t\tt.Errorf(\"got Feature %s warranty voided: %t, want: %t\", featRef.Name, featRef.PermanentlyVoidAllSupportGuarantees, tc.wantVoidWarranty)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc featureGateContainsFeature(gate *corev1alpha2.FeatureGate, feature string) bool {\n\tfor _, feat := range gate.Spec.Features {\n\t\tif feature == feat.Name {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc featureGateListContainsFeatureGate(gates *corev1alpha2.FeatureGateList, feature string) bool {\n\tfor _, gate := range gates.Items {\n\t\tif feature == gate.Name {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc featureListContainsFeature(features *corev1alpha2.FeatureList, feature string) bool {\n\tfor _, feat := range features.Items {\n\t\tif feature == feat.Name {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "featuregates/client/pkg/featuregateclient/doc.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package featuregateclient provides methods to interact with Feature and FeatureGate resources\npackage featuregateclient\n"
  },
  {
    "path": "featuregates/client/pkg/featuregateclient/errors.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage featuregateclient\n\nimport \"fmt\"\n\n// ErrType is a machine readable value created for facilitating error-matching\n// in tests.\ntype ErrType string\n\nconst (\n\t// ErrType indicates a resource could not be found.\n\tErrTypeNotFound ErrType = \"NotFound\"\n\t// ErrTypeForbidden indicates an action is not allowed.\n\tErrTypeForbidden ErrType = \"Forbidden\"\n\t// ErrTypeTooMany indicates there are too many of a resource.\n\tErrTypeTooMany ErrType = \"TooMany\"\n)\n\n// Error converts a ErrorType into its corresponding canonical error message.\nfunc (t ErrType) Error() string {\n\tswitch t {\n\tcase ErrTypeNotFound:\n\t\treturn \"Not found\"\n\tcase ErrTypeForbidden:\n\t\treturn \"Forbidden\"\n\tcase ErrTypeTooMany:\n\t\treturn \"Too many\"\n\tdefault:\n\t\treturn fmt.Sprintf(\"unrecognized validation error: %q\", string(t))\n\t}\n}\n"
  },
  {
    "path": "featuregates/client/pkg/featuregateclient/fake/doc.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package fake provides data needed for testing\npackage fake\n"
  },
  {
    "path": "featuregates/client/pkg/featuregateclient/fake/objects.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage fake\n\nimport (\n\tcorev1 \"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n)\n\n// GetTestObjects returns objects to initialize the fake client\n//\n//nolint:funlen\nfunc GetTestObjects() ([]runtime.Object, map[string]*corev1alpha2.Feature, map[string]*corev1alpha2.FeatureGate) {\n\tbar := &corev1alpha2.Feature{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName: \"bar\",\n\t\t},\n\t\tSpec: corev1alpha2.FeatureSpec{\n\t\t\tDescription: \"Bar support\",\n\t\t\tStability:   corev1alpha2.TechnicalPreview,\n\t\t},\n\t\tStatus: corev1alpha2.FeatureStatus{\n\t\t\tActivated: false,\n\t\t},\n\t}\n\n\tbarries := &corev1alpha2.Feature{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName: \"barries\",\n\t\t},\n\t\tSpec: corev1alpha2.FeatureSpec{\n\t\t\tDescription: \"Barries support\",\n\t\t\tStability:   corev1alpha2.TechnicalPreview,\n\t\t},\n\t\tStatus: corev1alpha2.FeatureStatus{\n\t\t\tActivated: false,\n\t\t},\n\t}\n\n\tbaz := &corev1alpha2.Feature{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName: \"baz\",\n\t\t},\n\t\tSpec: corev1alpha2.FeatureSpec{\n\t\t\tDescription: \"[Deprecated] Baz support\",\n\t\t\tStability:   corev1alpha2.Deprecated,\n\t\t},\n\t\tStatus: corev1alpha2.FeatureStatus{\n\t\t\tActivated: false,\n\t\t},\n\t}\n\n\tbiz := &corev1alpha2.Feature{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName: \"biz\",\n\t\t},\n\t\tSpec: corev1alpha2.FeatureSpec{\n\t\t\tDescription: \"[Deprecated] Bizniz support\",\n\t\t\tStability:   corev1alpha2.Deprecated,\n\t\t},\n\t\tStatus: corev1alpha2.FeatureStatus{\n\t\t\tActivated: false,\n\t\t},\n\t}\n\n\tbazzies := &corev1alpha2.Feature{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName: \"bazzies\",\n\t\t},\n\t\tSpec: corev1alpha2.FeatureSpec{\n\t\t\tDescription: \"[Deprecated] Bazzies support\",\n\t\t\tStability:   corev1alpha2.Deprecated,\n\t\t},\n\t\tStatus: corev1alpha2.FeatureStatus{\n\t\t\tActivated: true,\n\t\t},\n\t}\n\n\tcloudEventListener := &corev1alpha2.Feature{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName: \"cloud-event-listener\",\n\t\t},\n\t\tSpec: corev1alpha2.FeatureSpec{\n\t\t\tDescription: \"Open a port to listen for cloud events. Highly experimental!\",\n\t\t\tStability:   corev1alpha2.Experimental,\n\t\t},\n\t\tStatus: corev1alpha2.FeatureStatus{\n\t\t\tActivated: true,\n\t\t},\n\t}\n\n\tcloudEventSpeaker := &corev1alpha2.Feature{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName: \"cloud-event-speaker\",\n\t\t},\n\t\tSpec: corev1alpha2.FeatureSpec{\n\t\t\tDescription: \"Open a port to speak for cloud events. Highly experimental!\",\n\t\t\tStability:   corev1alpha2.Experimental,\n\t\t},\n\t\tStatus: corev1alpha2.FeatureStatus{\n\t\t\tActivated: false,\n\t\t},\n\t}\n\n\tcloudEventRelayer := &corev1alpha2.Feature{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName: \"cloud-event-relayer\",\n\t\t},\n\t\tSpec: corev1alpha2.FeatureSpec{\n\t\t\tDescription: \"Open a port to relay cloud events. Highly experimental!\",\n\t\t\tStability:   corev1alpha2.Experimental,\n\t\t},\n\t\tStatus: corev1alpha2.FeatureStatus{\n\t\t\tActivated: false,\n\t\t},\n\t}\n\n\tdodgyExperimentalPeriscope := &corev1alpha2.Feature{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName: \"dodgy-experimental-periscope\",\n\t\t},\n\t\tSpec: corev1alpha2.FeatureSpec{\n\t\t\tDescription: \"Experimental support for deploying a periscope. Doesn't work very often!\",\n\t\t\tStability:   corev1alpha2.WorkInProgress,\n\t\t},\n\t\tStatus: corev1alpha2.FeatureStatus{\n\t\t\tActivated: true,\n\t\t},\n\t}\n\n\tfoo := &corev1alpha2.Feature{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName: \"foo\",\n\t\t},\n\t\tSpec: corev1alpha2.FeatureSpec{\n\t\t\tDescription: \"Foo support\",\n\t\t\tStability:   corev1alpha2.WorkInProgress,\n\t\t},\n\t\tStatus: corev1alpha2.FeatureStatus{\n\t\t\tActivated: false,\n\t\t},\n\t}\n\n\tspecializedToaster := &corev1alpha2.Feature{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName: \"specialized-toaster\",\n\t\t},\n\t\tSpec: corev1alpha2.FeatureSpec{\n\t\t\tDescription: \"A new toaster specialized for special things\",\n\t\t\tStability:   corev1alpha2.Stable,\n\t\t},\n\t\tStatus: corev1alpha2.FeatureStatus{\n\t\t\tActivated: true,\n\t\t},\n\t}\n\n\tsuperToaster := &corev1alpha2.Feature{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName: \"super-toaster\",\n\t\t},\n\t\tSpec: corev1alpha2.FeatureSpec{\n\t\t\tDescription: \"An old, reliable toaster\",\n\t\t\tStability:   corev1alpha2.Stable,\n\t\t},\n\t\tStatus: corev1alpha2.FeatureStatus{\n\t\t\tActivated: true,\n\t\t},\n\t}\n\n\ttuna := &corev1alpha2.Feature{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName: \"tuna\",\n\t\t},\n\t\tSpec: corev1alpha2.FeatureSpec{\n\t\t\tDescription: \"A fish that likes to travel in tribes\",\n\t\t\tStability:   corev1alpha2.TechnicalPreview,\n\t\t},\n\t\tStatus: corev1alpha2.FeatureStatus{\n\t\t\tActivated: false,\n\t\t},\n\t}\n\n\ttuner := &corev1alpha2.Feature{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName: \"tuner\",\n\t\t},\n\t\tSpec: corev1alpha2.FeatureSpec{\n\t\t\tDescription: \"A that tunes into trendy tracks\",\n\t\t\tStability:   corev1alpha2.TechnicalPreview,\n\t\t},\n\t\tStatus: corev1alpha2.FeatureStatus{\n\t\t\tActivated: true,\n\t\t},\n\t}\n\n\tfeatures := map[string]*corev1alpha2.Feature{\n\t\t\"bar\":                          bar,\n\t\t\"barries\":                      barries,\n\t\t\"baz\":                          baz,\n\t\t\"biz\":                          biz,\n\t\t\"bazzies\":                      bazzies,\n\t\t\"cloud-event-listener\":         cloudEventListener,\n\t\t\"cloud-event-speaker\":          cloudEventSpeaker,\n\t\t\"cloud-event-relayer\":          cloudEventRelayer,\n\t\t\"dodgy-experimental-periscope\": dodgyExperimentalPeriscope,\n\t\t\"foo\":                          foo,\n\t\t\"tuner\":                        tuner,\n\t\t\"tuna\":                         tuna,\n\t\t\"specialized-toaster\":          specializedToaster,\n\t\t\"super-toaster\":                superToaster,\n\t}\n\n\ttkgSystemNamespace := &corev1.Namespace{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tNamespace: \"default\",\n\t\t},\n\t}\n\n\tkubeSystemNamespace := &corev1.Namespace{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName: \"kube-system\",\n\t\t},\n\t}\n\n\tsystemFeatureGate := &corev1alpha2.FeatureGate{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName: \"tkg-system\",\n\t\t},\n\t\tSpec: corev1alpha2.FeatureGateSpec{\n\t\t\tFeatures: []corev1alpha2.FeatureReference{\n\t\t\t\t{\n\t\t\t\t\t// WIP\n\t\t\t\t\tName:                                \"dodgy-experimental-periscope\",\n\t\t\t\t\tActivate:                            false,\n\t\t\t\t\tPermanentlyVoidAllSupportGuarantees: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// WIP\n\t\t\t\t\tName:                                \"foo\",\n\t\t\t\t\tActivate:                            false,\n\t\t\t\t\tPermanentlyVoidAllSupportGuarantees: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Experimental\n\t\t\t\t\tName:                                \"cloud-event-listener\",\n\t\t\t\t\tActivate:                            true,\n\t\t\t\t\tPermanentlyVoidAllSupportGuarantees: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Experimental\n\t\t\t\t\tName:                                \"cloud-event-speaker\",\n\t\t\t\t\tActivate:                            false,\n\t\t\t\t\tPermanentlyVoidAllSupportGuarantees: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Experimental\n\t\t\t\t\tName:                                \"cloud-event-relayer\",\n\t\t\t\t\tActivate:                            false,\n\t\t\t\t\tPermanentlyVoidAllSupportGuarantees: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Feature is not in cluster and stability is unknown\n\t\t\t\t\tName:                                \"hard-to-get\",\n\t\t\t\t\tActivate:                            false,\n\t\t\t\t\tPermanentlyVoidAllSupportGuarantees: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Technical Preview\n\t\t\t\t\tName:                                \"bar\",\n\t\t\t\t\tActivate:                            false,\n\t\t\t\t\tPermanentlyVoidAllSupportGuarantees: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Technical Preview\n\t\t\t\t\tName:                                \"barries\",\n\t\t\t\t\tActivate:                            true,\n\t\t\t\t\tPermanentlyVoidAllSupportGuarantees: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Stable\n\t\t\t\t\tName:                                \"super-toaster\",\n\t\t\t\t\tActivate:                            true,\n\t\t\t\t\tPermanentlyVoidAllSupportGuarantees: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Deprecated\n\t\t\t\t\tName:                                \"biz\",\n\t\t\t\t\tActivate:                            false,\n\t\t\t\t\tPermanentlyVoidAllSupportGuarantees: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Deprecated\n\t\t\t\t\tName:                                \"baz\",\n\t\t\t\t\tActivate:                            false,\n\t\t\t\t\tPermanentlyVoidAllSupportGuarantees: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Deprecated\n\t\t\t\t\tName:                                \"bazzies\",\n\t\t\t\t\tActivate:                            true,\n\t\t\t\t\tPermanentlyVoidAllSupportGuarantees: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\temptyFeatureGate := &corev1alpha2.FeatureGate{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName: \"empty-fg\",\n\t\t},\n\t\tSpec: corev1alpha2.FeatureGateSpec{\n\t\t\tFeatures: []corev1alpha2.FeatureReference{},\n\t\t},\n\t}\n\n\ttanzuFeatureGate := &corev1alpha2.FeatureGate{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName: \"tanzu-fg\",\n\t\t},\n\t\tSpec: corev1alpha2.FeatureGateSpec{\n\t\t\tFeatures: []corev1alpha2.FeatureReference{\n\t\t\t\t{\n\t\t\t\t\t// Technical Preview\n\t\t\t\t\tName:                                \"tuna\",\n\t\t\t\t\tActivate:                            false,\n\t\t\t\t\tPermanentlyVoidAllSupportGuarantees: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Technical Preview\n\t\t\t\t\tName:                                \"tuner\",\n\t\t\t\t\tActivate:                            true,\n\t\t\t\t\tPermanentlyVoidAllSupportGuarantees: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Deprecated\n\t\t\t\t\tName:                                \"baz\",\n\t\t\t\t\tActivate:                            false,\n\t\t\t\t\tPermanentlyVoidAllSupportGuarantees: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Deprecated\n\t\t\t\t\tName:                                \"bazzies\",\n\t\t\t\t\tActivate:                            true,\n\t\t\t\t\tPermanentlyVoidAllSupportGuarantees: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfeatureGates := map[string]*corev1alpha2.FeatureGate{\n\t\t\"tkg-system\": systemFeatureGate,\n\t\t\"empty-fg\":   emptyFeatureGate,\n\t\t\"tanzu-fg\":   tanzuFeatureGate,\n\t}\n\n\t// Objects to track in the fake client.\n\treturn []runtime.Object{\n\t\tbar,\n\t\tbarries,\n\t\tbaz,\n\t\tbazzies,\n\t\tbiz,\n\t\tcloudEventListener,\n\t\tcloudEventSpeaker,\n\t\tcloudEventRelayer,\n\t\tdodgyExperimentalPeriscope,\n\t\temptyFeatureGate,\n\t\tfoo,\n\t\tkubeSystemNamespace,\n\t\tsuperToaster,\n\t\tsystemFeatureGate,\n\t\ttanzuFeatureGate,\n\t\ttkgSystemNamespace,\n\t\ttuna,\n\t\ttuner,\n\t}, features, featureGates\n}\n"
  },
  {
    "path": "featuregates/client/pkg/featuregateclient/validation.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage featuregateclient\n\nimport (\n\t\"fmt\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n)\n\n// validateFeatureActivationToggle ensures the given Feature can be activated.\nfunc validateFeatureActivationToggle(gates *corev1alpha2.FeatureGateList, feature *corev1alpha2.Feature) error {\n\tif err := featureExistsInOneAndOnlyOneFeaturegate(gates, feature.Name); err != nil {\n\t\treturn fmt.Errorf(\"could not validate Feature changing activation set point: %w\", err)\n\t}\n\n\tif err := featureActivationToggleAllowed(feature); err != nil {\n\t\treturn fmt.Errorf(\"could not validate Feature changing activation set point: %w\", err)\n\t}\n\n\treturn nil\n}\n\n// featureExistsInOneFeaturegate checks that the Feature exists in one and only one FeatureGate.\nfunc featureExistsInOneAndOnlyOneFeaturegate(gates *corev1alpha2.FeatureGateList, featureName string) error {\n\tn := qtyFeatureGatesContainingFeature(gates, featureName)\n\tif n > 1 {\n\t\treturn fmt.Errorf(\"the Feature %s was found in more than one FeatureGate: %w\", featureName, ErrTypeTooMany)\n\t}\n\tif n == 0 {\n\t\treturn fmt.Errorf(\"the Feature %s must exist in one FeatureGate: %w\", featureName, ErrTypeNotFound)\n\t}\n\treturn nil\n}\n\n// qtyFeatureGatesContainingFeature counts the number of FeatureGates that\n// references the provided Feature.\nfunc qtyFeatureGatesContainingFeature(gates *corev1alpha2.FeatureGateList, featureName string) int {\n\tvar n int\n\tfor i := range gates.Items {\n\t\tfor _, ref := range gates.Items[i].Spec.Features {\n\t\t\tif ref.Name == featureName {\n\t\t\t\tn++\n\t\t\t}\n\t\t}\n\t}\n\treturn n\n}\n\n// featureActivationToggleAllowed checks if a Feature is considered immutable by its stability\n// level and associated policy. Immutable means a Feature's activation setting cannot be toggled.\nfunc featureActivationToggleAllowed(feature *corev1alpha2.Feature) error {\n\tstability := feature.Spec.Stability\n\tpolicy := corev1alpha2.GetPolicyForStabilityLevel(stability)\n\n\tif policy.Immutable {\n\t\treturn fmt.Errorf(\"activation setting for Feature %s cannot be toggled as its stability level is %s: %w\", feature.Name, stability, ErrTypeForbidden)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "featuregates/client/pkg/util/doc.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package util provides utilities for feature and feature gate functionality.\npackage util\n"
  },
  {
    "path": "featuregates/client/pkg/util/featuregate.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage util\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/types\"\n\t\"k8s.io/apimachinery/pkg/util/sets\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\n\tconfigv1alpha1 \"github.com/vmware-tanzu/tanzu-framework/apis/config/v1alpha1\"\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n)\n\nconst (\n\t// TKGSystemFeatureGate is the FeatureGate resource for gating TKG features.\n\tTKGSystemFeatureGate = \"tkg-system\"\n)\n\n// TKGNamespaceSelector is a label selector which matches TKG-related namespaces.\nvar TKGNamespaceSelector = metav1.LabelSelector{\n\tMatchExpressions: []metav1.LabelSelectorRequirement{\n\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpIn, Values: []string{\"tkg-system-public\"}},\n\t},\n}\n\n// ComputeFeatureStates takes a configv1alpha1 FeatureGate spec and computes the actual state\n// (activated, deactivated or unavailable) of the features in the gate by referring to a list of Feature resources.\n// Deprecated: Use IsFeatureActivated function instead to check if a feature is activated. IsFeatureActivated function\n// checks for feature belonging to core.tanzu.vmware.com is activated or not.\nfunc ComputeFeatureStates(featureGateSpec configv1alpha1.FeatureGateSpec, features []configv1alpha1.Feature) (activated, deactivated, unavailable []string) {\n\t// Collect features to be activated/deactivated in the spec.\n\ttoActivate := sets.String{}\n\ttoDeactivate := sets.String{}\n\tfor _, f := range featureGateSpec.Features {\n\t\tif f.Activate {\n\t\t\ttoActivate.Insert(f.Name)\n\t\t} else {\n\t\t\ttoDeactivate.Insert(f.Name)\n\t\t}\n\t}\n\n\t// discovered is set a set of available features that are discoverable.\n\tdiscovered := sets.String{}\n\t// discoveredDefaultActivated is a set of available features that are discoverable and activated by default.\n\tdiscoveredDefaultActivated := sets.String{}\n\t// discoveredDefaultDeactivated is a set of available features that are discoverable and deactivated by default.\n\tdiscoveredDefaultDeactivated := sets.String{}\n\tfor i := range features {\n\t\tfeature := features[i]\n\t\tif !feature.Spec.Discoverable {\n\t\t\tcontinue\n\t\t}\n\t\tdiscovered.Insert(feature.Name)\n\t\tif feature.Spec.Activated {\n\t\t\tdiscoveredDefaultActivated.Insert(feature.Name)\n\t\t} else {\n\t\t\tdiscoveredDefaultDeactivated.Insert(feature.Name)\n\t\t}\n\t}\n\n\t// activate is all the features that the spec intends to be activated and features that are default activated.\n\tactivate := discoveredDefaultActivated.Union(toActivate)\n\t// activationCandidates are features that are discovered, but are explicitly set *not* to be activated in this feature gate.\n\t// Only these features can be activated regardless of what the intent in the spec is.\n\tactivationCandidates := discovered.Difference(toDeactivate)\n\t// Intersection gives us the actual activated features.\n\tactivated = activationCandidates.Intersection(activate).List()\n\n\t// deactivate is all the features that the spec intends to be deactivated and features that are default deactivated.\n\tdeactivate := discoveredDefaultDeactivated.Union(toDeactivate)\n\t// deactivationCandidates are features that are discovered, but are explicitly set *not* to be deactivated in this feature gate.\n\t// Only these features can be deactivated regardless of what the intent in the spec is.\n\tdeactivationCandidates := discovered.Difference(toActivate)\n\t// Intersection gives us the actual deactivated features.\n\tdeactivated = deactivationCandidates.Intersection(deactivate).List()\n\n\t// Set of all features specified in the current spec.\n\tallFeaturesInSpec := toActivate.Union(toDeactivate)\n\t// Set difference with all the discovered features gives unavailable features.\n\tunavailable = allFeaturesInSpec.Difference(discovered).List()\n\n\treturn activated, deactivated, unavailable\n}\n\n// FeatureActivatedInNamespace returns true only if all of the features specified are activated in the namespace.\n// Deprecated: Use IsFeatureActivated function instead to check if a feature is activated. IsFeatureActivated function\n// checks for feature belonging to core.tanzu.vmware.com is activated or not.\nfunc FeatureActivatedInNamespace(ctx context.Context, c client.Client, namespace, feature string) (bool, error) {\n\tselector := metav1.LabelSelector{\n\t\tMatchExpressions: []metav1.LabelSelectorRequirement{\n\t\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpIn, Values: []string{namespace}},\n\t\t},\n\t}\n\treturn FeaturesActivatedInNamespacesMatchingSelector(ctx, c, selector, []string{feature})\n}\n\n// FeaturesActivatedInNamespacesMatchingSelector returns true only if all the features specified are activated in every namespace matched by the selector.\n// Deprecated: Use IsFeatureActivated function instead to check if a feature is activated. IsFeatureActivated function\n// checks for feature belonging to core.tanzu.vmware.com is activated or not.\nfunc FeaturesActivatedInNamespacesMatchingSelector(ctx context.Context, c client.Client, namespaceSelector metav1.LabelSelector, features []string) (bool, error) {\n\tnamespaces, err := NamespacesMatchingSelector(ctx, c, &namespaceSelector)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\t// If no namespaces are matched or no features specified, return false.\n\tif len(namespaces) == 0 || len(features) == 0 {\n\t\treturn false, nil\n\t}\n\n\tfeatureGatesList := &configv1alpha1.FeatureGateList{}\n\tif err := c.List(ctx, featureGatesList); err != nil {\n\t\treturn false, err\n\t}\n\n\t// Map of namespace to a set of features activated in that namespace.\n\tnamespaceToActivatedFeatures := make(map[string]sets.String)\n\tfor i := range featureGatesList.Items {\n\t\tfg := featureGatesList.Items[i]\n\t\tfor _, namespace := range fg.Status.Namespaces {\n\t\t\tnamespaceToActivatedFeatures[namespace] = sets.NewString(fg.Status.ActivatedFeatures...)\n\t\t}\n\t}\n\n\tfor _, ns := range namespaces {\n\t\tactivatedFeatures, found := namespaceToActivatedFeatures[ns]\n\t\tif !found {\n\t\t\t// Namespace has no features gated.\n\t\t\treturn false, nil\n\t\t}\n\t\t// Feature is not activated in this namespace.\n\t\tif !activatedFeatures.HasAll(features...) {\n\t\t\treturn false, nil\n\t\t}\n\t}\n\treturn true, nil\n}\n\n// IsFeatureActivated returns true only if the feature is activated.\nfunc IsFeatureActivated(ctx context.Context, c client.Client, featureName string) (bool, error) {\n\tfeature := &corev1alpha2.Feature{}\n\tif err := c.Get(ctx, types.NamespacedName{\n\t\tName: featureName,\n\t}, feature); err != nil {\n\t\treturn false, fmt.Errorf(\"could not retrieve feature %s :%w\", featureName, err)\n\t}\n\n\treturn feature.Status.Activated, nil\n}\n\n// GetFeatureGateForFeature returns FeatureGate resource that is gating the feature\nfunc GetFeatureGateForFeature(ctx context.Context, c client.Client, featureName string) (*corev1alpha2.FeatureGate, bool, error) {\n\tfeatureGateList := &corev1alpha2.FeatureGateList{}\n\tif err := c.List(ctx, featureGateList); err != nil {\n\t\treturn nil, false, fmt.Errorf(\"could not list FeatureGate resources: %w\", err)\n\t}\n\n\tfor i, fg := range featureGateList.Items { //nolint:gocritic\n\t\tfor _, f := range featureGateList.Items[i].Spec.Features {\n\t\t\tif f.Name == featureName {\n\t\t\t\treturn &fg, true, nil\n\t\t\t}\n\t\t}\n\t}\n\treturn nil, false, nil\n}\n\n// GetFeatureGateWithFeatureInStatus returns FeatureGate resource with feature in its status\nfunc GetFeatureGateWithFeatureInStatus(ctx context.Context, c client.Client, featureName string) (*corev1alpha2.FeatureGate, bool, error) {\n\tfeatureGateList := &corev1alpha2.FeatureGateList{}\n\tif err := c.List(ctx, featureGateList); err != nil {\n\t\treturn nil, false, fmt.Errorf(\"could not list FeatureGate resources: %w\", err)\n\t}\n\n\tfor i, fg := range featureGateList.Items { //nolint:gocritic\n\t\tfor _, result := range featureGateList.Items[i].Status.FeatureReferenceResults {\n\t\t\tif result.Name == featureName {\n\t\t\t\treturn &fg, true, nil\n\t\t\t}\n\t\t}\n\t}\n\treturn nil, false, nil\n}\n\n// GetFeatureReferenceFromFeatureGate returns feature reference from FeatureGate spec\nfunc GetFeatureReferenceFromFeatureGate(featureGate *corev1alpha2.FeatureGate, feature string) (corev1alpha2.FeatureReference, bool) {\n\tfor _, f := range featureGate.Spec.Features {\n\t\tif f.Name == feature {\n\t\t\treturn f, true\n\t\t}\n\t}\n\treturn corev1alpha2.FeatureReference{}, false\n}\n"
  },
  {
    "path": "featuregates/client/pkg/util/featuregate_test.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage util\n\nimport (\n\t\"context\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\tcorev1 \"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\tk8sscheme \"k8s.io/client-go/kubernetes/scheme\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client/fake\"\n\n\tconfigv1alpha1 \"github.com/vmware-tanzu/tanzu-framework/apis/config/v1alpha1\"\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n\tstringcmp \"github.com/vmware-tanzu/tanzu-framework/util/cmp/strings\"\n)\n\nfunc TestComputeFeatureStates(t *testing.T) {\n\ttestCases := []struct {\n\t\tdescription         string\n\t\tfeatures            []configv1alpha1.Feature\n\t\tspec                configv1alpha1.FeatureGateSpec\n\t\texpectedActivated   []string\n\t\texpectedDeactivated []string\n\t\texpectedUnavailable []string\n\t}{\n\t\t{\n\t\t\tdescription: \"All combinations of availability and discoverability\",\n\t\t\tfeatures: []configv1alpha1.Feature{\n\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"one\"}, Spec: configv1alpha1.FeatureSpec{Activated: true, Discoverable: true}},\n\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"two\"}, Spec: configv1alpha1.FeatureSpec{Activated: true, Discoverable: true}},\n\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"three\"}, Spec: configv1alpha1.FeatureSpec{Activated: false, Discoverable: true}},\n\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"four\"}, Spec: configv1alpha1.FeatureSpec{Activated: false, Discoverable: true}},\n\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"five\"}, Spec: configv1alpha1.FeatureSpec{Activated: false, Discoverable: true}},\n\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"eleven\"}, Spec: configv1alpha1.FeatureSpec{Activated: true, Discoverable: true}},\n\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"twelve\"}, Spec: configv1alpha1.FeatureSpec{Activated: false, Discoverable: true}},\n\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"thirteen\"}, Spec: configv1alpha1.FeatureSpec{Activated: false, Discoverable: true}},\n\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"hundred\"}, Spec: configv1alpha1.FeatureSpec{Activated: false, Discoverable: false}},\n\t\t\t\t{ObjectMeta: metav1.ObjectMeta{Name: \"thousand\"}, Spec: configv1alpha1.FeatureSpec{Activated: false, Discoverable: false}},\n\t\t\t},\n\t\t\tspec: configv1alpha1.FeatureGateSpec{\n\t\t\t\tFeatures: []configv1alpha1.FeatureReference{\n\t\t\t\t\t{Name: \"one\", Activate: true},\n\t\t\t\t\t{Name: \"two\", Activate: false},\n\t\t\t\t\t{Name: \"three\", Activate: true},\n\t\t\t\t\t{Name: \"four\", Activate: false},\n\t\t\t\t\t{Name: \"six\", Activate: true},\n\t\t\t\t\t{Name: \"seven\", Activate: true},\n\t\t\t\t\t{Name: \"eight\", Activate: false},\n\t\t\t\t\t{Name: \"nine\", Activate: true},\n\t\t\t\t\t{Name: \"ten\", Activate: true},\n\t\t\t\t}},\n\t\t\texpectedActivated:   []string{\"one\", \"three\", \"eleven\"},\n\t\t\texpectedDeactivated: []string{\"two\", \"four\", \"five\", \"twelve\", \"thirteen\"},\n\t\t\texpectedUnavailable: []string{\"six\", \"seven\", \"eight\", \"nine\", \"ten\"},\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tactivated, deactivated, unavailable := ComputeFeatureStates(tc.spec, tc.features)\n\n\t\t\tif diff := stringcmp.SliceDiffIgnoreOrder(activated, tc.expectedActivated); diff != \"\" {\n\t\t\t\tt.Errorf(\"got activated features %v, want %v, diff: %s\", activated, tc.expectedActivated, diff)\n\t\t\t}\n\n\t\t\tif diff := stringcmp.SliceDiffIgnoreOrder(deactivated, tc.expectedDeactivated); diff != \"\" {\n\t\t\t\tt.Errorf(\"got deactivated features %v, want %v, diff: %s\", deactivated, tc.expectedDeactivated, diff)\n\t\t\t}\n\n\t\t\tif diff := stringcmp.SliceDiffIgnoreOrder(unavailable, tc.expectedUnavailable); diff != \"\" {\n\t\t\t\tt.Errorf(\"got unavailable features %v, want %v, diff: %s\", unavailable, tc.expectedUnavailable, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestFeaturesActivatedInNamespacesMatchingSelector(t *testing.T) {\n\tscheme, err := configv1alpha1.SchemeBuilder.Build()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif err := k8sscheme.AddToScheme(scheme); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tnewNamespace := func(name string) *corev1.Namespace {\n\t\treturn &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: name, Labels: map[string]string{\"kubernetes.io/metadata.name\": name}}}\n\t}\n\n\tnewFeatureGate := func(name string, namespaces, activated, deactivated, unavailable []string) *configv1alpha1.FeatureGate {\n\t\treturn &configv1alpha1.FeatureGate{\n\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\tName: name,\n\t\t\t},\n\t\t\tStatus: configv1alpha1.FeatureGateStatus{\n\t\t\t\tNamespaces:          namespaces,\n\t\t\t\tActivatedFeatures:   activated,\n\t\t\t\tDeactivatedFeatures: deactivated,\n\t\t\t\tUnavailableFeatures: unavailable,\n\t\t\t}}\n\t}\n\n\ttestCases := []struct {\n\t\tdescription     string\n\t\texistingObjects []runtime.Object\n\t\tselector        metav1.LabelSelector\n\t\tfeatures        []string\n\t\twant            bool\n\t\terr             string\n\t}{\n\t\t{\n\t\t\tdescription: \"Namespace matched by selector is gated and all features are activated\",\n\t\t\texistingObjects: []runtime.Object{\n\t\t\t\tnewNamespace(\"kube-system\"),\n\t\t\t\tnewNamespace(\"kube-public\"),\n\t\t\t\tnewNamespace(\"tkg-system\"),\n\t\t\t\tnewFeatureGate(\"tkg\", []string{\"kube-system\", \"tkg-system\"}, []string{\"one\", \"two\"}, []string{\"three\", \"four\"}, []string{\"five\", \"six\"}),\n\t\t\t},\n\t\t\tselector: metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{\n\t\t\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpIn, Values: []string{\"tkg-system\"}},\n\t\t\t}},\n\t\t\tfeatures: []string{\"one\", \"two\"},\n\t\t\twant:     true,\n\t\t\terr:      \"\",\n\t\t},\n\t\t{\n\t\t\tdescription: \"Namespace matched by selector is gated and one feature is deactivated\",\n\t\t\texistingObjects: []runtime.Object{\n\t\t\t\tnewNamespace(\"kube-system\"),\n\t\t\t\tnewNamespace(\"ns-no-feature-gates\"),\n\t\t\t\tnewNamespace(\"tkg-system\"),\n\t\t\t\tnewFeatureGate(\"tkg\", []string{\"kube-system\", \"tkg-system\"}, []string{\"one\", \"two\"}, []string{\"three\", \"four\"}, []string{\"five\", \"six\"}),\n\t\t\t},\n\t\t\tselector: metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{\n\t\t\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpIn, Values: []string{\"tkg-system\"}},\n\t\t\t}},\n\t\t\tfeatures: []string{\"one\", \"three\"},\n\t\t\twant:     false,\n\t\t\terr:      \"\",\n\t\t},\n\t\t{\n\t\t\tdescription: \"Namespaces matched by selector are gated and all features are activated\",\n\t\t\texistingObjects: []runtime.Object{\n\t\t\t\tnewNamespace(\"kube-system\"),\n\t\t\t\tnewNamespace(\"ns-no-feature-gates\"),\n\t\t\t\tnewNamespace(\"tkg-system\"),\n\t\t\t\tnewFeatureGate(\"tkg\", []string{\"kube-system\", \"tkg-system\"}, []string{\"one\", \"two\"}, []string{\"three\", \"four\"}, []string{\"five\", \"six\"}),\n\t\t\t},\n\t\t\tselector: metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{\n\t\t\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpIn, Values: []string{\"tkg-system\", \"kube-system\"}},\n\t\t\t}},\n\t\t\tfeatures: []string{\"one\", \"two\"},\n\t\t\twant:     true,\n\t\t\terr:      \"\",\n\t\t},\n\t\t{\n\t\t\tdescription: \"Namespaces matched by selector are gated and all features are activated across multiple feature gates\",\n\t\t\texistingObjects: []runtime.Object{\n\t\t\t\tnewNamespace(\"kube-system\"),\n\t\t\t\tnewNamespace(\"ns-no-feature-gates\"),\n\t\t\t\tnewNamespace(\"tkg-system\"),\n\t\t\t\tnewFeatureGate(\"tkg\", []string{\"kube-system\", \"tkg-system\"}, []string{\"one\", \"two\"}, []string{\"three\", \"four\"}, []string{\"five\", \"six\"}),\n\t\t\t\tnewFeatureGate(\"dev\", []string{\"kube-public\"}, []string{\"one\", \"two\"}, []string{\"three\"}, []string{}),\n\t\t\t},\n\t\t\tselector: metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{\n\t\t\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpIn, Values: []string{\"tkg-system\", \"kube-system\", \"kube-public\"}},\n\t\t\t}},\n\t\t\tfeatures: []string{\"one\", \"two\"},\n\t\t\twant:     true,\n\t\t\terr:      \"\",\n\t\t},\n\t\t{\n\t\t\tdescription: \"Namespaces are gated and all features are either deactivated or unavailable\",\n\t\t\texistingObjects: []runtime.Object{\n\t\t\t\tnewNamespace(\"kube-system\"),\n\t\t\t\tnewNamespace(\"kube-public\"),\n\t\t\t\tnewNamespace(\"tkg-system\"),\n\t\t\t\tnewFeatureGate(\"tkg\", []string{\"kube-system\", \"tkg-system\"}, []string{\"one\", \"two\"}, []string{\"three\", \"four\"}, []string{\"five\", \"six\"}),\n\t\t\t},\n\t\t\tselector: metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{\n\t\t\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpIn, Values: []string{\"tkg-system\"}},\n\t\t\t}},\n\t\t\tfeatures: []string{\"five\", \"three\"},\n\t\t\twant:     false,\n\t\t\terr:      \"\",\n\t\t},\n\t\t{\n\t\t\tdescription: \"Label selector matches only one namespace with all features activated\",\n\t\t\texistingObjects: []runtime.Object{\n\t\t\t\tnewNamespace(\"kube-system\"),\n\t\t\t\tnewNamespace(\"kube-public\"),\n\t\t\t\tnewNamespace(\"tkg-system\"),\n\t\t\t\tnewFeatureGate(\"tkg\", []string{\"kube-system\", \"tkg-system\"}, []string{\"one\", \"two\"}, []string{\"three\", \"four\"}, []string{\"five\", \"six\"}),\n\t\t\t},\n\t\t\tselector: metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{\n\t\t\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpIn, Values: []string{\"tkg-system\", \"ns-no-feature-gates\"}},\n\t\t\t}},\n\t\t\tfeatures: []string{\"one\", \"two\"},\n\t\t\twant:     true,\n\t\t\terr:      \"\",\n\t\t},\n\t\t{\n\t\t\tdescription: \"Label selector matches two namespaces where a feature is in different activation states\",\n\t\t\texistingObjects: []runtime.Object{\n\t\t\t\tnewNamespace(\"kube-system\"),\n\t\t\t\tnewNamespace(\"kube-public\"),\n\t\t\t\tnewNamespace(\"tkg-system\"),\n\t\t\t\tnewFeatureGate(\"tkg\", []string{\"kube-system\", \"tkg-system\"}, []string{\"one\"}, []string{}, []string{}),\n\t\t\t\tnewFeatureGate(\"dev\", []string{\"kube-public\"}, []string{}, []string{\"one\"}, []string{}),\n\t\t\t},\n\t\t\tselector: metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{\n\t\t\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpIn, Values: []string{\"tkg-system\", \"kube-public\"}},\n\t\t\t}},\n\t\t\tfeatures: []string{\"one\"},\n\t\t\twant:     false,\n\t\t\terr:      \"\",\n\t\t},\n\t\t{\n\t\t\tdescription: \"Label selector matches no namespaces\",\n\t\t\texistingObjects: []runtime.Object{\n\t\t\t\tnewNamespace(\"kube-system\"),\n\t\t\t\tnewNamespace(\"kube-public\"),\n\t\t\t\tnewNamespace(\"tkg-system\"),\n\t\t\t\tnewFeatureGate(\"tkg\", []string{\"kube-system\", \"tkg-system\"}, []string{\"one\", \"two\"}, []string{\"three\", \"four\"}, []string{\"five\", \"six\"}),\n\t\t\t},\n\t\t\tselector: metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{\n\t\t\t\t// LabelSelectorRequirement are ANDed.\n\t\t\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpIn, Values: []string{\"tkg-system\"}},\n\t\t\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpIn, Values: []string{\"ns-no-feature-gates\"}},\n\t\t\t}},\n\t\t\tfeatures: []string{\"one\", \"two\"},\n\t\t\twant:     false,\n\t\t\terr:      \"\",\n\t\t},\n\t\t{\n\t\t\tdescription: \"Features are not gated in any of the namespaces\",\n\t\t\texistingObjects: []runtime.Object{\n\t\t\t\tnewNamespace(\"kube-system\"),\n\t\t\t\tnewNamespace(\"kube-public\"),\n\t\t\t\tnewNamespace(\"tkg-system\"),\n\t\t\t\tnewFeatureGate(\"tkg\", []string{\"kube-system\", \"tkg-system\"}, []string{\"one\", \"two\"}, []string{\"three\", \"four\"}, []string{\"five\", \"six\"}),\n\t\t\t},\n\t\t\tselector: metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{\n\t\t\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpIn, Values: []string{\"ns-no-feature-gates\"}},\n\t\t\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpIn, Values: []string{\"kube-public\"}},\n\t\t\t}},\n\t\t\tfeatures: []string{\"one\", \"two\"},\n\t\t\twant:     false,\n\t\t\terr:      \"\",\n\t\t},\n\t\t{\n\t\t\tdescription: \"No features specified\",\n\t\t\texistingObjects: []runtime.Object{\n\t\t\t\tnewNamespace(\"kube-system\"),\n\t\t\t\tnewNamespace(\"kube-public\"),\n\t\t\t\tnewNamespace(\"tkg-system\"),\n\t\t\t\tnewFeatureGate(\"tkg\", []string{\"kube-system\", \"tkg-system\"}, []string{\"one\", \"two\"}, []string{\"three\", \"four\"}, []string{\"five\", \"six\"}),\n\t\t\t},\n\t\t\tselector: metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{\n\t\t\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpIn, Values: []string{\"ns-no-feature-gates\"}},\n\t\t\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpIn, Values: []string{\"kube-public\"}},\n\t\t\t}},\n\t\t\tfeatures: []string{},\n\t\t\twant:     false,\n\t\t\terr:      \"\",\n\t\t},\n\t\t{\n\t\t\tdescription: \"Error due to bad namespace selector\",\n\t\t\texistingObjects: []runtime.Object{\n\t\t\t\tnewNamespace(\"kube-system\"),\n\t\t\t\tnewNamespace(\"kube-public\"),\n\t\t\t\tnewNamespace(\"tkg-system\"),\n\t\t\t\tnewFeatureGate(\"tkg\", []string{\"kube-system\", \"tkg-system\"}, []string{\"one\", \"two\"}, []string{\"three\", \"four\"}, []string{\"five\", \"six\"}),\n\t\t\t},\n\t\t\tselector: metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{\n\t\t\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpExists, Values: []string{\"bad-value\"}},\n\t\t\t}},\n\t\t\tfeatures: []string{},\n\t\t\twant:     false,\n\t\t\terr:      \"failed to get namespaces from NamespaceSelector\",\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tfakeClient := fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(tc.existingObjects...).Build()\n\t\t\tgot, err := FeaturesActivatedInNamespacesMatchingSelector(context.Background(), fakeClient, tc.selector, tc.features)\n\t\t\tif err != nil {\n\t\t\t\tif tc.err == \"\" {\n\t\t\t\t\tt.Errorf(\"no error string specified, but got error: %v\", err)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(err.Error(), tc.err) {\n\t\t\t\t\tt.Errorf(\"error string=%q doesn't match partial=%q\", tc.err, err)\n\t\t\t\t}\n\t\t\t} else if tc.err != \"\" {\n\t\t\t\tt.Errorf(\"error string=%q specified but error not found\", tc.err)\n\t\t\t}\n\t\t\tif got != tc.want {\n\t\t\t\tt.Errorf(\"feature activation: got %t, want %t\", got, tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestIsFeatureActivated(t *testing.T) {\n\tscheme, err := corev1alpha2.SchemeBuilder.Build()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tfeatures := []runtime.Object{\n\t\t&corev1alpha2.Feature{\n\t\t\tObjectMeta: metav1.ObjectMeta{Name: \"foo\"},\n\t\t\tSpec:       corev1alpha2.FeatureSpec{Description: \"foo\", Stability: \"Stable\"},\n\t\t\tStatus:     corev1alpha2.FeatureStatus{Activated: true},\n\t\t},\n\t\t&corev1alpha2.Feature{\n\t\t\tObjectMeta: metav1.ObjectMeta{Name: \"bar\"},\n\t\t\tSpec:       corev1alpha2.FeatureSpec{Description: \"bar\", Stability: \"Technical Preview\"},\n\t\t\tStatus:     corev1alpha2.FeatureStatus{Activated: false},\n\t\t},\n\t}\n\tfakeClient := fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(features...).Build()\n\tctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)\n\tdefer cancel()\n\ttestCases := []struct {\n\t\tdescription string\n\t\tfeatureName string\n\t\twant        bool\n\t\treturnErr   bool\n\t}{\n\t\t{\n\t\t\tdescription: \"should return true for activated feature\",\n\t\t\tfeatureName: \"foo\",\n\t\t\twant:        true,\n\t\t\treturnErr:   false,\n\t\t},\n\t\t{\n\t\t\tdescription: \"should return false for deactivated feature\",\n\t\t\tfeatureName: \"bar\",\n\t\t\twant:        false,\n\t\t\treturnErr:   false,\n\t\t},\n\t\t{\n\t\t\tdescription: \"should return error when feature doesn't exist\",\n\t\t\tfeatureName: \"baz\",\n\t\t\twant:        false,\n\t\t\treturnErr:   true,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tactivated, err := IsFeatureActivated(ctx, fakeClient, tc.featureName)\n\t\t\tif err != nil {\n\t\t\t\tif !tc.returnErr {\n\t\t\t\t\tt.Errorf(\"error not expected, but got error: %v\", err)\n\t\t\t\t}\n\t\t\t} else if tc.returnErr {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Errorf(\"error expected, but got nothing\")\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif activated != tc.want {\n\t\t\t\t\tt.Errorf(\"returned activated state is not expected\")\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestGetFeatureGateForFeature(t *testing.T) {\n\tscheme, err := corev1alpha2.SchemeBuilder.Build()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tfeatures := []runtime.Object{\n\t\t&corev1alpha2.Feature{\n\t\t\tObjectMeta: metav1.ObjectMeta{Name: \"foo\"},\n\t\t\tSpec:       corev1alpha2.FeatureSpec{Description: \"foo\", Stability: \"Stable\"},\n\t\t},\n\t\t&corev1alpha2.Feature{\n\t\t\tObjectMeta: metav1.ObjectMeta{Name: \"bar\"},\n\t\t\tSpec:       corev1alpha2.FeatureSpec{Description: \"bar\", Stability: \"Technical Preview\"},\n\t\t},\n\t\t&corev1alpha2.Feature{\n\t\t\tObjectMeta: metav1.ObjectMeta{Name: \"baz\"},\n\t\t\tSpec:       corev1alpha2.FeatureSpec{Description: \"baz\", Stability: \"Technical Preview\"},\n\t\t},\n\t}\n\tfeatureGates := []runtime.Object{\n\t\t&corev1alpha2.FeatureGate{\n\t\t\tObjectMeta: metav1.ObjectMeta{Name: \"my-featuregate\"},\n\t\t\tSpec: corev1alpha2.FeatureGateSpec{\n\t\t\t\tFeatures: []corev1alpha2.FeatureReference{\n\t\t\t\t\t{Name: \"foo\", Activate: true},\n\t\t\t\t\t{Name: \"bar\", Activate: false},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\tvar objs []runtime.Object\n\tobjs = append(objs, featureGates...)\n\tobjs = append(objs, features...)\n\tfakeClient := fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(objs...).Build()\n\tctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)\n\tdefer cancel()\n\ttestCases := []struct {\n\t\tdescription           string\n\t\tfeatureName           string\n\t\twant                  bool\n\t\twantedFeatureGateName string\n\t\treturnErr             bool\n\t}{\n\t\t{\n\t\t\tdescription:           \"should return true when feature is found in any featuregate\",\n\t\t\tfeatureName:           \"foo\",\n\t\t\twant:                  true,\n\t\t\twantedFeatureGateName: \"my-featuregate\",\n\t\t\treturnErr:             false,\n\t\t},\n\t\t{\n\t\t\tdescription:           \"should return false when feature is not found in any featuregate\",\n\t\t\tfeatureName:           \"bax\",\n\t\t\twant:                  false,\n\t\t\twantedFeatureGateName: \"\",\n\t\t\treturnErr:             false,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tfg, found, err := GetFeatureGateForFeature(ctx, fakeClient, tc.featureName)\n\t\t\tif err != nil {\n\t\t\t\tif !tc.returnErr {\n\t\t\t\t\tt.Errorf(\"error not expected, but got error: %v\", err)\n\t\t\t\t}\n\t\t\t} else if tc.returnErr {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Errorf(\"error expected, but got nothing\")\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif found != tc.want {\n\t\t\t\t\tt.Errorf(\"unexpected result\")\n\t\t\t\t}\n\t\t\t\tif fg != nil && fg.Name != tc.wantedFeatureGateName {\n\t\t\t\t\tt.Errorf(\"featuregate returned is not expected \")\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestGetFeatureGateWithFeatureInStatus(t *testing.T) {\n\tscheme, err := corev1alpha2.SchemeBuilder.Build()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tfeatures := []runtime.Object{\n\t\t&corev1alpha2.Feature{\n\t\t\tObjectMeta: metav1.ObjectMeta{Name: \"foo\"},\n\t\t\tSpec:       corev1alpha2.FeatureSpec{Description: \"foo\", Stability: \"Stable\"},\n\t\t},\n\t\t&corev1alpha2.Feature{\n\t\t\tObjectMeta: metav1.ObjectMeta{Name: \"bar\"},\n\t\t\tSpec:       corev1alpha2.FeatureSpec{Description: \"bar\", Stability: \"Technical Preview\"},\n\t\t},\n\t\t&corev1alpha2.Feature{\n\t\t\tObjectMeta: metav1.ObjectMeta{Name: \"baz\"},\n\t\t\tSpec:       corev1alpha2.FeatureSpec{Description: \"baz\", Stability: \"Experimental\"},\n\t\t},\n\t}\n\tfeatureGates := []runtime.Object{\n\t\t&corev1alpha2.FeatureGate{\n\t\t\tObjectMeta: metav1.ObjectMeta{Name: \"my-featuregate\"},\n\t\t\tSpec: corev1alpha2.FeatureGateSpec{\n\t\t\t\tFeatures: []corev1alpha2.FeatureReference{\n\t\t\t\t\t{Name: \"foo\", Activate: true},\n\t\t\t\t\t{Name: \"bar\", Activate: false},\n\t\t\t\t},\n\t\t\t},\n\t\t\tStatus: corev1alpha2.FeatureGateStatus{FeatureReferenceResults: []corev1alpha2.FeatureReferenceResult{\n\t\t\t\t{\n\t\t\t\t\tName:    \"foo\",\n\t\t\t\t\tStatus:  \"Applied\",\n\t\t\t\t\tMessage: \"Feature has been toggled\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName:    \"bar\",\n\t\t\t\t\tStatus:  \"Invalid\",\n\t\t\t\t\tMessage: \"Toggling this feature voids the warranty\",\n\t\t\t\t},\n\t\t\t}},\n\t\t},\n\t}\n\tvar objs []runtime.Object\n\tobjs = append(objs, featureGates...)\n\tobjs = append(objs, features...)\n\tfakeClient := fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(objs...).Build()\n\tctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)\n\tdefer cancel()\n\ttestCases := []struct {\n\t\tdescription           string\n\t\tfeatureName           string\n\t\twant                  bool\n\t\twantedFeatureGateName string\n\t\treturnErr             bool\n\t}{\n\t\t{\n\t\t\tdescription:           \"should return true when feature is found in any featuregate status\",\n\t\t\tfeatureName:           \"foo\",\n\t\t\twant:                  true,\n\t\t\twantedFeatureGateName: \"my-featuregate\",\n\t\t\treturnErr:             false,\n\t\t},\n\t\t{\n\t\t\tdescription:           \"should return false when feature is not found in any featuregate status\",\n\t\t\tfeatureName:           \"baz\",\n\t\t\twant:                  false,\n\t\t\twantedFeatureGateName: \"\",\n\t\t\treturnErr:             false,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tfg, found, err := GetFeatureGateWithFeatureInStatus(ctx, fakeClient, tc.featureName)\n\t\t\tif err != nil {\n\t\t\t\tif !tc.returnErr {\n\t\t\t\t\tt.Errorf(\"error not expected, but got error: %v\", err)\n\t\t\t\t}\n\t\t\t} else if tc.returnErr {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Errorf(\"error expected, but got nothing\")\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif found != tc.want {\n\t\t\t\t\tt.Errorf(\"unexpected result\")\n\t\t\t\t}\n\t\t\t\tif fg != nil && fg.Name != tc.wantedFeatureGateName {\n\t\t\t\t\tt.Errorf(\"featuregate returned is not expected \")\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestGetFeatureReferenceFromFeatureGate(t *testing.T) {\n\tfeatureGate := &corev1alpha2.FeatureGate{\n\t\tObjectMeta: metav1.ObjectMeta{Name: \"my-featuregate\"},\n\t\tSpec: corev1alpha2.FeatureGateSpec{\n\t\t\tFeatures: []corev1alpha2.FeatureReference{\n\t\t\t\t{Name: \"foo\", Activate: true},\n\t\t\t\t{Name: \"bar\", Activate: false},\n\t\t\t},\n\t\t},\n\t}\n\n\ttestCases := []struct {\n\t\tdescription string\n\t\tfeatureName string\n\t\twant        bool\n\t}{\n\t\t{\n\t\t\tdescription: \"should return true when feature reference is found for feature in a particular featuregate spec\",\n\t\t\tfeatureName: \"foo\",\n\t\t\twant:        true,\n\t\t},\n\t\t{\n\t\t\tdescription: \"should return false when feature reference is not found for feature in a particular featuregate spec\",\n\t\t\tfeatureName: \"baz\",\n\t\t\twant:        false,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tfeatRef, found := GetFeatureReferenceFromFeatureGate(featureGate, tc.featureName)\n\t\t\tif found {\n\t\t\t\tif found != tc.want {\n\t\t\t\t\tt.Errorf(\"feature ref not expected but found\")\n\t\t\t\t}\n\t\t\t\tif featRef.Name != tc.featureName {\n\t\t\t\t\tt.Errorf(\"expected feature ref is not returned\")\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "featuregates/client/pkg/util/namespace_selector.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage util\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\tcorev1 \"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n)\n\n// NamespacesMatchingSelector returns the list of namespaces after applying the NamespaceSelector filter.\n// Note that a nil selector selects nothing, while an empty selector selects everything.\n// Callers using this function in feature gates context should be sending a pointer to an empty selector instead of nil.\nfunc NamespacesMatchingSelector(ctx context.Context, c client.Client, selector *metav1.LabelSelector) ([]string, error) {\n\ts, err := metav1.LabelSelectorAsSelector(selector)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to get namespaces from NamespaceSelector: %w\", err)\n\t}\n\n\tnsList := &corev1.NamespaceList{}\n\terr = c.List(ctx, nsList, client.MatchingLabelsSelector{Selector: s})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to get namespaces from NamespaceSelector: %w\", err)\n\t}\n\n\tvar namespaces []string\n\tfor i := range nsList.Items {\n\t\tnamespaces = append(namespaces, nsList.Items[i].Name)\n\t}\n\treturn namespaces, nil\n}\n"
  },
  {
    "path": "featuregates/client/pkg/util/namespace_selector_test.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage util\n\nimport (\n\t\"context\"\n\t\"strings\"\n\t\"testing\"\n\n\tcorev1 \"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\tk8sscheme \"k8s.io/client-go/kubernetes/scheme\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client/fake\"\n\n\tstringcmp \"github.com/vmware-tanzu/tanzu-framework/util/cmp/strings\"\n)\n\nfunc TestNamespacesMatchingSelector(t *testing.T) {\n\tnewNamespace := func(name string) *corev1.Namespace {\n\t\treturn &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: name, Labels: map[string]string{\"kubernetes.io/metadata.name\": name}}}\n\t}\n\n\ttestCases := []struct {\n\t\tdescription        string\n\t\texistingNamespaces []runtime.Object\n\t\tnamespaceSelector  *metav1.LabelSelector\n\t\twant               []string\n\t\terr                string\n\t}{\n\t\t{\n\t\t\tdescription:        \"Empty namespace selector - all namespaces selected\",\n\t\t\texistingNamespaces: []runtime.Object{newNamespace(\"default\"), newNamespace(\"kube-system\"), newNamespace(\"kube-public\"), newNamespace(\"tkg-system\")},\n\t\t\tnamespaceSelector:  &metav1.LabelSelector{},\n\t\t\twant:               []string{\"default\", \"kube-system\", \"tkg-system\", \"kube-public\"},\n\t\t\terr:                \"\",\n\t\t},\n\t\t{\n\t\t\t// Callers interested in feature gates should not be sending a nil namespaces, but this is a generic function.\n\t\t\tdescription: \"Nil namespace selector - no namespaces selected\",\n\t\t\texistingNamespaces: []runtime.Object{\n\t\t\t\tnewNamespace(\"default\"),\n\t\t\t\tnewNamespace(\"kube-system\"),\n\t\t\t\tnewNamespace(\"kube-public\"),\n\t\t\t\tnewNamespace(\"tkg-system\"),\n\t\t\t},\n\t\t\tnamespaceSelector: nil,\n\t\t\twant:              []string{},\n\t\t\terr:               \"\",\n\t\t},\n\t\t{\n\t\t\tdescription:        \"Selector that matches partially\",\n\t\t\texistingNamespaces: []runtime.Object{newNamespace(\"default\"), newNamespace(\"kube-system\"), newNamespace(\"kube-public\"), newNamespace(\"tkg-system\")},\n\t\t\tnamespaceSelector: &metav1.LabelSelector{\n\t\t\t\tMatchExpressions: []metav1.LabelSelectorRequirement{\n\t\t\t\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpIn, Values: []string{\"kube-system\", \"tkg-system\", \"badlabel\"}},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: []string{\"kube-system\", \"tkg-system\"},\n\t\t\terr:  \"\",\n\t\t},\n\t\t{\n\t\t\tdescription:        \"Selector that doesn't match anything\",\n\t\t\texistingNamespaces: []runtime.Object{newNamespace(\"default\"), newNamespace(\"kube-system\"), newNamespace(\"kube-public\"), newNamespace(\"tkg-system\")},\n\t\t\tnamespaceSelector: &metav1.LabelSelector{\n\t\t\t\tMatchExpressions: []metav1.LabelSelectorRequirement{\n\t\t\t\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpIn, Values: []string{\"badlabel1\", \"badlabel2\"}},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: []string{},\n\t\t\terr:  \"\",\n\t\t},\n\t\t{\n\t\t\tdescription:        \"Bad namespace selector - error\",\n\t\t\texistingNamespaces: []runtime.Object{newNamespace(\"default\"), newNamespace(\"kube-system\"), newNamespace(\"kube-public\"), newNamespace(\"tkg-system\")},\n\t\t\tnamespaceSelector: &metav1.LabelSelector{\n\t\t\t\tMatchExpressions: []metav1.LabelSelectorRequirement{\n\t\t\t\t\t{Key: \"kubernetes.io/metadata.name\", Operator: metav1.LabelSelectorOpExists, Values: []string{\"value-should-not-be-here\"}},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: []string{},\n\t\t\terr:  \"failed to get namespaces from NamespaceSelector\",\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tfakeClient := fake.NewClientBuilder().WithScheme(k8sscheme.Scheme).WithRuntimeObjects(tc.existingNamespaces...).Build()\n\t\t\tgot, err := NamespacesMatchingSelector(context.Background(), fakeClient, tc.namespaceSelector)\n\t\t\tif err != nil {\n\t\t\t\tif tc.err == \"\" {\n\t\t\t\t\tt.Errorf(\"no error string specified, but got error: %v\", err)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(err.Error(), tc.err) {\n\t\t\t\t\tt.Errorf(\"error string=%q doesn't match partial=%q\", tc.err, err)\n\t\t\t\t}\n\t\t\t} else if tc.err != \"\" {\n\t\t\t\tt.Errorf(\"error string=%q specified but error not found\", tc.err)\n\t\t\t}\n\t\t\tif diff := stringcmp.SliceDiffIgnoreOrder(got, tc.want); diff != \"\" {\n\t\t\t\tt.Errorf(\"got namespaces: %v, want namespaces: %v, diff: %s\", got, tc.want, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "featuregates/controller/go.mod",
    "content": "module github.com/vmware-tanzu/tanzu-framework/featuregates/controller\n\ngo 1.19\n\nreplace (\n\tgithub.com/vmware-tanzu/tanzu-framework/apis/config => ../../apis/config\n\tgithub.com/vmware-tanzu/tanzu-framework/apis/core => ../../apis/core\n\tgithub.com/vmware-tanzu/tanzu-framework/featuregates/client => ../client\n\tgithub.com/vmware-tanzu/tanzu-framework/util => ../../util\n)\n\nrequire (\n\tgithub.com/go-logr/logr v1.2.3\n\tgithub.com/onsi/ginkgo/v2 v2.8.4\n\tgithub.com/onsi/gomega v1.27.1\n\tgithub.com/vmware-tanzu/tanzu-framework/apis/config v0.0.0-20220824221239-af5a644ffef7\n\tgithub.com/vmware-tanzu/tanzu-framework/apis/core v0.0.0-00010101000000-000000000000\n\tgithub.com/vmware-tanzu/tanzu-framework/featuregates/client v0.0.0-20221024130358-59eae49d96aa\n\tgithub.com/vmware-tanzu/tanzu-framework/util v0.0.0-00010101000000-000000000000\n\tk8s.io/api v0.25.4\n\tk8s.io/apimachinery v0.25.4\n\tk8s.io/client-go v0.25.4\n\tk8s.io/component-base v0.25.4\n\tsigs.k8s.io/controller-runtime v0.12.3\n)\n\nrequire (\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/blendle/zapdriver v1.3.1 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.1.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.1 // indirect\n\tgithub.com/emicklei/go-restful/v3 v3.9.0 // indirect\n\tgithub.com/evanphx/json-patch v5.6.0+incompatible // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/go-logr/zapr v1.2.3 // indirect\n\tgithub.com/go-openapi/jsonpointer v0.19.5 // indirect\n\tgithub.com/go-openapi/jsonreference v0.20.0 // indirect\n\tgithub.com/go-openapi/swag v0.22.3 // indirect\n\tgithub.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect\n\tgithub.com/gogo/protobuf v1.3.2 // indirect\n\tgithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/gnostic v0.6.9 // indirect\n\tgithub.com/google/go-cmp v0.5.9 // indirect\n\tgithub.com/google/gofuzz v1.2.0 // indirect\n\tgithub.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect\n\tgithub.com/google/uuid v1.3.0 // indirect\n\tgithub.com/imdario/mergo v0.3.13 // indirect\n\tgithub.com/inconshreveable/mousetrap v1.0.0 // indirect\n\tgithub.com/josharian/intern v1.0.0 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/mailru/easyjson v0.7.7 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect\n\tgithub.com/pkg/errors v0.9.1 // indirect\n\tgithub.com/prometheus/client_golang v1.14.0 // indirect\n\tgithub.com/prometheus/client_model v0.3.0 // indirect\n\tgithub.com/prometheus/common v0.37.0 // indirect\n\tgithub.com/prometheus/procfs v0.8.0 // indirect\n\tgithub.com/spf13/cobra v1.5.0 // indirect\n\tgithub.com/spf13/pflag v1.0.5 // indirect\n\tgo.uber.org/atomic v1.9.0 // indirect\n\tgo.uber.org/multierr v1.6.0 // indirect\n\tgo.uber.org/zap v1.19.1 // indirect\n\tgolang.org/x/net v0.8.0 // indirect\n\tgolang.org/x/oauth2 v0.3.0 // indirect\n\tgolang.org/x/sys v0.6.0 // indirect\n\tgolang.org/x/term v0.6.0 // indirect\n\tgolang.org/x/text v0.8.0 // indirect\n\tgolang.org/x/time v0.3.0 // indirect\n\tgolang.org/x/tools v0.6.0 // indirect\n\tgomodules.xyz/jsonpatch/v2 v2.2.0 // indirect\n\tgoogle.golang.org/appengine v1.6.7 // indirect\n\tgoogle.golang.org/protobuf v1.28.1 // indirect\n\tgopkg.in/inf.v0 v0.9.1 // indirect\n\tgopkg.in/yaml.v2 v2.4.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tk8s.io/apiextensions-apiserver v0.25.4 // indirect\n\tk8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54 // indirect\n\tk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect\n\tk8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 // indirect\n\tknative.dev/pkg v0.0.0-20230404101938-ee73c9355c9d // indirect\n\tsigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect\n\tsigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect\n\tsigs.k8s.io/yaml v1.3.0 // indirect\n)\n"
  },
  {
    "path": "featuregates/controller/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=\ngithub.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=\ngithub.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE=\ngithub.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc=\ngithub.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=\ngithub.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE=\ngithub.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ=\ngithub.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U=\ngithub.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=\ngithub.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=\ngithub.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A=\ngithub.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4=\ngithub.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=\ngithub.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA=\ngithub.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo=\ngithub.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=\ngithub.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=\ngithub.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=\ngithub.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0=\ngithub.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=\ngithub.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE=\ngithub.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=\ngithub.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk=\ngithub.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg=\ngithub.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=\ngithub.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=\ngithub.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=\ngithub.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=\ngithub.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=\ngithub.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=\ngithub.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=\ngithub.com/onsi/ginkgo/v2 v2.8.4 h1:gf5mIQ8cLFieruNLAdgijHF1PYfLphKm2dxxcUtcqK0=\ngithub.com/onsi/ginkgo/v2 v2.8.4/go.mod h1:427dEDQZkDKsBvCjc2A/ZPefhKxsTTrsQegMlayL730=\ngithub.com/onsi/gomega v1.27.1 h1:rfztXRbg6nv/5f+Raen9RcGoSecHIFgBBLQK3Wdj754=\ngithub.com/onsi/gomega v1.27.1/go.mod h1:aHX5xOykVYzWOV4WqQy0sy8BQptgukenXpCXfadcIAw=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=\ngithub.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU=\ngithub.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM=\ngithub.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=\ngithub.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=\ngithub.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=\ngithub.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=\ngithub.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=\ngo.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=\ngo.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=\ngo.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=\ngo.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=\ngo.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=\ngo.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=\ngo.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=\ngo.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=\ngo.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=\ngo.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=\ngo.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=\ngo.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=\ngo.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI=\ngo.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=\ngolang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8=\ngolang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw=\ngolang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=\ngolang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=\ngolang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY=\ngomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=\ngoogle.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=\ngoogle.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=\ngopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nk8s.io/api v0.25.4 h1:3YO8J4RtmG7elEgaWMb4HgmpS2CfY1QlaOz9nwB+ZSs=\nk8s.io/api v0.25.4/go.mod h1:IG2+RzyPQLllQxnhzD8KQNEu4c4YvyDTpSMztf4A0OQ=\nk8s.io/apiextensions-apiserver v0.25.4 h1:7hu9pF+xikxQuQZ7/30z/qxIPZc2J1lFElPtr7f+B6U=\nk8s.io/apiextensions-apiserver v0.25.4/go.mod h1:bkSGki5YBoZWdn5pWtNIdGvDrrsRWlmnvl9a+tAw5vQ=\nk8s.io/apimachinery v0.25.4 h1:CtXsuaitMESSu339tfhVXhQrPET+EiWnIY1rcurKnAc=\nk8s.io/apimachinery v0.25.4/go.mod h1:jaF9C/iPNM1FuLl7Zuy5b9v+n35HGSh6AQ4HYRkCqwo=\nk8s.io/client-go v0.25.4 h1:3RNRDffAkNU56M/a7gUfXaEzdhZlYhoW8dgViGy5fn8=\nk8s.io/client-go v0.25.4/go.mod h1:8trHCAC83XKY0wsBIpbirZU4NTUpbuhc2JnI7OruGZw=\nk8s.io/component-base v0.25.4 h1:n1bjg9Yt+G1C0WnIDJmg2fo6wbEU1UGMRiQSjmj7hNQ=\nk8s.io/component-base v0.25.4/go.mod h1:nnZJU8OP13PJEm6/p5V2ztgX2oyteIaAGKGMYb2L2cY=\nk8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54 h1:hWRbsoRWt44OEBnYUd4ceLy4ofBoh+p9vauWp/I5Gdg=\nk8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=\nk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s=\nk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4=\nk8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 h1:GfD9OzL11kvZN5iArC6oTS7RTj7oJOIfnislxYlqTj8=\nk8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=\nknative.dev/pkg v0.0.0-20230404101938-ee73c9355c9d h1:mubqXUjYfnwNg3IGWYEj2YffXYIxg44Qn9GS5vPAjck=\nknative.dev/pkg v0.0.0-20230404101938-ee73c9355c9d/go.mod h1:EQk8+qkZ8fMtrDYOOb9e9xMQG29N+L54iXBCfNXRm90=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio=\nsigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0=\nsigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k=\nsigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=\nsigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=\nsigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=\n"
  },
  {
    "path": "featuregates/controller/main.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage main\n\nimport (\n\t\"crypto/tls\"\n\t\"flag\"\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\tutilruntime \"k8s.io/apimachinery/pkg/util/runtime\"\n\tk8sscheme \"k8s.io/client-go/kubernetes/scheme\"\n\tcliflag \"k8s.io/component-base/cli/flag\"\n\tctrl \"sigs.k8s.io/controller-runtime\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\t\"sigs.k8s.io/controller-runtime/pkg/healthz\"\n\t\"sigs.k8s.io/controller-runtime/pkg/log/zap\"\n\n\t// +kubebuilder:scaffold:imports\n\n\tconfigv1alpha1 \"github.com/vmware-tanzu/tanzu-framework/apis/config/v1alpha1\"\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n\tcoreFeatureController \"github.com/vmware-tanzu/tanzu-framework/featuregates/controller/pkg/feature\"\n\tconfigFeatureGateController \"github.com/vmware-tanzu/tanzu-framework/featuregates/controller/pkg/featuregate\"\n\t\"github.com/vmware-tanzu/tanzu-framework/util/buildinfo\"\n\t\"github.com/vmware-tanzu/tanzu-framework/util/webhook/certs\"\n)\n\nvar (\n\tscheme                              = runtime.NewScheme()\n\tsetupLog                            = ctrl.Log.WithName(\"setup\")\n\tdefaultWebhookConfigLabel           = \"tanzu.vmware.com/featuregates-webhook-managed-certs=true\"\n\tdefaultWebhookServiceNamespace      = \"default\"\n\tdefaultWebhookServiceName           = \"tanzu-featuregates-webhook-service\"\n\tdefaultWebhookSecretNamespace       = \"default\"\n\tdefaultWebhookSecretName            = \"tanzu-featuregates-webhook-server-cert\" //nolint:gosec\n\tdefaultWebhookSecretVolumeMountPath = \"/tmp/k8s-webhook-server/serving-certs\"  //nolint:gosec\n)\n\nfunc init() {\n\tutilruntime.Must(k8sscheme.AddToScheme(scheme))\n\tutilruntime.Must(configv1alpha1.AddToScheme(scheme))\n\tutilruntime.Must(corev1alpha2.AddToScheme(scheme))\n\t//+kubebuilder:scaffold:scheme\n}\n\nfunc setCipherSuiteFunc(cipherSuiteString string) (func(cfg *tls.Config), error) {\n\tcipherSuites := strings.Split(cipherSuiteString, \",\")\n\tsuites, err := cliflag.TLSCipherSuites(cipherSuites)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn func(cfg *tls.Config) {\n\t\tcfg.CipherSuites = suites\n\t}, nil\n}\n\n//nolint:funlen\nfunc main() {\n\tvar (\n\t\twebhookServerPort            int\n\t\ttlsMinVersion                string\n\t\ttlsCipherSuites              string\n\t\twebhookConfigLabel           string\n\t\twebhookServiceNamespace      string\n\t\twebhookServiceName           string\n\t\twebhookSecretNamespace       string\n\t\twebhookSecretName            string\n\t\twebhookSecretVolumeMountPath string\n\t)\n\n\tflag.IntVar(&webhookServerPort, \"webhook-server-port\", 9443, \"The port that the webhook server serves at.\")\n\tflag.StringVar(&tlsMinVersion, \"tls-min-version\", \"1.2\", \"The minimum TLS version to be used by the webhook server. Recommended values are \\\"1.2\\\" and \\\"1.3\\\".\")\n\tflag.StringVar(&tlsCipherSuites, \"tls-cipher-suites\", \"\", \"Comma-separated list of cipher suites for the server. If omitted, the default Go cipher suites will be used.\\n\"+fmt.Sprintf(\"Possible values are %s.\", strings.Join(cliflag.TLSCipherPossibleValues(), \", \")))\n\tflag.StringVar(&webhookConfigLabel, \"webhook-config-label\", defaultWebhookConfigLabel, \"The label used to select webhook configurations to update the certs for.\")\n\tflag.StringVar(&webhookServiceNamespace, \"webhook-service-namespace\", defaultWebhookServiceNamespace, \"The namespace in which webhook service is installed.\")\n\tflag.StringVar(&webhookServiceName, \"webhook-service-name\", defaultWebhookServiceName, \"The name of the webhook service.\")\n\tflag.StringVar(&webhookSecretNamespace, \"webhook-secret-namespace\", defaultWebhookSecretNamespace, \"The namespace in which webhook secret is installed.\")\n\tflag.StringVar(&webhookSecretName, \"webhook-secret-name\", defaultWebhookSecretName, \"The name of the webhook secret.\")\n\tflag.StringVar(&webhookSecretVolumeMountPath, \"webhook-secret-volume-mount-path\", defaultWebhookSecretVolumeMountPath, \"The filesystem path to which the webhook secret is mounted.\")\n\n\topts := zap.Options{\n\t\tDevelopment: true,\n\t}\n\topts.BindFlags(flag.CommandLine)\n\tflag.Parse()\n\n\tctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts)))\n\n\tsetupLog.Info(\"Version\", \"version\", buildinfo.Version, \"buildDate\", buildinfo.Date, \"sha\", buildinfo.SHA)\n\n\tvar err error\n\tmgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{Scheme: scheme, MetricsBindAddress: \"0\", Port: webhookServerPort, CertDir: webhookSecretVolumeMountPath})\n\tif err != nil {\n\t\tsetupLog.Error(err, \"unable to start manager\")\n\t\tos.Exit(1)\n\t}\n\n\tmgr.GetWebhookServer().TLSMinVersion = tlsMinVersion\n\tif tlsCipherSuites != \"\" {\n\t\tcipherSuitesSetFunc, err := setCipherSuiteFunc(tlsCipherSuites)\n\t\tif err != nil {\n\t\t\tsetupLog.Error(err, \"unable to set TLS Cipher suites\")\n\t\t\tos.Exit(1)\n\t\t}\n\t\tmgr.GetWebhookServer().TLSOpts = append(mgr.GetWebhookServer().TLSOpts, cipherSuitesSetFunc)\n\t}\n\tif err = (&configFeatureGateController.FeatureGateReconciler{\n\t\tClient: mgr.GetClient(),\n\t\tLog:    ctrl.Log.WithName(\"controllers\").WithName(\"FeatureGate\").WithValues(\"apigroup\", \"config\"),\n\t\tScheme: mgr.GetScheme(),\n\t}).SetupWithManager(mgr); err != nil {\n\t\tsetupLog.Error(err, \"unable to create controller\", \"controller\", \"FeatureGate\", \"apigroup\", \"config\")\n\t\tos.Exit(1)\n\t}\n\n\tif err = (&coreFeatureController.FeatureReconciler{\n\t\tClient: mgr.GetClient(),\n\t\tLog:    ctrl.Log.WithName(\"controllers\").WithName(\"Feature\").WithValues(\"apigroup\", \"core\"),\n\t\tScheme: mgr.GetScheme(),\n\t}).SetupWithManager(mgr); err != nil {\n\t\tsetupLog.Error(err, \"unable to create controller\", \"controller\", \"Feature\", \"apigroup\", \"core\")\n\t\tos.Exit(1)\n\t}\n\n\tif err = (&configv1alpha1.FeatureGate{}).SetupWebhookWithManager(mgr); err != nil {\n\t\tsetupLog.Error(err, \"unable to create webhook\", \"webhook\", \"FeatureGate\", \"apigroup\", \"config\")\n\t\tos.Exit(1)\n\t}\n\n\tif err = (&corev1alpha2.FeatureGate{}).SetupWebhookWithManager(mgr); err != nil {\n\t\tsetupLog.Error(err, \"unable to create webhook\", \"webhook\", \"FeatureGate\", \"apigroup\", \"core\")\n\t\tos.Exit(1)\n\t}\n\n\t//+kubebuilder:scaffold:builder\n\n\tsignalHandler := ctrl.SetupSignalHandler()\n\n\tctrlClient, err := client.New(ctrl.GetConfigOrDie(), client.Options{})\n\tif err != nil {\n\t\tsetupLog.Error(err, \"unable to create ctrl client\")\n\t\tos.Exit(1)\n\t}\n\n\t// Start certificate manager\n\tsetupLog.Info(\"Starting certificate manager\")\n\tcertManagerOpts := &certs.Options{\n\t\tClient:                        ctrlClient,\n\t\tLogger:                        ctrl.Log.WithName(\"featuregates-webhook-cert-manager\"),\n\t\tCertDir:                       webhookSecretVolumeMountPath,\n\t\tWebhookConfigLabel:            webhookConfigLabel,\n\t\tRotationIntervalAnnotationKey: \"tanzu.vmware.com/featuregates-webhook-rotation-interval\",\n\t\tNextRotationAnnotationKey:     \"tanzu.vmware.com/featuregates-webhook-next-rotation\",\n\t\tRotationCountAnnotationKey:    \"tanzu.vmware.com/featuregates-webhook-rotation-count\",\n\t\tSecretName:                    webhookSecretName,\n\t\tSecretNamespace:               webhookSecretNamespace,\n\t\tServiceName:                   webhookServiceName,\n\t\tServiceNamespace:              webhookServiceNamespace,\n\t}\n\n\tcertManager, err := certs.New(certManagerOpts)\n\tif err != nil {\n\t\tsetupLog.Error(err, \"failed to create certificate manager\")\n\t\tos.Exit(1)\n\t}\n\n\t// Start cert manager.\n\tif err := certManager.Start(signalHandler); err != nil {\n\t\tsetupLog.Error(err, \"failed to start certificate manager\")\n\t\tos.Exit(1)\n\t}\n\n\t// Wait for cert dir to be ready.\n\tif err := certManager.WaitForCertDirReady(); err != nil {\n\t\tsetupLog.Error(err, \"certificates not ready\")\n\t\tos.Exit(1)\n\t}\n\n\tif err := mgr.AddHealthzCheck(\"healthz\", healthz.Ping); err != nil {\n\t\tsetupLog.Error(err, \"unable to set up health check\")\n\t\tos.Exit(1)\n\t}\n\tif err := mgr.AddReadyzCheck(\"readyz\", healthz.Ping); err != nil {\n\t\tsetupLog.Error(err, \"unable to set up ready check\")\n\t\tos.Exit(1)\n\t}\n\n\tsetupLog.Info(\"starting manager\")\n\tif err := mgr.Start(signalHandler); err != nil {\n\t\tsetupLog.Error(err, \"problem running manager\")\n\t\tos.Exit(1)\n\t}\n}\n"
  },
  {
    "path": "featuregates/controller/pkg/feature/doc.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package feature has the controller for Feature in core API group and is responsible for determining the feature's\n// activation state based on its stability level and any featuregate\npackage feature\n"
  },
  {
    "path": "featuregates/controller/pkg/feature/feature_controller.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage feature\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/go-logr/logr\"\n\tapierrors \"k8s.io/apimachinery/pkg/api/errors\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"k8s.io/apimachinery/pkg/types\"\n\t\"k8s.io/apimachinery/pkg/util/sets\"\n\tctrl \"sigs.k8s.io/controller-runtime\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\t\"sigs.k8s.io/controller-runtime/pkg/handler\"\n\t\"sigs.k8s.io/controller-runtime/pkg/reconcile\"\n\t\"sigs.k8s.io/controller-runtime/pkg/source\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n\t\"github.com/vmware-tanzu/tanzu-framework/featuregates/client/pkg/util\"\n)\n\nconst contextTimeout = 30 * time.Second\n\n// FeatureReconciler reconciles a Feature object.\ntype FeatureReconciler struct {\n\tclient.Client\n\tLog    logr.Logger\n\tScheme *runtime.Scheme\n}\n\n// +kubebuilder:rbac:groups=core.tanzu.vmware.com,resources=featuregates,verbs=get;list;watch;update;patch\n// +kubebuilder:rbac:groups=core.tanzu.vmware.com,resources=featuregates/status,verbs=get;update;patch\n// +kubebuilder:rbac:groups=core.tanzu.vmware.com,resources=features,verbs=get;list;watch;create;update;patch;delete\n// +kubebuilder:rbac:groups=core.tanzu.vmware.com,resources=features/status,verbs=get;update;patch\n\n// Reconcile reconciles the FeatureGate spec by computing activated, deactivated and unavailable features.\nfunc (r *FeatureReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {\n\tctxCancel, cancel := context.WithTimeout(ctx, contextTimeout)\n\tdefer cancel()\n\n\tlog := r.Log.WithValues(\"feature\", req.NamespacedName)\n\tlog.Info(\"Starting reconcile\")\n\n\tfeature := &corev1alpha2.Feature{}\n\tif err := r.Client.Get(ctxCancel, req.NamespacedName, feature); err != nil {\n\t\tif apierrors.IsNotFound(err) {\n\t\t\t// Reconcile deleted feature CR. If the Feature CR is deleted, check if that feature is being gated by\n\t\t\t// any FeatureGate.\n\t\t\t// 1. If the feature is being gated by a FeatureGate, update the status of FeatureGate by updating the\n\t\t\t// feature reference result status as Invalid.\n\t\t\t// 2. If the feature is not gated by any FeatureGate, finish the reconciliation\n\t\t\tif err := reconcileDeletedFeature(ctx, r.Client, req.NamespacedName.Name); err != nil {\n\t\t\t\treturn ctrl.Result{}, err\n\t\t\t}\n\t\t\treturn ctrl.Result{}, nil\n\t\t}\n\t\treturn ctrl.Result{}, err\n\t}\n\n\t// Check if the feature is part of any FeatureGate spec\n\tfeatureGate, found, err := util.GetFeatureGateForFeature(ctx, r.Client, feature.Name)\n\tif err != nil {\n\t\treturn ctrl.Result{}, err\n\t}\n\n\t// If the feature is not found in any FeatureGate spec. Check if it exists in the FeatureGate status.\n\t// If found in the FeatureGate status, remove its entry from Results and update the feature status to default\n\t// activation\n\tif !found {\n\t\tif err := reconcileFeatureNotInFeatureGateSpec(ctx, r.Client, feature); err != nil {\n\t\t\treturn ctrl.Result{}, err\n\t\t}\n\t\treturn ctrl.Result{}, nil\n\t}\n\n\t// If the feature is found in any FeatureGate spec, update the Results in FeatureGate status and the feature status\n\t// to the intent specified in the FeatureGate spec\n\tif err := reconcileFeatureInFeatureGateSpec(ctx, r.Client, featureGate, feature); err != nil {\n\t\treturn ctrl.Result{}, err\n\t}\n\treturn ctrl.Result{}, nil\n}\n\n// reconcileFeatureInFeatureGateSpec reconciles Feature resource that is present in FeatureGate spec\nfunc reconcileFeatureInFeatureGateSpec(ctx context.Context, c client.Client, featureGate *corev1alpha2.FeatureGate, feature *corev1alpha2.Feature) error {\n\tpolicy := corev1alpha2.GetPolicyForStabilityLevel(feature.Spec.Stability)\n\tfeatureReference, _ := util.GetFeatureReferenceFromFeatureGate(featureGate, feature.Name)\n\tfeatureResult, activate := applyPolicyToComputeFeatureResultAndActivation(policy, featureReference)\n\n\t// Update FeatureGate status\n\tfeatureGate.Status.FeatureReferenceResults = computeFeatureGateStatusResults(featureGate.Status, featureResult, true)\n\tif err := c.Status().Update(ctx, featureGate); err != nil {\n\t\treturn fmt.Errorf(\"could not update %s FeatureGate status :%w\", featureGate.Name, err)\n\t}\n\n\t// Update Feature status to the intent specified in the FeatureGate spec\n\tfeature.Status.Activated = activate\n\tif err := c.Update(ctx, feature); err != nil {\n\t\treturn fmt.Errorf(\"could not update %s Feature status :%w\", feature.Name, err)\n\t}\n\treturn nil\n}\n\n// reconcileDeletedFeature reconciles Feature resource that has been deleted\nfunc reconcileDeletedFeature(ctx context.Context, c client.Client, featureName string) error {\n\t// Check if the feature is part of any FeatureGate spec and update the feature Result in FeatureGate status to\n\t// Invalid\n\tfeatureGate, found, err := util.GetFeatureGateForFeature(ctx, c, featureName)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif found {\n\t\tfeatureGate.Status.FeatureReferenceResults = computeFeatureGateStatusResults(featureGate.Status, corev1alpha2.FeatureReferenceResult{\n\t\t\tName:    featureName,\n\t\t\tStatus:  corev1alpha2.InvalidReferenceStatus,\n\t\t\tMessage: \"Feature does not exist in cluster\",\n\t\t}, true)\n\t\tif err := c.Status().Update(ctx, featureGate); err != nil {\n\t\t\treturn fmt.Errorf(\"could not update %s FeatureGate status :%w\", featureGate.Name, err)\n\t\t}\n\t}\n\treturn nil\n}\n\n// reconcileFeatureNotInFeatureGateSpec reconciles Feature resource that is not found in any FeatureGate spec\nfunc reconcileFeatureNotInFeatureGateSpec(ctx context.Context, c client.Client, feature *corev1alpha2.Feature) error {\n\t// If feature is not part of any FeatureGate spec, check if it exists in any FeatureGate status.\n\t// If found in the FeatureGate status, remove its entry from Results in FeatureGate status and update the\n\t// feature status to default activation\n\tfeatureGate, found, err := util.GetFeatureGateWithFeatureInStatus(ctx, c, feature.Name)\n\tpolicy := corev1alpha2.GetPolicyForStabilityLevel(feature.Spec.Stability)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif found {\n\t\t// Remove feature from FeatureGate status\n\t\tfeatureGate.Status.FeatureReferenceResults = computeFeatureGateStatusResults(featureGate.Status, corev1alpha2.FeatureReferenceResult{\n\t\t\tName: feature.Name,\n\t\t}, false)\n\t\tif err := c.Status().Update(ctx, featureGate); err != nil {\n\t\t\treturn fmt.Errorf(\"could not update %s FeatureGate status :%w\", featureGate.Name, err)\n\t\t}\n\t}\n\t// Update Feature status to set feature as deactivated\n\tfeature.Status.Activated = policy.DefaultActivation\n\tif err := c.Update(ctx, feature); err != nil {\n\t\treturn fmt.Errorf(\"could not update %s Feature status :%w\", feature.Name, err)\n\t}\n\treturn nil\n}\n\n// applyPolicyToComputeFeatureResultAndActivation applies stability level policy and returns feature result for\n// FeatureGate status and feature activate status\nfunc applyPolicyToComputeFeatureResultAndActivation(policy corev1alpha2.Policy, featureRef corev1alpha2.FeatureReference) (corev1alpha2.FeatureReferenceResult, bool) {\n\tactivated := policy.DefaultActivation\n\tresult := corev1alpha2.FeatureReferenceResult{Name: featureRef.Name}\n\t// Check for immutability and change in intent of feature status\n\tif policy.Immutable && policy.DefaultActivation != featureRef.Activate {\n\t\tresult.Status = corev1alpha2.InvalidReferenceStatus\n\t\tresult.Message = \"Feature could not be toggled because it is immutable\"\n\t} else if policy.VoidsWarranty && !featureRef.PermanentlyVoidAllSupportGuarantees &&\n\t\tpolicy.DefaultActivation != featureRef.Activate {\n\t\tresult.Status = corev1alpha2.InvalidReferenceStatus\n\t\tresult.Message = \"The stability level of this feature indicates that it should not be activated in \" +\n\t\t\t\"production environments. To activate the feature, you must agree to permanently void all support \" +\n\t\t\t\"guarantees for this environment by setting featureRef.permanentlyVoidAllSupportGuarantees to true.\"\n\t} else {\n\t\tresult.Status = corev1alpha2.AppliedReferenceStatus\n\t\tactivated = featureRef.Activate\n\t}\n\treturn result, activated\n}\n\n// computeFeatureGateStatusResults takes the featuregate status and feature result, and returns the computed featuregate\n// results slice\nfunc computeFeatureGateStatusResults(featureGateStatus corev1alpha2.FeatureGateStatus, featureResult corev1alpha2.FeatureReferenceResult, upsert bool) []corev1alpha2.FeatureReferenceResult {\n\tif featureResult.Message == \"\" {\n\t\tif featureResult.Status == corev1alpha2.InvalidReferenceStatus {\n\t\t\tfeatureResult.Message = \"Invalid operation, feature cannot be toggled\"\n\t\t} else {\n\t\t\tfeatureResult.Message = \"Feature has been successfully toggled\"\n\t\t}\n\t}\n\n\tresults := featureGateStatus.FeatureReferenceResults\n\tif upsert {\n\t\tfor i, result := range featureGateStatus.FeatureReferenceResults {\n\t\t\tif result.Name == featureResult.Name {\n\t\t\t\tresults[i].Status = featureResult.Status\n\t\t\t\tresults[i].Message = featureResult.Message\n\t\t\t\treturn results\n\t\t\t}\n\t\t}\n\n\t\tresults = append(results, corev1alpha2.FeatureReferenceResult{\n\t\t\tName:    featureResult.Name,\n\t\t\tStatus:  featureResult.Status,\n\t\t\tMessage: featureResult.Message,\n\t\t})\n\t\treturn results\n\t}\n\t// remove the feature result from the status if upsert is false\n\tfor i, result := range featureGateStatus.FeatureReferenceResults {\n\t\tif result.Name == featureResult.Name {\n\t\t\tresults = append(results[:i], results[i+1:]...)\n\t\t\treturn results\n\t\t}\n\t}\n\treturn results\n}\n\n// SetupWithManager sets up the controller with the Manager.\nfunc (r *FeatureReconciler) SetupWithManager(mgr ctrl.Manager) error {\n\treturn ctrl.NewControllerManagedBy(mgr).\n\t\tFor(&corev1alpha2.Feature{}).\n\t\tWatches(\n\t\t\t&source.Kind{Type: &corev1alpha2.FeatureGate{}},\n\t\t\thandler.EnqueueRequestsFromMapFunc(r.toFeatureRequests)).\n\t\tComplete(r)\n}\n\nfunc (r *FeatureReconciler) toFeatureRequests(o client.Object) []reconcile.Request {\n\tvar requests []reconcile.Request\n\n\tfeatureGate := &corev1alpha2.FeatureGate{}\n\tif err := r.Client.Get(context.Background(), types.NamespacedName{\n\t\tName: o.GetName(),\n\t}, featureGate); err != nil {\n\t\tr.Log.Error(err, \"failed to get featuregate in event handler\",\n\t\t\t\"Featuregate\", o.GetName())\n\t\treturn requests\n\t}\n\n\t// Enqueue all the features that are part of the updated FeatureGate spec\n\tfeatures := sets.String{}\n\tfor _, feature := range featureGate.Spec.Features {\n\t\tfeatures.Insert(feature.Name)\n\t}\n\n\t// To handle the case where feature reference has removed from the FeatureGate spec\n\tfor _, result := range featureGate.Status.FeatureReferenceResults {\n\t\tfeatures.Insert(result.Name)\n\t}\n\n\tfor feature := range features {\n\t\trequests = append(requests, reconcile.Request{\n\t\t\tNamespacedName: types.NamespacedName{\n\t\t\t\tName: feature,\n\t\t\t},\n\t\t})\n\t}\n\treturn requests\n}\n"
  },
  {
    "path": "featuregates/controller/pkg/feature/feature_suite_test.go",
    "content": "//go:build envtest\n\n// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage feature\n\nimport (\n\t\"context\"\n\t\"crypto/rand\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"log\"\n\t\"math/big\"\n\t\"net\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/onsi/ginkgo/v2\"\n\t. \"github.com/onsi/gomega\"\n\tcorev1 \"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/types\"\n\t\"k8s.io/client-go/dynamic\"\n\t\"k8s.io/client-go/kubernetes/scheme\"\n\t\"k8s.io/client-go/rest\"\n\t\"k8s.io/client-go/util/cert\"\n\tctrl \"sigs.k8s.io/controller-runtime\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\t\"sigs.k8s.io/controller-runtime/pkg/envtest\"\n\tlogf \"sigs.k8s.io/controller-runtime/pkg/log\"\n\t\"sigs.k8s.io/controller-runtime/pkg/log/zap\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n\ttestutil \"github.com/vmware-tanzu/tanzu-framework/util/test\"\n)\n\nfunc TestFeaturegate(t *testing.T) {\n\tRegisterFailHandler(Fail)\n\tRunSpecs(t, \"Featuregate Suite\")\n}\n\nvar (\n\tcfg       *rest.Config\n\tk8sClient client.Client\n\ttestEnv   *envtest.Environment\n\tctx       context.Context\n\tcancel    context.CancelFunc\n\tsetupLog  = ctrl.Log.WithName(\"controllers\").WithName(\"Features\")\n\n\ttimeout  = 5 * time.Second\n\tinterval = 100 * time.Millisecond\n\n\ttmpDir                        string\n\tgeneratedWebhookManifestBytes []byte\n)\n\nfunc generateCertificateAndManifests() error {\n\tcert, key, err := cert.GenerateSelfSignedCertKey(\"tanzu-featuregates-webhook-service.tkg-system.svc\", []net.IP{}, []string{})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\ttmpDir, err = os.MkdirTemp(\"/tmp\", \"featuregate-test\")\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = os.WriteFile(path.Join(tmpDir, \"feature-webhook.crt\"), cert, 0644)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = os.WriteFile(path.Join(tmpDir, \"feature-webhook.key\"), key, 0644)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tinput, err := os.ReadFile(\"testdata/webhook.yaml\")\n\tif err != nil {\n\t\tlog.Fatalln(err)\n\t}\n\n\tlines := strings.Split(string(input), \"\\n\")\n\n\tfor i, line := range lines {\n\t\tif strings.Contains(line, \"Cg==\") {\n\t\t\tlines[i] = strings.Replace(lines[i], \"Cg==\", base64.StdEncoding.EncodeToString(cert), 1)\n\t\t}\n\t}\n\tgeneratedWebhookManifestBytes = []byte(strings.Join(lines, \"\\n\"))\n\treturn nil\n}\n\nvar _ = BeforeSuite(func() {\n\tlogf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true)))\n\n\tctx, cancel = context.WithCancel(context.TODO())\n\n\tBy(\"bootstrapping test environment\")\n\ttestEnv = &envtest.Environment{\n\t\tCRDDirectoryPaths:     []string{filepath.Join(\"..\", \"..\", \"..\", \"..\", \"apis\", \"core\", \"config\", \"crd\", \"bases\")},\n\t\tErrorIfCRDPathMissing: true,\n\t}\n\n\tvar err error\n\tcfg, err = testEnv.Start()\n\tExpect(err).NotTo(HaveOccurred())\n\tExpect(cfg).NotTo(BeNil())\n\n\ttestEnv.ControlPlane.APIServer.Configure().Append(\"admission-control\", \"ValidatingAdmissionWebhook\")\n\n\terr = corev1alpha2.AddToScheme(scheme.Scheme)\n\tExpect(err).NotTo(HaveOccurred())\n\n\tk8sManager, err := ctrl.NewManager(cfg, ctrl.Options{\n\t\tScheme:             scheme.Scheme,\n\t\tMetricsBindAddress: \"0\",\n\t\tHost:               \"127.0.0.1\",\n\t\tPort:               9443,\n\t})\n\tExpect(err).ToNot(HaveOccurred())\n\n\terr = generateCertificateAndManifests()\n\tExpect(err).ToNot(HaveOccurred())\n\n\tk8sManager.GetWebhookServer().TLSMinVersion = \"1.2\"\n\tk8sManager.GetWebhookServer().CertDir = tmpDir\n\tk8sManager.GetWebhookServer().CertName = \"feature-webhook.crt\"\n\tk8sManager.GetWebhookServer().KeyName = \"feature-webhook.key\"\n\tk8sManager.GetWebhookServer().Port = 9443\n\n\tk8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme})\n\tExpect(err).NotTo(HaveOccurred())\n\tExpect(k8sClient).NotTo(BeNil())\n\n\tdynamicClient, err := dynamic.NewForConfig(cfg)\n\tExpect(err).ToNot(HaveOccurred())\n\tExpect(dynamicClient).ToNot(BeNil())\n\n\terr = (&FeatureReconciler{\n\t\tClient: k8sManager.GetClient(),\n\t\tScheme: k8sManager.GetScheme(),\n\t\tLog:    setupLog,\n\t}).SetupWithManager(k8sManager)\n\tExpect(err).ToNot(HaveOccurred())\n\n\tns := &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: \"tkg-system\"}}\n\tExpect(k8sClient.Create(ctx, ns)).To(Succeed())\n\n\terr = (&corev1alpha2.FeatureGate{}).SetupWebhookWithManager(k8sManager)\n\tExpect(err).ToNot(HaveOccurred())\n\n\tgo func() {\n\t\tdefer GinkgoRecover()\n\t\terr = k8sManager.Start(ctx)\n\t\tExpect(err).ToNot(HaveOccurred(), \"failed to run manager\")\n\t}()\n\n\terr = testutil.CreateResourcesFromManifest(generatedWebhookManifestBytes, cfg, dynamicClient)\n\tExpect(err).ToNot(HaveOccurred())\n})\n\nvar _ = AfterSuite(func() {\n\tcancel()\n\tBy(\"tearing down the test environment\")\n\terr := testEnv.Stop()\n\tExpect(err).NotTo(HaveOccurred())\n\n\terr = os.RemoveAll(tmpDir)\n\tExpect(err).NotTo(HaveOccurred())\n})\n\nfunc getTestFeatureGate() *corev1alpha2.FeatureGate {\n\trandomNumber, err := rand.Int(rand.Reader, big.NewInt(100000))\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\treturn &corev1alpha2.FeatureGate{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName: fmt.Sprintf(\"featuregate-%v\", randomNumber),\n\t\t},\n\t\tSpec: corev1alpha2.FeatureGateSpec{\n\t\t\tFeatures: []corev1alpha2.FeatureReference{},\n\t\t},\n\t\tStatus: corev1alpha2.FeatureGateStatus{},\n\t}\n}\n\nfunc getTestFeature(stability corev1alpha2.StabilityLevel) *corev1alpha2.Feature {\n\trandomNumber, err := rand.Int(rand.Reader, big.NewInt(100000))\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\treturn &corev1alpha2.Feature{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName: fmt.Sprintf(\"feature-%v\", randomNumber),\n\t\t},\n\t\tSpec: corev1alpha2.FeatureSpec{\n\t\t\tStability: stability,\n\t\t},\n\t}\n}\n\nvar _ = Describe(\"Featuregate controller\", func() {\n\tIt(\"Should not activate experimental features by default\", func() {\n\t\tfeature := getTestFeature(corev1alpha2.Experimental)\n\t\tExpect(k8sClient.Create(ctx, feature)).Should(Succeed())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: feature.Name}, feature)\n\t\t\treturn err == nil\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tfeatureGate := getTestFeatureGate()\n\t\tfeatureGate.Spec.Features = append(featureGate.Spec.Features, corev1alpha2.FeatureReference{\n\t\t\tName:     feature.Name,\n\t\t\tActivate: false,\n\t\t})\n\t\tExpect(k8sClient.Create(ctx, featureGate)).Should(Succeed())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: featureGate.Name}, featureGate)\n\t\t\treturn err == nil\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: featureGate.Name}, featureGate)\n\t\t\treturn err == nil && len(featureGate.Status.FeatureReferenceResults) == 1\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tExpect(featureGate.Status.FeatureReferenceResults[0].Status).Should(Equal(corev1alpha2.FeatureReferenceStatus(\"Applied\")))\n\t\tExpect(k8sClient.Get(ctx, types.NamespacedName{Name: feature.Name}, feature)).Should(BeNil())\n\t\tExpect(feature.Status.Activated).Should(Equal(false))\n\n\t\tfeatureGate.Spec.Features[0].Activate = true\n\t\tExpect(k8sClient.Update(ctx, featureGate)).ShouldNot(Succeed())\n\n\t\tExpect(k8sClient.Delete(ctx, feature)).Should(BeNil())\n\t\tExpect(k8sClient.Delete(ctx, featureGate)).Should(BeNil())\n\t})\n\n\tIt(\"Should activate and de-activate experimental features when permanently voided all support guarantees\", func() {\n\t\tfeature := getTestFeature(corev1alpha2.Experimental)\n\t\tExpect(k8sClient.Create(ctx, feature)).Should(Succeed())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: feature.Name}, feature)\n\t\t\treturn err == nil\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tfeatureGate := getTestFeatureGate()\n\t\tfeatureGate.Spec.Features = append(featureGate.Spec.Features, corev1alpha2.FeatureReference{\n\t\t\tName:                                feature.Name,\n\t\t\tActivate:                            false,\n\t\t\tPermanentlyVoidAllSupportGuarantees: true,\n\t\t})\n\t\tExpect(k8sClient.Create(ctx, featureGate)).Should(Succeed())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: featureGate.Name}, featureGate)\n\t\t\treturn err == nil\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: featureGate.Name}, featureGate)\n\t\t\treturn err == nil && len(featureGate.Status.FeatureReferenceResults) == 1\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tExpect(featureGate.Status.FeatureReferenceResults[0].Status).Should(Equal(corev1alpha2.FeatureReferenceStatus(\"Applied\")))\n\t\tExpect(k8sClient.Get(ctx, types.NamespacedName{Name: feature.Name}, feature)).Should(BeNil())\n\t\tExpect(feature.Status.Activated).Should(Equal(false))\n\n\t\tfeatureGate.Spec.Features[0].Activate = true\n\t\tExpect(k8sClient.Update(ctx, featureGate)).Should(Succeed())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: feature.Name}, feature)\n\t\t\treturn err == nil && feature.Status.Activated == true\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tfeatureGate.Spec.Features[0].Activate = false\n\t\tExpect(k8sClient.Update(ctx, featureGate)).Should(Succeed())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: feature.Name}, feature)\n\t\t\treturn err == nil && feature.Status.Activated == false\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\t// PermanentlyVoidAllSupportGuarantees once set to true, should not be set to false\n\t\tfeatureGate.Spec.Features[0].PermanentlyVoidAllSupportGuarantees = false\n\t\tExpect(k8sClient.Update(ctx, featureGate)).ShouldNot(Succeed())\n\n\t\tExpect(k8sClient.Delete(ctx, feature)).Should(BeNil())\n\t\tExpect(k8sClient.Delete(ctx, featureGate)).Should(BeNil())\n\t})\n\n\tIt(\"Should activate preview features irrespective of permanently voiding all support guarantees\", func() {\n\t\tfeature := getTestFeature(corev1alpha2.TechnicalPreview)\n\t\tExpect(k8sClient.Create(ctx, feature)).Should(Succeed())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: feature.Name}, feature)\n\t\t\treturn err == nil\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tfeatureGate := getTestFeatureGate()\n\t\tfeatureGate.Spec.Features = append(featureGate.Spec.Features, corev1alpha2.FeatureReference{\n\t\t\tName:     feature.Name,\n\t\t\tActivate: false,\n\t\t})\n\t\tExpect(k8sClient.Create(ctx, featureGate)).Should(Succeed())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: featureGate.Name}, featureGate)\n\t\t\treturn err == nil\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: featureGate.Name}, featureGate)\n\t\t\treturn err == nil && len(featureGate.Status.FeatureReferenceResults) == 1\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tExpect(featureGate.Status.FeatureReferenceResults[0].Status).Should(Equal(corev1alpha2.FeatureReferenceStatus(\"Applied\")))\n\t\tExpect(k8sClient.Get(ctx, types.NamespacedName{Name: feature.Name}, feature)).Should(BeNil())\n\t\tExpect(feature.Status.Activated).Should(Equal(false))\n\n\t\tfeatureGate.Spec.Features[0].Activate = true\n\t\tExpect(k8sClient.Update(ctx, featureGate)).Should(Succeed())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: feature.Name}, feature)\n\t\t\treturn err == nil && feature.Status.Activated == true\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tfeatureGate.Spec.Features[0].Activate = false\n\t\tExpect(k8sClient.Update(ctx, featureGate)).Should(Succeed())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: feature.Name}, feature)\n\t\t\treturn err == nil && feature.Status.Activated == false\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tExpect(k8sClient.Delete(ctx, feature)).Should(BeNil())\n\t\tExpect(k8sClient.Delete(ctx, featureGate)).Should(BeNil())\n\t})\n\n\tIt(\"Should activate stable features by default and stable features should be immutable\", func() {\n\t\tfeature := getTestFeature(corev1alpha2.Stable)\n\t\tExpect(k8sClient.Create(ctx, feature)).Should(Succeed())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: feature.Name}, feature)\n\t\t\treturn err == nil\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: feature.Name}, feature)\n\t\t\treturn err == nil && feature.Status.Activated == true\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tfeatureGate := getTestFeatureGate()\n\t\tfeatureGate.Spec.Features = append(featureGate.Spec.Features, corev1alpha2.FeatureReference{\n\t\t\tName:     feature.Name,\n\t\t\tActivate: false,\n\t\t})\n\t\tExpect(k8sClient.Create(ctx, featureGate)).ShouldNot(Succeed())\n\n\t\tExpect(k8sClient.Delete(ctx, feature)).Should(BeNil())\n\t})\n\n\tIt(\"Should activate deprecated features by default and deprected features should be mutable\", func() {\n\t\tfeature := getTestFeature(corev1alpha2.Deprecated)\n\t\tExpect(k8sClient.Create(ctx, feature)).Should(Succeed())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: feature.Name}, feature)\n\t\t\treturn err == nil\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: feature.Name}, feature)\n\t\t\treturn err == nil && feature.Status.Activated == true\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tfeatureGate := getTestFeatureGate()\n\t\tfeatureGate.Spec.Features = append(featureGate.Spec.Features, corev1alpha2.FeatureReference{\n\t\t\tName:     feature.Name,\n\t\t\tActivate: false,\n\t\t})\n\t\tExpect(k8sClient.Create(ctx, featureGate)).Should(Succeed())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: featureGate.Name}, featureGate)\n\t\t\treturn err == nil\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: featureGate.Name}, featureGate)\n\t\t\treturn err == nil && len(featureGate.Status.FeatureReferenceResults) == 1\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tExpect(featureGate.Status.FeatureReferenceResults[0].Status).Should(Equal(corev1alpha2.FeatureReferenceStatus(\"Applied\")))\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: feature.Name}, feature)\n\t\t\treturn err == nil && feature.Status.Activated == false\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tExpect(k8sClient.Delete(ctx, feature)).Should(BeNil())\n\t\tExpect(k8sClient.Delete(ctx, featureGate)).Should(BeNil())\n\t})\n\n\tIt(\"Should remove feature from featuregate status when reference is removed\", func() {\n\t\tfeature := getTestFeature(corev1alpha2.Deprecated)\n\t\tExpect(k8sClient.Create(ctx, feature)).Should(Succeed())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: feature.Name}, feature)\n\t\t\treturn err == nil && feature.Status.Activated == true\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tfeatureGate := getTestFeatureGate()\n\t\tfeatureGate.Spec.Features = append(featureGate.Spec.Features, corev1alpha2.FeatureReference{\n\t\t\tName:     feature.Name,\n\t\t\tActivate: false,\n\t\t})\n\t\tExpect(k8sClient.Create(ctx, featureGate)).Should(Succeed())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: featureGate.Name}, featureGate)\n\t\t\treturn err == nil\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: featureGate.Name}, featureGate)\n\t\t\treturn err == nil && len(featureGate.Status.FeatureReferenceResults) == 1\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tfeatureGate.Spec.Features = []corev1alpha2.FeatureReference{}\n\t\tExpect(k8sClient.Update(ctx, featureGate)).Should(Succeed())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: featureGate.Name}, featureGate)\n\t\t\treturn err == nil && len(featureGate.Status.FeatureReferenceResults) == 0\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tExpect(k8sClient.Delete(ctx, feature)).Should(BeNil())\n\t\tExpect(k8sClient.Delete(ctx, featureGate)).Should(BeNil())\n\t})\n})\n"
  },
  {
    "path": "featuregates/controller/pkg/feature/testdata/webhook.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: tanzu-featuregates-webhook-service\n  namespace: tkg-system\nspec:\n  type: ExternalName\n  externalName: 127.0.0.1\n---\napiVersion: admissionregistration.k8s.io/v1\nkind: ValidatingWebhookConfiguration\nmetadata:\n  name: tanzu-featuregates-validating-webhook-core\n  annotations:\nwebhooks:\n  - admissionReviewVersions:\n      - v1beta1\n    clientConfig:\n      caBundle: Cg==\n      service:\n        name: tanzu-featuregates-webhook-service\n        namespace: tkg-system\n        path: /validate-core-tanzu-vmware-com-v1alpha2-featuregate\n        port: 9443\n    failurePolicy: Fail\n    name: featuregate.core.tanzu.vmware.com\n    rules:\n      - apiGroups:\n          - core.tanzu.vmware.com\n        apiVersions:\n          - v1alpha2\n        operations:\n          - CREATE\n          - UPDATE\n        resources:\n          - featuregates\n    sideEffects: None\n"
  },
  {
    "path": "featuregates/controller/pkg/featuregate/doc.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package featuregate has the controller for FeatureGate in config API group.\npackage featuregate\n"
  },
  {
    "path": "featuregates/controller/pkg/featuregate/featuregate_controller.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage featuregate\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/go-logr/logr\"\n\tcorev1 \"k8s.io/api/core/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"k8s.io/apimachinery/pkg/types\"\n\tctrl \"sigs.k8s.io/controller-runtime\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\t\"sigs.k8s.io/controller-runtime/pkg/handler\"\n\t\"sigs.k8s.io/controller-runtime/pkg/reconcile\"\n\t\"sigs.k8s.io/controller-runtime/pkg/source\"\n\n\tconfigv1alpha1 \"github.com/vmware-tanzu/tanzu-framework/apis/config/v1alpha1\"\n\t\"github.com/vmware-tanzu/tanzu-framework/featuregates/client/pkg/util\"\n)\n\nconst contextTimeout = 30 * time.Second\n\n// FeatureGateReconciler reconciles a FeatureGate object.\ntype FeatureGateReconciler struct {\n\tclient.Client\n\tLog    logr.Logger\n\tScheme *runtime.Scheme\n}\n\n//+kubebuilder:rbac:groups=config.tanzu.vmware.com,resources=featuregates,verbs=get;list;watch;create;update;patch;delete\n//+kubebuilder:rbac:groups=config.tanzu.vmware.com,resources=featuregates/status,verbs=get;update;patch\n\n// Reconcile reconciles the FeatureGate spec by computing activated, deactivated and unavailable features.\nfunc (r *FeatureGateReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {\n\tctxCancel, cancel := context.WithTimeout(ctx, contextTimeout)\n\tdefer cancel()\n\n\tlog := r.Log.WithValues(\"featuregate\", req.NamespacedName)\n\tlog.Info(\"Starting reconcile\")\n\n\tfeatureGate := &configv1alpha1.FeatureGate{}\n\tif err := r.Client.Get(ctxCancel, req.NamespacedName, featureGate); err != nil {\n\t\treturn ctrl.Result{}, client.IgnoreNotFound(err)\n\t}\n\n\t// List all currently available feature resources.\n\tfeatures := &configv1alpha1.FeatureList{}\n\tif err := r.Client.List(ctxCancel, features); err != nil {\n\t\treturn ctrl.Result{}, err\n\t}\n\n\t// Get namespaces from NamespaceSelector.\n\tnamespaces, err := util.NamespacesMatchingSelector(ctxCancel, r.Client, &featureGate.Spec.NamespaceSelector)\n\tif err != nil {\n\t\treturn ctrl.Result{}, err\n\t}\n\tfeatureGate.Status.Namespaces = namespaces\n\n\t// Compute feature states.\n\tactivated, deactivated, unavailable := util.ComputeFeatureStates(featureGate.Spec, features.Items)\n\tfeatureGate.Status.ActivatedFeatures = activated\n\tfeatureGate.Status.DeactivatedFeatures = deactivated\n\tfeatureGate.Status.UnavailableFeatures = unavailable\n\n\tlog.Info(\"Successfully reconciled\")\n\treturn ctrl.Result{}, r.Client.Status().Update(ctxCancel, featureGate)\n}\n\n// SetupWithManager sets up the controller with the Manager.\nfunc (r *FeatureGateReconciler) SetupWithManager(mgr ctrl.Manager) error {\n\treturn ctrl.NewControllerManagedBy(mgr).\n\t\tFor(&configv1alpha1.FeatureGate{}).\n\t\tWatches(\n\t\t\t&source.Kind{Type: &configv1alpha1.Feature{}},\n\t\t\thandler.EnqueueRequestsFromMapFunc(r.toFeatureGateRequests)).\n\t\tWatches(\n\t\t\t&source.Kind{Type: &corev1.Namespace{}},\n\t\t\thandler.EnqueueRequestsFromMapFunc(r.toFeatureGateRequests)).\n\t\tComplete(r)\n}\n\nfunc (r *FeatureGateReconciler) toFeatureGateRequests(_ client.Object) []reconcile.Request {\n\tvar requests []reconcile.Request\n\n\tfeaturegates := &configv1alpha1.FeatureGateList{}\n\tif err := r.Client.List(context.Background(), featuregates); err != nil {\n\t\tr.Log.Error(err, \"failed to list featuregates in event handler\")\n\t\treturn requests\n\t}\n\n\tfor i := range featuregates.Items {\n\t\trequests = append(requests, reconcile.Request{\n\t\t\tNamespacedName: types.NamespacedName{\n\t\t\t\tNamespace: featuregates.Items[i].Namespace,\n\t\t\t\tName:      featuregates.Items[i].Name,\n\t\t\t},\n\t\t})\n\t}\n\n\treturn requests\n}\n"
  },
  {
    "path": "go.mod",
    "content": "module github.com/vmware-tanzu/tanzu-framework\n\ngo 1.19\n\nreplace (\n\tgithub.com/vmware-tanzu/tanzu-framework/apis/config => ./apis/config\n\tgithub.com/vmware-tanzu/tanzu-framework/capabilities/client => ./capabilities/client\n\tgithub.com/vmware-tanzu/tanzu-framework/util => ./util\n)\n\n// Legacy tags before v0.1.0 was created\nretract [v1.4.0-pre-alpha-1, v1.4.0-pre-alpha-2]\n"
  },
  {
    "path": "go.sum",
    "content": ""
  },
  {
    "path": "hack/boilerplate.go.txt",
    "content": "// Copyright YEAR VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n"
  },
  {
    "path": "hack/check/.misspellignore",
    "content": "go.mod\ngo.sum\ngomod.tmpl\n"
  },
  {
    "path": "hack/check/.yamllintconfig.yaml",
    "content": "---\nextends: relaxed\n\nignore: |\n  */tkg/web/node_modules/\n  */providers/provider-bundle\n\nrules:\n  line-length: disable\n  trailing-spaces: enable\n  new-line-at-end-of-file: enable\n  indentation: disable\n  key-duplicates: disable\n  empty-lines: disable\n  colons: disable\n  commas: disable\n"
  },
  {
    "path": "hack/check/check-yaml.sh",
    "content": "#!/bin/bash\n\n# Copyright 2021 VMware, Inc. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\nset -o nounset\nset -o pipefail\n\nTF_REPO_PATH=\"$(git rev-parse --show-toplevel)\"\n\ndocker run --rm -t cytopia/yamllint --version\nCONTAINER_NAME=\"tf_yamllint_$RANDOM\"\ndocker run --name ${CONTAINER_NAME} -t -v \"${TF_REPO_PATH}\":/tanzu-framework:ro cytopia/yamllint -s -c /tanzu-framework/hack/check/.yamllintconfig.yaml /tanzu-framework\nEXIT_CODE=$(docker inspect ${CONTAINER_NAME} --format='{{.State.ExitCode}}')\ndocker rm -f ${CONTAINER_NAME} &> /dev/null\n\nif [[ ${EXIT_CODE} == \"0\" ]]; then\n  echo \"yamllint passed!\"\nelse\n  echo \"yamllint exit code ${EXIT_CODE}: YAML linting failed!\"\n  echo \"Please fix the listed yamllint errors and verify using 'make yamllint'\"\n  exit \"${EXIT_CODE}\"\nfi\n"
  },
  {
    "path": "hack/check/misspell.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2021 VMware, Inc. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\n\nset -o errexit\nset -o nounset\nset -o pipefail\n\n\nTF_REPO_PATH=\"$(git rev-parse --show-toplevel)\"\n\nMISSPELL_LOC=\"${TF_REPO_PATH}/hack/check/tools/bin\"\n\n# Install tools we need if it is not present\nif [[ ! -f \"${MISSPELL_LOC}/misspell\" ]]; then\n  curl -L https://git.io/misspell | bash\n  mkdir -p \"${MISSPELL_LOC}\"\n  mv ./bin/misspell \"${MISSPELL_LOC}/misspell\"\nfi\n\n# Spell checking\n# misspell check Project - https://github.com/client9/misspell\nmisspellignore_files=\"${TF_REPO_PATH}/hack/check/.misspellignore\"\nignore_files=$(cat \"${misspellignore_files}\")\ngit ls-files | grep -v \"${ignore_files}\" | xargs \"${MISSPELL_LOC}/misspell\" | grep \"misspelling\" && echo \"Please fix the listed misspell errors and verify using 'make misspell'\" && exit 1 || echo \"misspell check passed!\"\n"
  },
  {
    "path": "hack/check-license.sh",
    "content": "#!/bin/bash\n\n# Copyright 2021 VMware, Inc. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\nset -o errexit\nset -o nounset\nset -o pipefail\n\n# TODO(navidshaikh): Add shellcheck and merge\n\nverify_license() {\n  printf \"Checking License in shell scripts and Makefiles ...\\n\"\n  local required_keywords=(\"VMware, Inc.\" \"SPDX-License-Identifier: Apache-2.0\")\n  local file_patterns_to_check=(\"*.sh\" \"Makefile\" \"*.mk\")\n\n  local result\n  result=$(mktemp /tmp/tf-licence-check.XXXXXX)\n  for ext in \"${file_patterns_to_check[@]}\"; do\n    find . -type d -o -name \"$ext\" -type f -print0 |\n      while IFS= read -r -d '' path; do\n        for rword in \"${required_keywords[@]}\"; do\n          if ! grep -q \"$rword\" \"$path\"; then\n            echo \"   $path\" >> \"$result\"\n          fi\n        done\n      done\n  done\n\n  if [ -s \"$result\" ]; then\n    echo \"No required license header found in:\"\n    sort < \"$result\" | uniq\n    echo \"License check failed!\"\n    echo \"Please add the license in each listed file and verify using './hack/check-license.sh'\"\n    rm \"$result\"\n    return 1\n  else\n    echo \"License check passed!\"\n    rm \"$result\"\n    return 0\n  fi\n}\n\nverify_license || exit 1; exit 0\n"
  },
  {
    "path": "hack/check-mdlint.sh",
    "content": "#!/bin/bash\n\n# Copyright 2021 VMware, Inc. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\nset -o errexit\nset -o nounset\nset -o pipefail\n\n# Change directories to the parent directory of the one in which this\n# script is located.\ncd \"$(dirname \"${BASH_SOURCE[0]}\")/..\"\n\n# mdlint rules with common errors and possible fixes can be found here:\n# https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md\n# Additional configuration can be found in the .markdownlintrc file at\n# the root of the repo.\ndocker run --rm -v \"$(pwd)\":/build \\\n  gcr.io/cluster-api-provider-vsphere/extra/mdlint:0.23.2 /md/lint \\\n  -i **/CHANGELOG.md \\\n  -i docs/cli/commands .\n"
  },
  {
    "path": "hack/kind/Testing_Packages.md",
    "content": "# Testing packages\n\n## Testing clusterclass packages\n\n- Build management package bundles and package repository and publish it\n\n```text\n# Configure the registry where you want to publish the packages and package repo bundles\n# You will need push permission to this repository\nexport OCI_REGISTRY=gcr.io/eminent-nation-87317/tkg/test/repo/management\n\n# Build and publish management repo bundle\nmake package-push-bundles-repo PACKAGE_REPOSITORY=management\n```\n\nAs part of the logs you will find a URL to image for package repository. Example: `gcr.io/eminent-nation-87317/tkg/test/repo/management/packages/management/management@sha256:164dd18d9642969f5636126c0e5b67d296d56339d8bd7c0ca49fff0cf8e20ad3`\n\n- Create Kind cluster for testing\n\n```text\n# Create kind cluster with CAPx providers and kapp-controller installed\n./hack/kind/deploy_kind_with_capi_and_kapp.sh\n```\n\n- Use `tanzu login` to login to newly created kind cluster as management cluster\n\n```text\n# login to the kind cluster. Ignore the CLIPluginList error as it's not needed to be synced\ntanzu login --kubeconfig /Users/anujc/.kube/config --context kind-test-cluster --name kind-test-cluster\n```\n\n- Install the `PackageRepository` and `Package` to the kind cluster.\n\n```text\ntanzu package repository update management --url <PACKAGE-REPOSITORY-URL-GENERATED-EARLIER> --create\n```\n\nAfter it get Reconciled successfully, new package will be available on the cluster.\n\n```text\n~> k get packagerepository -A\nNAMESPACE   NAME         AGE    DESCRIPTION\ndefault     management   119m   Reconcile succeeded\n~> k get package -A\nNAMESPACE   NAME                                               PACKAGEMETADATA NAME                    VERSION      AGE\ndefault     clusterclass-aws.tanzu.vmware.com.0.16.0-dev       clusterclass-aws.tanzu.vmware.com       0.16.0-dev   1h58m50s\ndefault     clusterclass-azure.tanzu.vmware.com.0.16.0-dev     clusterclass-azure.tanzu.vmware.com     0.16.0-dev   1h58m50s\ndefault     clusterclass-docker.tanzu.vmware.com.0.16.0-dev    clusterclass-docker.tanzu.vmware.com    0.16.0-dev   1h58m50s\ndefault     clusterclass-vsphere.tanzu.vmware.com.0.16.0-dev   clusterclass-vsphere.tanzu.vmware.com   0.16.0-dev   1h58m50s\n```\n\nInstall the package for testing with `tanzu package install` command and passing `values-file` for the package. Sample [values file for aws clusterclass](/packages/clusterclass-aws/test-data/sample-values.yaml).\n\n```text\ntanzu package install clusterclass-aws-pkg --package-name clusterclass-aws.tanzu.vmware.com --version 0.16.0-dev --values-file sample-values.yaml\n```\n\nAfter it get Reconciled successfully, clusterclass resource should get created.\n\n```text\n~> k get cc -A\nNAMESPACE   NAME                      AGE\ndefault     tkg-aws-clusterclass      96m\n```\n\nCreate a `cluster` resource with required corresponding clusterclass and variable defined under topology and use kubectl apply to test the cluster creation. Sample [cluster file for aws](/packages/clusterclass-aws/test-data/cluster.yaml).\n\n```text\nkubectl apply -f cluster.yaml\n```\n\n## Deleting installed packages and package repository to reset the kind cluster\n\nBelow commands should clean kind cluster and user can continue to rebuild packagerepository after fixing the issues and reinstall package repository and packages as mentioned step-4 above.\n\n```text\nkubectl delete packageinstall clusterclass-aws-pkg\nkubectl delete packagerepository management\n```\n"
  },
  {
    "path": "hack/kind/deploy_kind_with_capi_and_kapp.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2021 VMware, Inc. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\nset -eoux pipefail\n\nPROJECT_ROOT=$(git rev-parse --show-toplevel)\n\n# Deploy kind cluster\n${PROJECT_ROOT}/hack/kind/kind_install_for_capd.sh\n\n# install cluster-api providers\nexport CLUSTER_TOPOLOGY=true\nexport EXP_CLUSTER_RESOURCE_SET=true\nclusterctl init --core cluster-api:v1.1.0-beta.2 --bootstrap kubeadm:v1.1.0-rc.0 --control-plane kubeadm:v1.1.0-beta.2 -i docker:v1.1.0-beta.2 -i aws:v1.2.0 -i vsphere:v1.0.2\n\n# install kapp-controller\nkubectl apply -f https://github.com/vmware-tanzu/carvel-kapp-controller/releases/download/v0.38.4/release.yml\n"
  },
  {
    "path": "hack/kind/kind_install_for_capd.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2021 VMware, Inc. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\n# Copyright 2021 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\n# This script installs a local KIND cluster with a local container registry and the correct files mounted for using CAPD\n# to test Cluster API.\n# This script is a customized version of the kind_with_local_registry script supplied by the KIND maintainers at\n# https://kind.sigs.k8s.io/docs/user/local-registry/\n# The modifications mount the docker socket inside the KIND cluster so that CAPD can be used to\n# created docker containers.\n\nset -o errexit\nset -o nounset\nset -o pipefail\n\nNAME=${CAPI_KIND_CLUSTER_NAME:-\"test-cluster\"}\n\n# create registry container unless it already exists\nreg_name='kind-registry'\nreg_port='5000'\nrunning=\"$(docker inspect -f '{{.State.Running}}' \"${reg_name}\" 2>/dev/null || true)\"\nif [ \"${running}\" != 'true' ]; then\n  docker run \\\n    -d --restart=always -p \"127.0.0.1:${reg_port}:5000\" --name \"${reg_name}\" \\\n    registry:2\nfi\n\n# create a cluster with the local registry enabled in containerd\ncat <<EOF | kind create cluster --name=\"$NAME\"  --config=-\nkind: Cluster\napiVersion: kind.x-k8s.io/v1alpha4\nnodes:\n- role: control-plane\n  extraMounts:\n    - hostPath: /var/run/docker.sock\n      containerPath: /var/run/docker.sock\ncontainerdConfigPatches:\n- |-\n  [plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"localhost:${reg_port}\"]\n    endpoint = [\"http://${reg_name}:${reg_port}\"]\nEOF\n\n# connect the registry to the cluster network\n# (the network may already be connected)\ndocker network connect \"kind\" \"${reg_name}\" || true\n\n# Document the local registry\n# https://github.com/kubernetes/enhancements/tree/master/keps/sig-cluster-lifecycle/generic/1755-communicating-a-local-registry\ncat <<EOF | kubectl apply -f -\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: local-registry-hosting\n  namespace: kube-public\ndata:\n  localRegistryHosting.v1: |\n    host: \"localhost:${reg_port}\"\n    help: \"https://kind.sigs.k8s.io/docs/user/local-registry/\"\nEOF\n"
  },
  {
    "path": "hack/packages/scripts/create-package.sh",
    "content": "#!/bin/sh\n\n# Copyright 2021 VMware, Inc. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\n# This shell script creates the prescribed directory structure for a Tanzu management package.\n\nset -eoux pipefail\n\n# set this value to your package name\nPACKAGE_NAME=$1\n\nif [ -z \"$PACKAGE_NAME\" ]\nthen\n  echo \"create package failed. must set PACKAGE_NAME\"\n  exit 2\nfi\n\n# Handle differences in MacOS sed\nSEDARGS=\"\"\nif [ \"$(uname -s)\" = \"Darwin\" ]; then\n    SEDARGS=\"-e\"\nfi\n\nROOT_DIR=\"packages\"\nBUNDLE_DIR=\"bundle\"\nCONFIG_DIR=\"config\"\nOVERLAY_DIR=\"overlay\"\nUPSTREAM_DIR=\"upstream\"\nIMGPKG_DIR=\".imgpkg\"\nPACKAGE_DIR=\"${ROOT_DIR}/${PACKAGE_NAME}\"\n\n# create directory structure for package\nmkdir -vp \"${PACKAGE_DIR}/${BUNDLE_DIR}/${CONFIG_DIR}\"\nmkdir -v \"${PACKAGE_DIR}/${BUNDLE_DIR}/${IMGPKG_DIR}\"\nmkdir -v \"${PACKAGE_DIR}/${BUNDLE_DIR}/${CONFIG_DIR}/${OVERLAY_DIR}\"\nmkdir -v \"${PACKAGE_DIR}/${BUNDLE_DIR}/${CONFIG_DIR}/${UPSTREAM_DIR}\"\n\n# create README and fill with name of package\nsed $SEDARGS \"s/PACKAGE_NAME/${PACKAGE_NAME}/g\" hack/packages/templates/new-package/readme.md > \"${PACKAGE_DIR}/README.md\"\n\n# create manifests and fill with name of package\nsed $SEDARGS \"s/PACKAGE_NAME/${PACKAGE_NAME}/g\" hack/packages/templates/new-package/metadata.yaml > \"${PACKAGE_DIR}/metadata.yaml\"\nsed $SEDARGS \"s/PACKAGE_NAME/${PACKAGE_NAME}/g\" hack/packages/templates/new-package/package.yaml > \"${PACKAGE_DIR}/package.yaml\"\nsed $SEDARGS \"s/PACKAGE_NAME/${PACKAGE_NAME}/g\" hack/packages/templates/new-package/values.yaml > \"${PACKAGE_DIR}/bundle/config/values.yaml\"\nsed $SEDARGS \"s/PACKAGE_NAME/${PACKAGE_NAME}/g\" hack/packages/templates/new-package/vendir.yml > \"${PACKAGE_DIR}/vendir.yml\"\ncp hack/packages/templates/new-package/Makefile ${PACKAGE_DIR}/Makefile\n\necho\necho \"${PACKAGE_NAME} package bootstrapped at ${PACKAGE_DIR}\"\necho\n"
  },
  {
    "path": "hack/packages/templates/new-package/Makefile",
    "content": "# Copyright 2021 VMware, Inc. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\nconfigure-package: ## Configure package before creating the package\n\nreset-package: ## Reset configured package\n"
  },
  {
    "path": "hack/packages/templates/new-package/metadata.yaml",
    "content": "apiVersion: data.packaging.carvel.dev/v1alpha1\nkind: PackageMetadata\nmetadata:\n  name: PACKAGE_NAME.tanzu.vmware.com\n  namespace: PACKAGE_NAME\nspec:\n  displayName: \"PACKAGE_NAME\"\n  longDescription: \"\"\n  shortDescription: \"\"\n  providerName: VMware\n  maintainers:\n    - name: \"\"\n  categories:\n    - \"\"\n"
  },
  {
    "path": "hack/packages/templates/new-package/package.yaml",
    "content": "apiVersion: data.packaging.carvel.dev/v1alpha1\nkind: Package\nmetadata:\n  name: PACKAGE_NAME.tanzu.vmware.com\n  namespace: PACKAGE_NAME\nspec:\n  refName: PACKAGE_NAME.tanzu.vmware.com\n  version: VERSION\n  releaseNotes: \"relevant release notes...\"\n  licenses:\n    - \"UNKNOWN\"\n  template:\n    spec:\n      fetch:\n        - imgpkgBundle:\n            image: # Get this value by pushing to your OCI Registry\n      template:\n        - ytt:\n            paths:\n              - config/\n        - kbld:\n            paths:\n              - \"-\"\n              - .imgpkg/images.yml\n      deploy:\n        - kapp: {}\n"
  },
  {
    "path": "hack/packages/templates/new-package/readme.md",
    "content": "# PACKAGE_NAME Package\n\nThis package provides << awesome functionality >> using [PACKAGE_NAME](https://INFO_NEEDED).\n\n## Components\n\n## Configuration\n\nThe following configuration values can be set to customize the PACKAGE_NAME installation.\n\n### Global\n\n| Value | Required/Optional | Description |\n|-------|-------------------|-------------|\n| `name` | Optional | description |\n\n### PACKAGE_NAME Configuration\n\n| Value | Required/Optional | Description |\n|-------|-------------------|-------------|\n| `name` | Optional | description |\n\n## Usage Example\n\nThe following is a basic guide for getting started with PACKAGE_NAME.\n"
  },
  {
    "path": "hack/packages/templates/new-package/repo.yaml",
    "content": "---\npackages:\n  - name: foo\n    versions:\n      - 0.0.1\n"
  },
  {
    "path": "hack/packages/templates/new-package/values.yaml",
    "content": "#@data/values\n---\n\n#! User configurable values for PACKAGE_NAME.\n\nfoo: bar\n"
  },
  {
    "path": "hack/packages/templates/new-package/vendir.yml",
    "content": "apiVersion: vendir.k14s.io/v1alpha1\nkind: Config\nminimumRequiredVersion: 0.12.0\ndirectories:\n  - path: config/upstream\n    contents:\n      - path: .\n        githubRelease:\n          slug: INFO_NEEDED\n          tag: INFO_NEEDED\n          disableAutoChecksumValidation: true\n        includePaths:\n          - PACKAGE_NAME.yaml\n"
  },
  {
    "path": "hack/tools/Makefile",
    "content": "# Copyright 2021 VMware, Inc. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\n# Build tooling that is used for the main project\n\n# Ensure Make is run with bash shell as some syntax below is bash-specific\nSHELL := /usr/bin/env bash\n\n.DEFAULT_GOAL := help\n\n# Use GOPROXY environment variable if set\nGOPROXY := $(shell go env GOPROXY)\nifeq (,$(strip $(GOPROXY)))\nGOPROXY := https://proxy.golang.org\nendif\nexport GOPROXY\n\n# Active module mode, as we use go modules to manage dependencies\nexport GO111MODULE := on\n\n# Directories.\nROOT_DIR:=$(shell git rev-parse --show-toplevel)\nBIN_DIR := bin\nTOOLS_SCRIPTS_DIR := $(ROOT_DIR)/hack/tools\nSRCS := go.mod go.sum\n\nYQ_VERSION=v4.5.0\nYTT_VERSION=v0.40.0\nKBLD_VERSION=v0.31.0\nKAPP_VERSION=v0.42.0\nVENDIR_VERSION=v0.23.0\nVALE_VERSION=2.20.1\nGOLANGCI_LINT_VERSION=1.52.2\nK8S_VERSION=1.23.5\n\n# Host information.\nHOST_OS=$(shell go env GOOS)\nHOST_ARCH=$(shell go env GOARCH)\n\n# Binaries.\nCONTROLLER_GEN := $(BIN_DIR)/controller-gen\nGINKGO             := $(BIN_DIR)/ginkgo\nGOLANGCI_LINT      := $(BIN_DIR)/golangci-lint\nGOIMPORTS          := $(BIN_DIR)/goimports\nKUBEBUILDER        := $(BIN_DIR)/kubebuilder\nKUSTOMIZE := $(BIN_DIR)/kustomize\nGOBINDATA          := $(BIN_DIR)/gobindata\nVALE               := $(BIN_DIR)/vale\nYTT                := $(BIN_DIR)/ytt\nKBLD               := $(BIN_DIR)/kbld\nVENDIR             := $(BIN_DIR)/vendir\nIMGPKG             := $(BIN_DIR)/imgpkg\nYQ                 := $(BIN_DIR)/yq\nTRIVY              := $(BIN_DIR)/trivy\nKAPP               := $(BIN_DIR)/kapp\nCONVERSION_GEN     := $(BIN_DIR)/conversion-gen\nCOUNTERFEITER      := $(BIN_DIR)/counterfeiter\n\n## --------------------------------------\n## Help\n## --------------------------------------\n\nhelp: ## Display this help\n\t@awk 'BEGIN {FS = \":.*##\"; printf \"\\nUsage:\\n  make \\033[36m<target>\\033[0m\\n\"} /^[a-zA-Z_-]+:.*?##/ { printf \"  \\033[36m%-15s\\033[0m %s\\n\", $$1, $$2 } /^##@/ { printf \"\\n\\033[1m%s\\033[0m\\n\", substr($$0, 5) } ' $(MAKEFILE_LIST)\n\n## --------------------------------------\n## Binaries\n## --------------------------------------\n\ncontroller-gen: $(CONTROLLER_GEN) ## Build controller-gen\n$(CONTROLLER_GEN): go.mod go.sum\n\tgo build -tags=tools -o $@ sigs.k8s.io/controller-tools/cmd/controller-gen\n\nginkgo: $(GINKGO) ## Build ginkgo\n$(GINKGO): go.mod\n\tmkdir -p $(BIN_DIR)\n\tgo build -tags=tools -o $(BIN_DIR)/ginkgo github.com/onsi/ginkgo/ginkgo\n\ncounterfeiter: $(COUNTERFEITER) ## Build counterfeiter\n$(COUNTERFEITER): $(BIN_DIR) go.mod go.sum\n\tgo build -tags=tools -o $@ github.com/maxbrunsfeld/counterfeiter/v6\n\ngolangci-lint: $(GOLANGCI_LINT) ## Install golangci-lint\n$(GOLANGCI_LINT):\n\tmkdir -p $(BIN_DIR)\n\tcurl -L https://github.com/golangci/golangci-lint/releases/download/v$(GOLANGCI_LINT_VERSION)/golangci-lint-$(GOLANGCI_LINT_VERSION)-$(HOST_OS)-$(HOST_ARCH).tar.gz | tar -xz -C /tmp/\n\tmv /tmp/golangci-lint-$(GOLANGCI_LINT_VERSION)-$(HOST_OS)-$(HOST_ARCH)/golangci-lint $(@)\n\ngoimports: $(GOIMPORTS) $(SRCS) ## Build goimports\n$(GOIMPORTS): go.mod go.sum\n\tgo build -tags=tools -o $@ golang.org/x/tools/cmd/goimports\n\nkubebuilder: $(KUBEBUILDER) ## Install kubebuilder\n$(KUBEBUILDER):\n\tmkdir -p $(BIN_DIR)\n\tcurl -L https://go.kubebuilder.io/test-tools/${K8S_VERSION}/${HOST_OS}/${HOST_ARCH} | tar -xz -C /tmp/\n\tmv /tmp/kubebuilder $(@)\n\nkustomize: $(KUSTOMIZE)\n$(KUSTOMIZE): $(BIN_DIR) go.mod go.sum # Build kustomize from tools folder.\n\tCGO_ENABLED=0 go build -tags=tools -o $@ sigs.k8s.io/kustomize/kustomize/v4\n\ngobindata: $(GOBINDATA)\n$(GOBINDATA): go.mod go.sum # Build go-bindata\n\tmkdir -p $(BIN_DIR)\n\tgo build -tags=tools -o $(BIN_DIR) github.com/shuLhan/go-bindata/...; mv $(BIN_DIR)/go-bindata $(GOBINDATA)\n\nvale: $(VALE)\n$(VALE):\n\tmkdir -p $(BIN_DIR)\n\t# vale uses 'macOS' for darwin, 'Linux' for linux, '64-bit' for amd64 (yet arm64 remains unchanged)\n\t# for its release asset naming, so manually map them\n\tcurl -sfL https://github.com/errata-ai/vale/releases/download/v$(VALE_VERSION)/vale_$(VALE_VERSION)_$(shell echo $(HOST_OS) | \\\n\t\tsed 's,darwin,macOS,g'| sed 's,linux,Linux,g')_$(shell echo $(HOST_ARCH) | sed 's,amd64,64-bit,g').tar.gz | tar -xz -C /tmp/\n\tmv /tmp/vale $(@)\n\tchmod a+x $(@)\n\nyq: $(YQ) ## Download yq\n$(YQ):\n\tmkdir -p $(BIN_DIR)\n\techo $(HOST_OS) $(HOST_ARCH)\n\tcurl -sL https://github.com/mikefarah/yq/releases/download/$(YQ_VERSION)/yq_$(HOST_OS)_$(HOST_ARCH) -o $(@) && \\\n\tchmod a+x $(@)\n\nconversion-gen: $(CONVERSION_GEN) $(SRCS) ## Build conversion-gen\n$(CONVERSION_GEN): go.mod\n\tmkdir -p $(BIN_DIR)\n\tgo build -tags=tools -o $(BIN_DIR) k8s.io/code-generator/cmd/conversion-gen\n\n## --------------------------------------------------------------------------------------------------------\n## Carvel tools\n## --------------------------------------------------------------------------------------------------------\n\nytt: $(YTT) ## Install ytt\n$(YTT):\n\tmkdir -p $(BIN_DIR)\n\tcurl -LO https://github.com/vmware-tanzu/carvel-ytt/releases/download/$(YTT_VERSION)/ytt-$(HOST_OS)-$(HOST_ARCH)\n\tmv ytt-$(HOST_OS)-$(HOST_ARCH) $(@)\n\tchmod a+x $(@)\n\nkbld: $(KBLD) ## Download kbld\n$(KBLD):\n\tmkdir -p $(BIN_DIR)\n\tcurl -LO https://github.com/vmware-tanzu/carvel-kbld/releases/download/$(KBLD_VERSION)/kbld-$(HOST_OS)-$(HOST_ARCH)\n\tmv kbld-$(HOST_OS)-$(HOST_ARCH) $(@)\n\tchmod a+x $(@)\n\nvendir: $(VENDIR) ## Download vendir\n$(VENDIR):\n\tmkdir -p $(BIN_DIR)\n\tcurl -LO https://github.com/vmware-tanzu/carvel-vendir/releases/download/$(VENDIR_VERSION)/vendir-$(HOST_OS)-$(HOST_ARCH)\n\tmv vendir-$(HOST_OS)-$(HOST_ARCH) $(@)\n\tchmod a+x $(@)\n\nimgpkg: $(IMGPKG) ## Download imgpkg\n$(IMGPKG):\n\tmkdir -p $(BIN_DIR)\n\tcurl -LO https://github.com/vmware-tanzu/carvel-imgpkg/releases/download/v0.11.0/imgpkg-$(HOST_OS)-$(HOST_ARCH)\n\tmv imgpkg-$(HOST_OS)-$(HOST_ARCH) $(@)\n\tchmod a+x $(@)\n\nkapp: $(KAPP) ## Download kapp\n$(KAPP):\n\tmkdir -p $(BIN_DIR)\n\tcurl -LO https://github.com/vmware-tanzu/carvel-kapp/releases/download/$(KAPP_VERSION)/kapp-$(HOST_OS)-$(HOST_ARCH)\n\tmv kapp-$(HOST_OS)-$(HOST_ARCH) $(@)\n\tchmod a+x $(@)\n\n## --------------------------------------\n## Trivy\n## --------------------------------------\n\ntrivy: $(TRIVY) ## Download trivy\n$(TRIVY):\n\tcurl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b $(BIN_DIR)\n\n## --------------------------------------\n## Cleanup\n## --------------------------------------\n\n.PHONY: clean\nclean: ## Remove all generated binaries\n\trm -rf bin\n"
  },
  {
    "path": "hack/tools/go.mod",
    "content": "module github.com/vmware-tanzu/tanzu-framework/hack/tools\n\ngo 1.19\n\nrequire (\n\tgithub.com/maxbrunsfeld/counterfeiter/v6 v6.5.0\n\tgithub.com/onsi/ginkgo v1.16.5\n\tgithub.com/shuLhan/go-bindata v4.0.0+incompatible\n\tgolang.org/x/tools v0.6.0\n\tk8s.io/code-generator v0.24.3\n\tsigs.k8s.io/controller-tools v0.9.2\n\tsigs.k8s.io/kustomize/kustomize/v4 v4.5.7\n)\n\nrequire (\n\tgithub.com/PuerkitoBio/purell v1.1.1 // indirect\n\tgithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect\n\tgithub.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // indirect\n\tgithub.com/davecgh/go-spew v1.1.1 // indirect\n\tgithub.com/evanphx/json-patch v4.12.0+incompatible // indirect\n\tgithub.com/fatih/color v1.13.0 // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.1 // indirect\n\tgithub.com/go-errors/errors v1.0.1 // indirect\n\tgithub.com/go-logr/logr v1.2.0 // indirect\n\tgithub.com/go-openapi/jsonpointer v0.19.5 // indirect\n\tgithub.com/go-openapi/jsonreference v0.19.5 // indirect\n\tgithub.com/go-openapi/swag v0.19.14 // indirect\n\tgithub.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect\n\tgithub.com/gobuffalo/flect v0.2.5 // indirect\n\tgithub.com/gogo/protobuf v1.3.2 // indirect\n\tgithub.com/golang/protobuf v1.5.2 // indirect\n\tgithub.com/google/gnostic v0.5.7-v3refs // indirect\n\tgithub.com/google/go-cmp v0.5.6 // indirect\n\tgithub.com/google/gofuzz v1.1.0 // indirect\n\tgithub.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect\n\tgithub.com/google/uuid v1.3.0 // indirect\n\tgithub.com/imdario/mergo v0.3.8 // indirect\n\tgithub.com/inconshreveable/mousetrap v1.0.0 // indirect\n\tgithub.com/josharian/intern v1.0.0 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/mailru/easyjson v0.7.6 // indirect\n\tgithub.com/mattn/go-colorable v0.1.11 // indirect\n\tgithub.com/mattn/go-isatty v0.0.14 // indirect\n\tgithub.com/mattn/go-runewidth v0.0.9 // indirect\n\tgithub.com/mitchellh/mapstructure v1.4.2 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect\n\tgithub.com/nxadm/tail v1.4.8 // indirect\n\tgithub.com/olekukonko/tablewriter v0.0.5 // indirect\n\tgithub.com/pkg/errors v0.9.1 // indirect\n\tgithub.com/spf13/cobra v1.4.0 // indirect\n\tgithub.com/spf13/pflag v1.0.5 // indirect\n\tgithub.com/xlab/treeprint v1.1.0 // indirect\n\tgo.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect\n\tgolang.org/x/mod v0.8.0 // indirect\n\tgolang.org/x/net v0.8.0 // indirect\n\tgolang.org/x/sys v0.6.0 // indirect\n\tgolang.org/x/text v0.8.0 // indirect\n\tgoogle.golang.org/protobuf v1.28.0 // indirect\n\tgopkg.in/inf.v0 v0.9.1 // indirect\n\tgopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect\n\tgopkg.in/yaml.v2 v2.4.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e // indirect\n\tk8s.io/api v0.24.0 // indirect\n\tk8s.io/apiextensions-apiserver v0.24.0 // indirect\n\tk8s.io/apimachinery v0.24.0 // indirect\n\tk8s.io/gengo v0.0.0-20211129171323-c02415ce4185 // indirect\n\tk8s.io/klog/v2 v2.60.1 // indirect\n\tk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect\n\tk8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect\n\tsigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect\n\tsigs.k8s.io/kustomize/api v0.12.1 // indirect\n\tsigs.k8s.io/kustomize/cmd/config v0.10.9 // indirect\n\tsigs.k8s.io/kustomize/kyaml v0.13.9 // indirect\n\tsigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect\n\tsigs.k8s.io/yaml v1.3.0 // indirect\n)\n"
  },
  {
    "path": "hack/tools/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=\ncloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=\ncloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=\ncloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=\ncloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngithub.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=\ngithub.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=\ngithub.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA=\ngithub.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M=\ngithub.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=\ngithub.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=\ngithub.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=\ngithub.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=\ngithub.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=\ngithub.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=\ngithub.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=\ngithub.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=\ngithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=\ngithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=\ngithub.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=\ngithub.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA=\ngithub.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=\ngithub.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=\ngithub.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=\ngithub.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=\ngithub.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=\ngithub.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=\ngithub.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=\ngithub.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=\ngithub.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=\ngithub.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=\ngithub.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=\ngithub.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=\ngithub.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=\ngithub.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=\ngithub.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=\ngithub.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=\ngithub.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=\ngithub.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=\ngithub.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=\ngithub.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=\ngithub.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84=\ngithub.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=\ngithub.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=\ngithub.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=\ngithub.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=\ngithub.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=\ngithub.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=\ngithub.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=\ngithub.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI=\ngithub.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=\ngithub.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg=\ngithub.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=\ngithub.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w=\ngithub.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=\ngithub.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=\ngithub.com/go-logr/logr v1.2.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE=\ngithub.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro=\ngithub.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=\ngithub.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=\ngithub.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM=\ngithub.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg=\ngithub.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=\ngithub.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng=\ngithub.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=\ngithub.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=\ngithub.com/gobuffalo/flect v0.2.5 h1:H6vvsv2an0lalEaCDRThvtBfmg44W/QHXBCYUXf/6S4=\ngithub.com/gobuffalo/flect v0.2.5/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8=\ngithub.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=\ngithub.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=\ngithub.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w=\ngithub.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA=\ngithub.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=\ngithub.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=\ngithub.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=\ngithub.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=\ngithub.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=\ngithub.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=\ngithub.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=\ngithub.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=\ngithub.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=\ngithub.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=\ngithub.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=\ngithub.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=\ngithub.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=\ngithub.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=\ngithub.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=\ngithub.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=\ngithub.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=\ngithub.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ=\ngithub.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=\ngithub.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=\ngithub.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=\ngithub.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=\ngithub.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=\ngithub.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=\ngithub.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=\ngithub.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=\ngithub.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=\ngithub.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.11 h1:nQ+aFkoE2TMGc0b68U2OKSexC+eq46+XwZzWXHRmPYs=\ngithub.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=\ngithub.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=\ngithub.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=\ngithub.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=\ngithub.com/maxbrunsfeld/counterfeiter/v6 v6.5.0 h1:rBhB9Rls+yb8kA4x5a/cWxOufWfXt24E+kq4YlbGj3g=\ngithub.com/maxbrunsfeld/counterfeiter/v6 v6.5.0/go.mod h1:fJ0UAZc1fx3xZhU4eSHQDJ1ApFmTVhp5VTpV9tm2ogg=\ngithub.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=\ngithub.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=\ngithub.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/mitchellh/mapstructure v1.4.2 h1:6h7AQ0yhTcIsmFmnAwQls75jp2Gzs4iB8W7pjMO+rqo=\ngithub.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=\ngithub.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0=\ngithub.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4=\ngithub.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=\ngithub.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=\ngithub.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=\ngithub.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=\ngithub.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=\ngithub.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=\ngithub.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=\ngithub.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=\ngithub.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=\ngithub.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=\ngithub.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=\ngithub.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=\ngithub.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=\ngithub.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=\ngithub.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=\ngithub.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw=\ngithub.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=\ngithub.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=\ngithub.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=\ngithub.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=\ngithub.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sclevine/spec v1.4.0 h1:z/Q9idDcay5m5irkZ28M7PtQM4aOISzOpj4bUPkDee8=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=\ngithub.com/shuLhan/go-bindata v4.0.0+incompatible h1:xD8LkuVZLV5OOn/IEuFdt6EEAW7deWiqgwaaSGhjAJc=\ngithub.com/shuLhan/go-bindata v4.0.0+incompatible/go.mod h1:pkcPAATLBDD2+SpAPnX5vEM90F7fcwHCvvLCMXcmw3g=\ngithub.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=\ngithub.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=\ngithub.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0=\ngithub.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=\ngithub.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=\ngithub.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=\ngithub.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=\ngithub.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=\ngithub.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=\ngithub.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q=\ngithub.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=\ngithub.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=\ngithub.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=\ngithub.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=\ngithub.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=\ngithub.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=\ngithub.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=\ngithub.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=\ngithub.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=\ngithub.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk=\ngithub.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngo.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=\ngo.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=\ngo.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=\ngo.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=\ngo.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=\ngo.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=\ngo.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=\ngo.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0=\ngo.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q=\ngo.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE=\ngo.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc=\ngo.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=\ngo.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=\ngo.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=\ngo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E=\ngo.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=\ngo.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=\ngo.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM=\ngo.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=\ngo.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=\ngo.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=\ngo.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE=\ngo.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE=\ngo.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=\ngo.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=\ngo.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc=\ngo.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o=\ngo.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=\ngo.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=\ngo.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=\ngo.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=\ngo.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=\ngo.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=\ngo.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=\ngo.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=\ngolang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=\ngolang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=\ngolang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=\ngolang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=\ngolang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=\ngoogle.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=\ngoogle.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=\ngoogle.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=\ngoogle.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=\ngoogle.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=\ngoogle.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=\ngoogle.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=\ngoogle.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=\ngoogle.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=\ngoogle.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\ngoogle.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\ngoogle.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=\ngopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=\ngopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=\ngopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=\ngopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=\ngopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e h1:3i3ny04XV6HbZ2N1oIBw1UBYATHAOpo4tfTF83JM3Z0=\ngopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=\ngotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nk8s.io/api v0.24.0 h1:J0hann2hfxWr1hinZIDefw7Q96wmCBx6SSB8IY0MdDg=\nk8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I=\nk8s.io/apiextensions-apiserver v0.24.0 h1:JfgFqbA8gKJ/uDT++feAqk9jBIwNnL9YGdQvaI9DLtY=\nk8s.io/apiextensions-apiserver v0.24.0/go.mod h1:iuVe4aEpe6827lvO6yWQVxiPSpPoSKVjkq+MIdg84cM=\nk8s.io/apimachinery v0.24.0 h1:ydFCyC/DjCvFCHK5OPMKBlxayQytB8pxy8YQInd5UyQ=\nk8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=\nk8s.io/apiserver v0.24.0/go.mod h1:WFx2yiOMawnogNToVvUYT9nn1jaIkMKj41ZYCVycsBA=\nk8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw=\nk8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w=\nk8s.io/code-generator v0.24.3 h1:itd1V1ZAYKM+WT+qQDlFKhU1D/Ff5HcEFL/icfClnZA=\nk8s.io/code-generator v0.24.3/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w=\nk8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA=\nk8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=\nk8s.io/gengo v0.0.0-20211129171323-c02415ce4185 h1:TT1WdmqqXareKxZ/oNXEUSwKlLiHzPMyB0t8BaFeBYI=\nk8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=\nk8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=\nk8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=\nk8s.io/klog/v2 v2.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc=\nk8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=\nk8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk=\nk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s=\nk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4=\nk8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=\nk8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc=\nk8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw=\nsigs.k8s.io/controller-tools v0.9.2 h1:AkTE3QAdz9LS4iD3EJvHyYxBkg/g9fTbgiYsrcsFCcM=\nsigs.k8s.io/controller-tools v0.9.2/go.mod h1:NUkn8FTV3Sad3wWpSK7dt/145qfuQ8CKJV6j4jHC5rM=\nsigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y=\nsigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY=\nsigs.k8s.io/kustomize/api v0.12.1 h1:7YM7gW3kYBwtKvoY216ZzY+8hM+lV53LUayghNRJ0vM=\nsigs.k8s.io/kustomize/api v0.12.1/go.mod h1:y3JUhimkZkR6sbLNwfJHxvo1TCLwuwm14sCYnkH6S1s=\nsigs.k8s.io/kustomize/cmd/config v0.10.9 h1:LV8AUwZPuvqhGfia50uNwsPwNg1xOy9koEf5hyBnYs4=\nsigs.k8s.io/kustomize/cmd/config v0.10.9/go.mod h1:T0s850zPV3wKfBALA0dyeP/K74jlJcoP8Pr9ZWwE3MQ=\nsigs.k8s.io/kustomize/kustomize/v4 v4.5.7 h1:cDW6AVMl6t/SLuQaezMET8hgnadZGIAr8tUrxFVOrpg=\nsigs.k8s.io/kustomize/kustomize/v4 v4.5.7/go.mod h1:VSNKEH9D9d9bLiWEGbS6Xbg/Ih0tgQalmPvntzRxZ/Q=\nsigs.k8s.io/kustomize/kyaml v0.13.9 h1:Qz53EAaFFANyNgyOEJbT/yoIHygK40/ZcvU3rgry2Tk=\nsigs.k8s.io/kustomize/kyaml v0.13.9/go.mod h1:QsRbD0/KcU+wdk0/L0fIp2KLnohkVzs6fQ85/nOXac4=\nsigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=\nsigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=\nsigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=\nsigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=\n"
  },
  {
    "path": "hack/tools/main.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// This file is only present to make the linter happy.\n\npackage main\n\nfunc main() {}\n"
  },
  {
    "path": "hack/tools/tools.go",
    "content": "//go:build tools\n// +build tools\n\n// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package tools imports things required by build scripts, to force `go mod` to see them as dependencies\n\npackage tools\n\nimport (\n\t_ \"github.com/maxbrunsfeld/counterfeiter/v6\"\n\t_ \"github.com/onsi/ginkgo/ginkgo\"\n\t_ \"github.com/shuLhan/go-bindata\"\n\t_ \"golang.org/x/tools/cmd/goimports\"\n\t_ \"k8s.io/code-generator/cmd/conversion-gen\"\n\t_ \"sigs.k8s.io/controller-tools/cmd/controller-gen\"\n\t_ \"sigs.k8s.io/kustomize/kustomize/v4\"\n)\n"
  },
  {
    "path": "hack/verify-dirty.sh",
    "content": "#!/bin/bash\n# Copyright 2021 VMware, Inc. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\nset -euo pipefail\n\necho \"#############################\"\necho \"Verify uncommitted files...\"\necho \"#############################\"\n\nif ! (git diff --quiet HEAD -- .); then\n   echo -e \"\\nThe following files are uncommitted. Please commit them or add them to .gitignore:\";\n   git diff --name-only HEAD -- . | awk '{print \"- \" $0}'\n   echo -e \"\\nDiff:\"\n   git --no-pager diff  HEAD -- .\n   exit 1\nelse\n   echo \"OK\"\nfi\n\necho\necho \"#############################\"\necho \"Verify make package-vendir-sync...\"\necho \"#############################\"\nmake package-vendir-sync\necho \"Done vendir sync!\"\n\n# This is required for github actions execution\n# because the package-vendir-sync operation renders\n# the pakcage directory contents inaccessible to the\n# host machine user.\nif [[ -n \"${GITHUB_ACTIONS:-}\" ]]; then\n  echo \"Resetting directory ownership\"\n  sudo chown -R $(id -nu):$(id -ng) .;\nfi\n\nif ! (git diff --quiet HEAD -- .); then\n  echo \"FAIL\"\n  echo \"'make package-vendir-sync' generated diffs!\"\n  echo \"Please verify if package CRD changes are intended and commit the diffs if so.\"\n  git diff --name-only HEAD -- . | awk '{print \"- \" $0}'\n  echo -e \"\\nDiff:\"\n  git --no-pager diff  HEAD -- .\n  exit 1 \nelse\n  echo \"OK\"\nfi\n"
  },
  {
    "path": "main.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage main\n\nfunc main() {}\n"
  },
  {
    "path": "packages/README.md",
    "content": "# Packages\n\nThis directory contains two types of packages. Management Packages and Standalone Packages\n\n## Management Packages\n\nThis directory contains some carvel packages for management components. Any package that performs the role of managing and operating a workload cluster is a Management package. These management packages are purpose-built to be installed on the management cluster. More details about packages can be found [here](../docs/packages/definitions.md)\n\nThese management packages are associated with each other in terms of [Meta Package](../docs/packages/definitions.md#meta-package). A Meta Package contains PackageInstall CRs, Secrets and ServiceAccounts, RBAC rules that are needed to install other packages and when the meta package is installed, it installs the other packages.\n\nBelow is the hierarchy of management packages association:\n\n- tkg (TKG Meta Package)\n  - framework (Framework Meta Package)\n    - addons-manager\n    - tkr-service\n    - featuregates\n    - tanzu-auth\n    - cliplugins\n  - tkg-clusterclass (TKG ClusterClass Meta Package)\n    - tkg-clusterclass-docker\n    - tkg-clusterclass-aws\n    - tkg-clusterclass-azure\n    - tkg-clusterclass-vsphere\n  - core-management-plugins\n  - tkr-source-controller\n\nAs part of the Bootstrap and Management Cluster creation, the `management-cluster` plugin installs the `tkg` meta package which installs all child packages. As part of this package installation the `management-cluster` plugin creates a [values.yaml](./tkg/bundle/config/values.yaml) file based on the user input. The configuration is then propagated to child packages based on overlays written within the package.\n\nThere are few management packages created under this directory which are not used at the moment and not integrated with the `tkg` meta package. Below is the list of these packages:\n\n- cluster-api\n- cluster-api-bootstrap-kubeadm\n- cluster-api-control-plane-kubeadm\n- cluster-api-provider-aws\n- cluster-api-provider-azure\n- cluster-api-provider-docker\n- cluster-api-provider-vsphere\n\n## Standalone Packages\n\nThis type of carvel packages are individual packages that don't depend on other packages. Below is the list of standalone packages:\n\n- standalone-plugins\n- capabilities\n- tkg-autoscaler\n- tkg-storageclass\n"
  },
  {
    "path": "packages/capabilities/Makefile",
    "content": "# Copyright 2021 VMware, Inc. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\nconfigure-package: ## Configure package before creating the package\n\nreset-package: ## Reset configured package\n"
  },
  {
    "path": "packages/capabilities/README.md",
    "content": "# Capabilities Package\n\nCapabilities package provides Capabilities API that offers the ability to query a cluster's capabilities.\nA \"capability\" is defined as anything a Kubernetes cluster can do or have, such as objects, and the API surface area.\nCapability discovery can be used to answer questions such as `Is this a TKG cluster?`, `Does this cluster have a\nresource Foo?` etc.\n\n## Components\n\n* capabilities-controller\n\n## Usage Example\n\nTo learn more about the Capabilities API and controller and how to use it, refer to this\n[doc](../../../docs/api-machinery/capability-discovery.md)\n"
  },
  {
    "path": "packages/capabilities/bundle/config/overlays/update-clusterrole-with-psp.yaml",
    "content": "#@ load(\"@ytt:overlay\", \"overlay\")\n#@ load(\"@ytt:data\", \"data\")\n\n#@ def parse_resource_psp_names(rbac):\n#@   if not hasattr(rbac, \"podSecurityPolicyNames\") or rbac.podSecurityPolicyNames == None:\n#@     return []\n#@   end\n#@   return rbac.podSecurityPolicyNames\n#@ end\n\n#@ pspNames = parse_resource_psp_names(data.values.rbac)\n\n#@ if pspNames:\n#@overlay/match by=overlay.subset({\"kind\": \"ClusterRole\", \"metadata\": {\"name\": \"tanzu-capabilities-manager-clusterrole\"}}),expects=\"1+\"\n---\nrules:\n  #@overlay/append\n  - apiGroups:\n      - policy\n    resources:\n      - podsecuritypolicies\n    verbs:\n      - use\n    resourceNames: #@ pspNames\n#@ end\n"
  },
  {
    "path": "packages/capabilities/bundle/config/upstream/crds/core/core.tanzu.vmware.com_capabilities.yaml",
    "content": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.9.2\n  creationTimestamp: null\n  name: capabilities.core.tanzu.vmware.com\nspec:\n  group: core.tanzu.vmware.com\n  names:\n    kind: Capability\n    listKind: CapabilityList\n    plural: capabilities\n    singular: capability\n  scope: Namespaced\n  versions:\n  - name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: Capability is the Schema for the capabilities API\n        properties:\n          apiVersion:\n            description: 'APIVersion defines the versioned schema of this representation\n              of an object. Servers should convert recognized schemas to the latest\n              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'\n            type: string\n          kind:\n            description: 'Kind is a string value representing the REST resource this\n              object represents. Servers may infer this from the endpoint the client\n              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: Spec is the capability spec that has cluster queries.\n            properties:\n              queries:\n                description: Queries specifies set of queries that are evaluated.\n                items:\n                  description: Query is a logical grouping of GVR, Object and PartialSchema\n                    queries.\n                  properties:\n                    groupVersionResources:\n                      description: GroupVersionResources evaluates a slice of GVR\n                        queries.\n                      items:\n                        description: QueryGVR queries for an API group with the optional\n                          ability to check for API versions and resource.\n                        properties:\n                          group:\n                            description: Group is the API group to check for in the\n                              cluster.\n                            type: string\n                          name:\n                            description: Name is the unique name of the query.\n                            minLength: 1\n                            type: string\n                          resource:\n                            description: Resource is the API resource to check for\n                              given an API group and a slice of versions. Specifying\n                              a Resource requires at least one version to be specified\n                              in Versions.\n                            type: string\n                          versions:\n                            description: Versions is the slice of versions to check\n                              for in the specified API group.\n                            items:\n                              type: string\n                            type: array\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    name:\n                      description: Name is the unique name of the query.\n                      minLength: 1\n                      type: string\n                    objects:\n                      description: Objects evaluates a slice of Object queries.\n                      items:\n                        description: QueryObject represents any runtime.Object that\n                          could exist in a cluster with the ability to check for annotations.\n                        properties:\n                          name:\n                            description: Name is the unique name of the query.\n                            minLength: 1\n                            type: string\n                          objectReference:\n                            description: ObjectReference is the ObjectReference to\n                              check for in the cluster.\n                            properties:\n                              apiVersion:\n                                description: API version of the referent.\n                                type: string\n                              fieldPath:\n                                description: 'If referring to a piece of an object\n                                  instead of an entire object, this string should\n                                  contain a valid JSON/Go field access statement,\n                                  such as desiredState.manifest.containers[2]. For\n                                  example, if the object reference is to a container\n                                  within a pod, this would take on a value like: \"spec.containers{name}\"\n                                  (where \"name\" refers to the name of the container\n                                  that triggered the event) or if no container name\n                                  is specified \"spec.containers[2]\" (container with\n                                  index 2 in this pod). This syntax is chosen only\n                                  to have some well-defined way of referencing a part\n                                  of an object. TODO: this design is not final and\n                                  this field is subject to change in the future.'\n                                type: string\n                              kind:\n                                description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n                                type: string\n                              name:\n                                description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'\n                                type: string\n                              namespace:\n                                description: 'Namespace of the referent. More info:\n                                  https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'\n                                type: string\n                              resourceVersion:\n                                description: 'Specific resourceVersion to which this\n                                  reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency'\n                                type: string\n                              uid:\n                                description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids'\n                                type: string\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          withAnnotations:\n                            additionalProperties:\n                              type: string\n                            description: WithAnnotations are the annotations whose\n                              presence is checked in the object. The query succeeds\n                              only if all the annotations specified exists.\n                            type: object\n                          withoutAnnotations:\n                            additionalProperties:\n                              type: string\n                            description: WithAnnotations are the annotations whose\n                              absence is checked in the object. The query succeeds\n                              only if all the annotations specified do not exist.\n                            type: object\n                        required:\n                        - name\n                        - objectReference\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    partialSchemas:\n                      description: PartialSchemas evaluates a slice of PartialSchema\n                        queries.\n                      items:\n                        description: QueryPartialSchema queries for any OpenAPI schema\n                          that may exist on a cluster.\n                        properties:\n                          name:\n                            description: Name is the unique name of the query.\n                            minLength: 1\n                            type: string\n                          partialSchema:\n                            description: PartialSchema is the partial OpenAPI schema\n                              that will be matched in a cluster.\n                            minLength: 1\n                            type: string\n                        required:\n                        - name\n                        - partialSchema\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n              serviceAccountName:\n                description: ServiceAccountName is the name of the service account\n                  with which requests are made to the API server for evaluating queries.\n                  Service account should exist in the same namespace as this resource.\n                  When this field is not specified, a default service account with\n                  only the ability to execute GVR queries is used.\n                type: string\n            required:\n            - queries\n            type: object\n          status:\n            description: Status is the capability status that has results of cluster\n              queries.\n            properties:\n              results:\n                description: Results represents the results of all the queries specified\n                  in the spec.\n                items:\n                  description: Result represents the results of queries in Query.\n                  properties:\n                    groupVersionResources:\n                      description: GroupVersionResources represents results of GVR\n                        queries in spec.\n                      items:\n                        description: QueryResult represents the result of a single\n                          query.\n                        properties:\n                          error:\n                            description: Error indicates if an error occurred while\n                              processing the query.\n                            type: boolean\n                          errorDetail:\n                            description: ErrorDetail represents the error detail,\n                              if an error occurred.\n                            type: string\n                          found:\n                            description: Found is a boolean which indicates if the\n                              query condition succeeded.\n                            type: boolean\n                          name:\n                            description: Name is the name of the query in spec whose\n                              result this struct represents.\n                            minLength: 1\n                            type: string\n                          notFoundReason:\n                            description: NotFoundReason provides the reason if the\n                              query condition fails. This is non-empty when Found\n                              is false.\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    name:\n                      description: Name is the unique name of the query.\n                      minLength: 1\n                      type: string\n                    objects:\n                      description: Objects represents results of Object queries in\n                        spec.\n                      items:\n                        description: QueryResult represents the result of a single\n                          query.\n                        properties:\n                          error:\n                            description: Error indicates if an error occurred while\n                              processing the query.\n                            type: boolean\n                          errorDetail:\n                            description: ErrorDetail represents the error detail,\n                              if an error occurred.\n                            type: string\n                          found:\n                            description: Found is a boolean which indicates if the\n                              query condition succeeded.\n                            type: boolean\n                          name:\n                            description: Name is the name of the query in spec whose\n                              result this struct represents.\n                            minLength: 1\n                            type: string\n                          notFoundReason:\n                            description: NotFoundReason provides the reason if the\n                              query condition fails. This is non-empty when Found\n                              is false.\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    partialSchemas:\n                      description: PartialSchemas represents results of PartialSchema\n                        queries in spec.\n                      items:\n                        description: QueryResult represents the result of a single\n                          query.\n                        properties:\n                          error:\n                            description: Error indicates if an error occurred while\n                              processing the query.\n                            type: boolean\n                          errorDetail:\n                            description: ErrorDetail represents the error detail,\n                              if an error occurred.\n                            type: string\n                          found:\n                            description: Found is a boolean which indicates if the\n                              query condition succeeded.\n                            type: boolean\n                          name:\n                            description: Name is the name of the query in spec whose\n                              result this struct represents.\n                            minLength: 1\n                            type: string\n                          notFoundReason:\n                            description: NotFoundReason provides the reason if the\n                              query condition fails. This is non-empty when Found\n                              is false.\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n            required:\n            - results\n            type: object\n        type: object\n    served: false\n    storage: false\n    subresources:\n      status: {}\n  - name: v1alpha2\n    schema:\n      openAPIV3Schema:\n        description: Capability is the Schema for the capabilities API\n        properties:\n          apiVersion:\n            description: 'APIVersion defines the versioned schema of this representation\n              of an object. Servers should convert recognized schemas to the latest\n              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'\n            type: string\n          kind:\n            description: 'Kind is a string value representing the REST resource this\n              object represents. Servers may infer this from the endpoint the client\n              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: Spec is the capability spec that has cluster queries.\n            properties:\n              queries:\n                description: Queries specifies set of queries that are evaluated.\n                items:\n                  description: Query is a logical grouping of GVR, Object and PartialSchema\n                    queries.\n                  properties:\n                    groupVersionResources:\n                      description: GroupVersionResources evaluates a slice of GVR\n                        queries.\n                      items:\n                        description: QueryGVR queries for an API group with the optional\n                          ability to check for API versions and resource.\n                        properties:\n                          group:\n                            description: Group is the API group to check for in the\n                              cluster.\n                            type: string\n                          name:\n                            description: Name is the unique name of the query.\n                            minLength: 1\n                            type: string\n                          resource:\n                            description: Resource is the API resource to check for\n                              given an API group and a slice of versions. Specifying\n                              a Resource requires at least one version to be specified\n                              in Versions.\n                            type: string\n                          versions:\n                            description: Versions is the slice of versions to check\n                              for in the specified API group.\n                            items:\n                              type: string\n                            type: array\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    name:\n                      description: Name is the unique name of the query.\n                      minLength: 1\n                      type: string\n                    objects:\n                      description: Objects evaluates a slice of Object queries.\n                      items:\n                        description: QueryObject represents any runtime.Object that\n                          could exist in a cluster with the ability to check for annotations.\n                        properties:\n                          name:\n                            description: Name is the unique name of the query.\n                            minLength: 1\n                            type: string\n                          objectReference:\n                            description: ObjectReference is the ObjectReference to\n                              check for in the cluster.\n                            properties:\n                              apiVersion:\n                                description: API version of the referent.\n                                type: string\n                              fieldPath:\n                                description: 'If referring to a piece of an object\n                                  instead of an entire object, this string should\n                                  contain a valid JSON/Go field access statement,\n                                  such as desiredState.manifest.containers[2]. For\n                                  example, if the object reference is to a container\n                                  within a pod, this would take on a value like: \"spec.containers{name}\"\n                                  (where \"name\" refers to the name of the container\n                                  that triggered the event) or if no container name\n                                  is specified \"spec.containers[2]\" (container with\n                                  index 2 in this pod). This syntax is chosen only\n                                  to have some well-defined way of referencing a part\n                                  of an object. TODO: this design is not final and\n                                  this field is subject to change in the future.'\n                                type: string\n                              kind:\n                                description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n                                type: string\n                              name:\n                                description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'\n                                type: string\n                              namespace:\n                                description: 'Namespace of the referent. More info:\n                                  https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'\n                                type: string\n                              resourceVersion:\n                                description: 'Specific resourceVersion to which this\n                                  reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency'\n                                type: string\n                              uid:\n                                description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids'\n                                type: string\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          withAnnotations:\n                            additionalProperties:\n                              type: string\n                            description: WithAnnotations are the annotations whose\n                              presence is checked in the object. The query succeeds\n                              only if all the annotations specified exists.\n                            type: object\n                          withoutAnnotations:\n                            additionalProperties:\n                              type: string\n                            description: WithAnnotations are the annotations whose\n                              absence is checked in the object. The query succeeds\n                              only if all the annotations specified do not exist.\n                            type: object\n                        required:\n                        - name\n                        - objectReference\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    partialSchemas:\n                      description: PartialSchemas evaluates a slice of PartialSchema\n                        queries.\n                      items:\n                        description: QueryPartialSchema queries for any OpenAPI schema\n                          that may exist on a cluster.\n                        properties:\n                          name:\n                            description: Name is the unique name of the query.\n                            minLength: 1\n                            type: string\n                          partialSchema:\n                            description: PartialSchema is the partial OpenAPI schema\n                              that will be matched in a cluster.\n                            minLength: 1\n                            type: string\n                        required:\n                        - name\n                        - partialSchema\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n              serviceAccountName:\n                description: ServiceAccountName is the name of the service account\n                  with which requests are made to the API server for evaluating queries.\n                  Service account should exist in the same namespace as this resource.\n                  When this field is not specified, a default service account with\n                  only the ability to execute GVR queries is used.\n                type: string\n            required:\n            - queries\n            type: object\n          status:\n            description: Status is the capability status that has results of cluster\n              queries.\n            properties:\n              results:\n                description: Results represents the results of all the queries specified\n                  in the spec.\n                items:\n                  description: Result represents the results of queries in Query.\n                  properties:\n                    groupVersionResources:\n                      description: GroupVersionResources represents results of GVR\n                        queries in spec.\n                      items:\n                        description: QueryResult represents the result of a single\n                          query.\n                        properties:\n                          error:\n                            description: Error indicates if an error occurred while\n                              processing the query.\n                            type: boolean\n                          errorDetail:\n                            description: ErrorDetail represents the error detail,\n                              if an error occurred.\n                            type: string\n                          found:\n                            description: Found is a boolean which indicates if the\n                              query condition succeeded.\n                            type: boolean\n                          name:\n                            description: Name is the name of the query in spec whose\n                              result this struct represents.\n                            minLength: 1\n                            type: string\n                          notFoundReason:\n                            description: NotFoundReason provides the reason if the\n                              query condition fails. This is non-empty when Found\n                              is false.\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    name:\n                      description: Name is the unique name of the query.\n                      minLength: 1\n                      type: string\n                    objects:\n                      description: Objects represents results of Object queries in\n                        spec.\n                      items:\n                        description: QueryResult represents the result of a single\n                          query.\n                        properties:\n                          error:\n                            description: Error indicates if an error occurred while\n                              processing the query.\n                            type: boolean\n                          errorDetail:\n                            description: ErrorDetail represents the error detail,\n                              if an error occurred.\n                            type: string\n                          found:\n                            description: Found is a boolean which indicates if the\n                              query condition succeeded.\n                            type: boolean\n                          name:\n                            description: Name is the name of the query in spec whose\n                              result this struct represents.\n                            minLength: 1\n                            type: string\n                          notFoundReason:\n                            description: NotFoundReason provides the reason if the\n                              query condition fails. This is non-empty when Found\n                              is false.\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    partialSchemas:\n                      description: PartialSchemas represents results of PartialSchema\n                        queries in spec.\n                      items:\n                        description: QueryResult represents the result of a single\n                          query.\n                        properties:\n                          error:\n                            description: Error indicates if an error occurred while\n                              processing the query.\n                            type: boolean\n                          errorDetail:\n                            description: ErrorDetail represents the error detail,\n                              if an error occurred.\n                            type: string\n                          found:\n                            description: Found is a boolean which indicates if the\n                              query condition succeeded.\n                            type: boolean\n                          name:\n                            description: Name is the name of the query in spec whose\n                              result this struct represents.\n                            minLength: 1\n                            type: string\n                          notFoundReason:\n                            description: NotFoundReason provides the reason if the\n                              query condition fails. This is non-empty when Found\n                              is false.\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n            required:\n            - results\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n"
  },
  {
    "path": "packages/capabilities/bundle/config/upstream/crds/run/run.tanzu.vmware.com_capabilities.yaml",
    "content": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.8.0\n  creationTimestamp: null\n  name: capabilities.run.tanzu.vmware.com\nspec:\n  group: run.tanzu.vmware.com\n  names:\n    kind: Capability\n    listKind: CapabilityList\n    plural: capabilities\n    singular: capability\n  scope: Namespaced\n  versions:\n  - deprecated: true\n    deprecationWarning: Capabilities API in run API group is deprecated, use Capabilities\n      API in core API group\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: Capability is the Schema for the capabilities API\n        properties:\n          apiVersion:\n            description: 'APIVersion defines the versioned schema of this representation\n              of an object. Servers should convert recognized schemas to the latest\n              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'\n            type: string\n          kind:\n            description: 'Kind is a string value representing the REST resource this\n              object represents. Servers may infer this from the endpoint the client\n              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: Spec is the capability spec that has cluster queries.\n            properties:\n              queries:\n                description: Queries specifies set of queries that are evaluated.\n                items:\n                  description: Query is a logical grouping of GVR, Object and PartialSchema\n                    queries.\n                  properties:\n                    groupVersionResources:\n                      description: GroupVersionResources evaluates a slice of GVR\n                        queries.\n                      items:\n                        description: QueryGVR queries for an API group with the optional\n                          ability to check for API versions and resource.\n                        properties:\n                          group:\n                            description: Group is the API group to check for in the\n                              cluster.\n                            type: string\n                          name:\n                            description: Name is the unique name of the query.\n                            minLength: 1\n                            type: string\n                          resource:\n                            description: Resource is the API resource to check for\n                              given an API group and a slice of versions. Specifying\n                              a Resource requires at least one version to be specified\n                              in Versions.\n                            type: string\n                          versions:\n                            description: Versions is the slice of versions to check\n                              for in the specified API group.\n                            items:\n                              type: string\n                            type: array\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    name:\n                      description: Name is the unique name of the query.\n                      minLength: 1\n                      type: string\n                    objects:\n                      description: Objects evaluates a slice of Object queries.\n                      items:\n                        description: QueryObject represents any runtime.Object that\n                          could exist in a cluster with the ability to check for annotations.\n                        properties:\n                          name:\n                            description: Name is the unique name of the query.\n                            minLength: 1\n                            type: string\n                          objectReference:\n                            description: ObjectReference is the ObjectReference to\n                              check for in the cluster.\n                            properties:\n                              apiVersion:\n                                description: API version of the referent.\n                                type: string\n                              fieldPath:\n                                description: 'If referring to a piece of an object\n                                  instead of an entire object, this string should\n                                  contain a valid JSON/Go field access statement,\n                                  such as desiredState.manifest.containers[2]. For\n                                  example, if the object reference is to a container\n                                  within a pod, this would take on a value like: \"spec.containers{name}\"\n                                  (where \"name\" refers to the name of the container\n                                  that triggered the event) or if no container name\n                                  is specified \"spec.containers[2]\" (container with\n                                  index 2 in this pod). This syntax is chosen only\n                                  to have some well-defined way of referencing a part\n                                  of an object. TODO: this design is not final and\n                                  this field is subject to change in the future.'\n                                type: string\n                              kind:\n                                description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n                                type: string\n                              name:\n                                description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'\n                                type: string\n                              namespace:\n                                description: 'Namespace of the referent. More info:\n                                  https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'\n                                type: string\n                              resourceVersion:\n                                description: 'Specific resourceVersion to which this\n                                  reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency'\n                                type: string\n                              uid:\n                                description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids'\n                                type: string\n                            type: object\n                          withAnnotations:\n                            additionalProperties:\n                              type: string\n                            description: WithAnnotations are the annotations whose\n                              presence is checked in the object. The query succeeds\n                              only if all the annotations specified exists.\n                            type: object\n                          withoutAnnotations:\n                            additionalProperties:\n                              type: string\n                            description: WithAnnotations are the annotations whose\n                              absence is checked in the object. The query succeeds\n                              only if all the annotations specified do not exist.\n                            type: object\n                        required:\n                        - name\n                        - objectReference\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    partialSchemas:\n                      description: PartialSchemas evaluates a slice of PartialSchema\n                        queries.\n                      items:\n                        description: QueryPartialSchema queries for any OpenAPI schema\n                          that may exist on a cluster.\n                        properties:\n                          name:\n                            description: Name is the unique name of the query.\n                            minLength: 1\n                            type: string\n                          partialSchema:\n                            description: PartialSchema is the partial OpenAPI schema\n                              that will be matched in a cluster.\n                            minLength: 1\n                            type: string\n                        required:\n                        - name\n                        - partialSchema\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n              serviceAccountName:\n                description: ServiceAccountName is the name of the service account\n                  with which requests are made to the API server for evaluating queries.\n                  Service account should exist in the same namespace as this resource.\n                  When this field is not specified, a default service account with\n                  only the ability to execute GVR queries is used.\n                type: string\n            required:\n            - queries\n            type: object\n          status:\n            description: Status is the capability status that has results of cluster\n              queries.\n            properties:\n              results:\n                description: Results represents the results of all the queries specified\n                  in the spec.\n                items:\n                  description: Result represents the results of queries in Query.\n                  properties:\n                    groupVersionResources:\n                      description: GroupVersionResources represents results of GVR\n                        queries in spec.\n                      items:\n                        description: QueryResult represents the result of a single\n                          query.\n                        properties:\n                          error:\n                            description: Error indicates if an error occurred while\n                              processing the query.\n                            type: boolean\n                          errorDetail:\n                            description: ErrorDetail represents the error detail,\n                              if an error occurred.\n                            type: string\n                          found:\n                            description: Found is a boolean which indicates if the\n                              query condition succeeded.\n                            type: boolean\n                          name:\n                            description: Name is the name of the query in spec whose\n                              result this struct represents.\n                            minLength: 1\n                            type: string\n                          notFoundReason:\n                            description: NotFoundReason provides the reason if the\n                              query condition fails. This is non-empty when Found\n                              is false.\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    name:\n                      description: Name is the unique name of the query.\n                      minLength: 1\n                      type: string\n                    objects:\n                      description: Objects represents results of Object queries in\n                        spec.\n                      items:\n                        description: QueryResult represents the result of a single\n                          query.\n                        properties:\n                          error:\n                            description: Error indicates if an error occurred while\n                              processing the query.\n                            type: boolean\n                          errorDetail:\n                            description: ErrorDetail represents the error detail,\n                              if an error occurred.\n                            type: string\n                          found:\n                            description: Found is a boolean which indicates if the\n                              query condition succeeded.\n                            type: boolean\n                          name:\n                            description: Name is the name of the query in spec whose\n                              result this struct represents.\n                            minLength: 1\n                            type: string\n                          notFoundReason:\n                            description: NotFoundReason provides the reason if the\n                              query condition fails. This is non-empty when Found\n                              is false.\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    partialSchemas:\n                      description: PartialSchemas represents results of PartialSchema\n                        queries in spec.\n                      items:\n                        description: QueryResult represents the result of a single\n                          query.\n                        properties:\n                          error:\n                            description: Error indicates if an error occurred while\n                              processing the query.\n                            type: boolean\n                          errorDetail:\n                            description: ErrorDetail represents the error detail,\n                              if an error occurred.\n                            type: string\n                          found:\n                            description: Found is a boolean which indicates if the\n                              query condition succeeded.\n                            type: boolean\n                          name:\n                            description: Name is the name of the query in spec whose\n                              result this struct represents.\n                            minLength: 1\n                            type: string\n                          notFoundReason:\n                            description: NotFoundReason provides the reason if the\n                              query condition fails. This is non-empty when Found\n                              is false.\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n            required:\n            - results\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\nstatus:\n  acceptedNames:\n    kind: \"\"\n    plural: \"\"\n  conditions: []\n  storedVersions: []\n"
  },
  {
    "path": "packages/capabilities/bundle/config/upstream/default-serviceaccount.yaml",
    "content": "#@ load(\"@ytt:data\", \"data\")\n\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  labels:\n    app: tanzu-capabilities-manager\n  name: tanzu-capabilities-manager-default-sa\n  namespace: #@ data.values.namespace\n"
  },
  {
    "path": "packages/capabilities/bundle/config/upstream/rbac.yaml",
    "content": "#@ load(\"@ytt:data\", \"data\")\n\n---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  labels:\n    app: tanzu-capabilities-manager\n  name: tanzu-capabilities-manager-sa\n  namespace: #@ data.values.namespace\n  annotations:\n    kapp.k14s.io/change-group: \"capabilities.run.tanzu.vmware.com/serviceaccount\"\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  name: tanzu-capabilities-manager-clusterrole\n  annotations:\n    kapp.k14s.io/change-group: \"capabilities.run.tanzu.vmware.com/serviceaccount\"\nrules:\n  - apiGroups:\n      - run.tanzu.vmware.com\n    resources:\n      - capabilities\n    verbs:\n      - create\n      - delete\n      - get\n      - list\n      - patch\n      - update\n      - watch\n  - apiGroups:\n      - run.tanzu.vmware.com\n    resources:\n      - capabilities/status\n    verbs:\n      - get\n      - patch\n      - update\n  - apiGroups:\n      - core.tanzu.vmware.com\n    resources:\n      - capabilities\n    verbs:\n      - create\n      - delete\n      - get\n      - list\n      - patch\n      - update\n      - watch\n  - apiGroups:\n      - core.tanzu.vmware.com\n    resources:\n      - capabilities/status\n    verbs:\n      - get\n      - patch\n      - update\n  - apiGroups:\n      - run.tanzu.vmware.com\n    resources:\n      - tanzukubernetesreleases\n      - tanzukubernetesreleases/status\n    verbs:\n      - get\n      - list\n      - watch\n  - apiGroups:\n      - \"\"\n    resources:\n      - serviceaccounts\n      - secrets\n    verbs:\n      - get\n      - list\n      - watch\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: tanzu-capabilities-manager-clusterrolebinding\n  annotations:\n    kapp.k14s.io/change-rule: \"upsert after upserting capabilities.run.tanzu.vmware.com/serviceaccount\"\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: tanzu-capabilities-manager-clusterrole\nsubjects:\n  - kind: ServiceAccount\n    name: tanzu-capabilities-manager-sa\n    namespace: #@ data.values.namespace\n"
  },
  {
    "path": "packages/capabilities/bundle/config/upstream/tanzu-capabilities-controller-manager.yaml",
    "content": "#@ load(\"@ytt:data\", \"data\")\n#@ load(\"@ytt:overlay\", \"overlay\")\n\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  labels:\n    app: tanzu-capabilities-manager\n  name: tanzu-capabilities-controller-manager\n  namespace: #@ data.values.namespace\n  annotations:\n    kapp.k14s.io/update-strategy: \"fallback-on-replace\"\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: tanzu-capabilities-manager\n  template:\n    metadata:\n      labels:\n        app: tanzu-capabilities-manager\n    spec:\n      containers:\n        - image: capabilities-controller-manager:latest\n          imagePullPolicy: IfNotPresent\n          name: manager\n          resources:\n            limits:\n              cpu: 100m\n              memory: 30Mi\n            requests:\n              cpu: 100m\n              memory: 20Mi\n      serviceAccount: tanzu-capabilities-manager-sa\n      terminationGracePeriodSeconds: 10\n      #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'hostNetwork') and data.values.deployment.hostNetwork:\n      #@overlay/match missing_ok=True\n      hostNetwork: true\n      #@ end\n      #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'tolerations') and data.values.deployment.tolerations:\n      #@overlay/match missing_ok=True\n      tolerations: #@ data.values.deployment.tolerations\n      #@ else:\n      tolerations:\n        - effect: NoSchedule\n          key: node-role.kubernetes.io/master\n        - effect: NoSchedule\n          key: node-role.kubernetes.io/control-plane\n      #@ end\n      #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'nodeSelector') and data.values.deployment.nodeSelector:\n      #@overlay/match missing_ok=True\n      nodeSelector: #@ data.values.deployment.nodeSelector\n      #@ end\n"
  },
  {
    "path": "packages/capabilities/bundle/config/values.yaml",
    "content": "#@data/values\n---\n\nnamespace: tkg-system\ndeployment:\n  hostNetwork: false\n  nodeSelector: {}\n  tolerations: []\nrbac:\n  #! PSP resource names capabilities controller should use in its ClusterRole rules.\n  podSecurityPolicyNames: []\n"
  },
  {
    "path": "packages/capabilities/kbld-config.yaml",
    "content": "apiVersion: kbld.k14s.io/v1alpha1\nkind: Config\noverrides:\n- image: capabilities-controller-manager:latest\n  newImage: \"\"\n"
  },
  {
    "path": "packages/capabilities/metadata.yaml",
    "content": "apiVersion: data.packaging.carvel.dev/v1alpha1\nkind: PackageMetadata\nmetadata:\n  name: capabilities.tanzu.vmware.com\n  namespace: capabilities\nspec:\n  displayName: \"capabilities\"\n  longDescription: \"Capabilities package provides Capabilities API that offers the ability to query a cluster's capabilities.\"\n  shortDescription: \"Cluster capabilities\"\n  providerName: VMware\n  maintainers:\n    - name: \"Rajath Agasthya\"\n    - name: \"Jeff Moroski\"\n    - name: \"Harish Yayi\"\n  categories:\n    - \"cluster capabilities\"\n"
  },
  {
    "path": "packages/capabilities/package.yaml",
    "content": "apiVersion: data.packaging.carvel.dev/v1alpha1\nkind: Package\nmetadata:\n  name: capabilities.tanzu.vmware.com\nspec:\n  refName: capabilities.tanzu.vmware.com\n  version: VERSION\n  template:\n    spec:\n      fetch:\n        - imgpkgBundle:\n            image: # This value is set at the build time\n      template:\n        - ytt:\n            paths:\n              - config/\n        - kbld:\n            paths:\n              - \"-\"\n              - .imgpkg/images.yml\n      deploy:\n        - kapp: {}\n"
  },
  {
    "path": "packages/capabilities/vendir.lock.yml",
    "content": "apiVersion: vendir.k14s.io/v1alpha1\ndirectories:\n- contents:\n  - manual: {}\n    path: crds/run\n  - directory: {}\n    path: crds/core\n  - manual: {}\n    path: rbac.yaml\n  - manual: {}\n    path: default-serviceaccount.yaml\n  - manual: {}\n    path: tanzu-capabilities-controller-manager.yaml\n  path: bundle/config/upstream\n- contents:\n  - manual: {}\n    path: update-clusterrole-with-psp.yaml\n  path: bundle/config/overlays\nkind: LockConfig\n"
  },
  {
    "path": "packages/capabilities/vendir.yml",
    "content": "apiVersion: vendir.k14s.io/v1alpha1\nkind: Config\nminimumRequiredVersion: 0.12.0\ndirectories:\n  - path: bundle/config/upstream\n    contents:\n      - path: crds/run\n        manual: {}\n      - path: crds/core\n        directory:\n          path: ../../apis/core/config/crd/bases/\n        includePaths:\n          - core.tanzu.vmware.com_capabilities.yaml\n      - path: rbac.yaml\n        manual: {}\n      - path: default-serviceaccount.yaml\n        manual: {}\n      - path: tanzu-capabilities-controller-manager.yaml\n        manual: {}\n  - path: bundle/config/overlays\n    contents:\n      - path: update-clusterrole-with-psp.yaml\n        manual: {}\n"
  },
  {
    "path": "packages/featuregates/Makefile",
    "content": "# Copyright 2021 VMware, Inc. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\nconfigure-package: ## Configure package before creating the package\n\nreset-package: ## Reset configured package\n"
  },
  {
    "path": "packages/featuregates/README.md",
    "content": "# featuregates Package\n\nFeaturegates management package provides Features and Featuregates APIs to\nallow developers to have a system to control rollout and availability of new\nFeatures.\n\n## Components\n\n* featuregate-controller\n\n## Usage Example\n\nTo learn more about the Featuregate controller and Features, FeatureGates APIs\nand how to use them, refer to this [doc](../../../docs/api-machinery/features-and-featuregates.md)\n"
  },
  {
    "path": "packages/featuregates/bundle/config/upstream/crds/config/config.tanzu.vmware.com_featuregates.yaml",
    "content": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.8.0\n  creationTimestamp: null\n  name: featuregates.config.tanzu.vmware.com\nspec:\n  group: config.tanzu.vmware.com\n  names:\n    kind: FeatureGate\n    listKind: FeatureGateList\n    plural: featuregates\n    singular: featuregate\n  scope: Cluster\n  versions:\n    - name: v1alpha1\n      schema:\n        openAPIV3Schema:\n          description: FeatureGate is the Schema for the featuregates API\n          properties:\n            apiVersion:\n              description: 'APIVersion defines the versioned schema of this representation\n              of an object. Servers should convert recognized schemas to the latest\n              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'\n              type: string\n            kind:\n              description: 'Kind is a string value representing the REST resource this\n              object represents. Servers may infer this from the endpoint the client\n              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n              type: string\n            metadata:\n              type: object\n            spec:\n              description: Spec is the specification for gating features.\n              properties:\n                features:\n                  description: Features is a slice of FeatureReference to gate features.\n                    The Feature resource specified may or may not be present in the\n                    system. If the Feature is present, the FeatureGate controller and\n                    webhook sets the specified activation state only if the Feature\n                    is discoverable and its immutability constraint is satisfied. If\n                    the Feature is not present, the activation intent is applied when\n                    the Feature resource appears in the system. The actual activation\n                    state of the Feature is reported in the status.\n                  items:\n                    description: FeatureReference refers to a Feature resource and specifies\n                      its intended activation state.\n                    properties:\n                      activate:\n                        description: Activate indicates the activation intent for the\n                          feature.\n                        type: boolean\n                      name:\n                        description: Name is the name of the Feature resource, which\n                          represents a feature the system offers.\n                        type: string\n                    required:\n                      - name\n                    type: object\n                  type: array\n                  x-kubernetes-list-map-keys:\n                    - name\n                  x-kubernetes-list-type: map\n                namespaceSelector:\n                  description: NamespaceSelector is a selector to specify namespaces\n                    for which this feature gate applies. Use an empty LabelSelector\n                    to match all namespaces.\n                  properties:\n                    matchExpressions:\n                      description: matchExpressions is a list of label selector requirements.\n                        The requirements are ANDed.\n                      items:\n                        description: A label selector requirement is a selector that\n                          contains values, a key, and an operator that relates the key\n                          and values.\n                        properties:\n                          key:\n                            description: key is the label key that the selector applies\n                              to.\n                            type: string\n                          operator:\n                            description: operator represents a key's relationship to\n                              a set of values. Valid operators are In, NotIn, Exists\n                              and DoesNotExist.\n                            type: string\n                          values:\n                            description: values is an array of string values. If the\n                              operator is In or NotIn, the values array must be non-empty.\n                              If the operator is Exists or DoesNotExist, the values\n                              array must be empty. This array is replaced during a strategic\n                              merge patch.\n                            items:\n                              type: string\n                            type: array\n                        required:\n                          - key\n                          - operator\n                        type: object\n                      type: array\n                    matchLabels:\n                      additionalProperties:\n                        type: string\n                      description: matchLabels is a map of {key,value} pairs. A single\n                        {key,value} in the matchLabels map is equivalent to an element\n                        of matchExpressions, whose key field is \"key\", the operator\n                        is \"In\", and the values array contains only \"value\". The requirements\n                        are ANDed.\n                      type: object\n                  type: object\n              required:\n                - namespaceSelector\n              type: object\n            status:\n              description: Status reports activation state and availability of features\n                in the system.\n              properties:\n                activatedFeatures:\n                  description: ActivatedFeatures lists the discovered features that\n                    are activated for the namespaces specified in the spec. This can\n                    include features that are not explicitly gated in the spec, but\n                    are already available in the system as Feature resources.\n                  items:\n                    type: string\n                  type: array\n                deactivatedFeatures:\n                  description: DeactivatedFeatures lists the discovered features that\n                    are deactivated for the namespaces specified in the spec. This can\n                    include features that are not explicitly gated in the spec, but\n                    are already available in the system as Feature resources.\n                  items:\n                    type: string\n                  type: array\n                namespaces:\n                  description: Namespaces lists the existing namespaces for which this\n                    feature gate applies. This is obtained from listing all namespaces\n                    and applying the NamespaceSelector specified in spec.\n                  items:\n                    type: string\n                  type: array\n                unavailableFeatures:\n                  description: UnavailableFeatures lists the features that are gated\n                    in the spec, but are not available in the system as Feature resources.\n                  items:\n                    type: string\n                  type: array\n              type: object\n          type: object\n      served: true\n      storage: true\n      subresources:\n        status: {}\nstatus:\n  acceptedNames:\n    kind: \"\"\n    plural: \"\"\n  conditions: []\n  storedVersions: []\n"
  },
  {
    "path": "packages/featuregates/bundle/config/upstream/crds/config/config.tanzu.vmware.com_features.yaml",
    "content": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.8.0\n  creationTimestamp: null\n  name: features.config.tanzu.vmware.com\nspec:\n  group: config.tanzu.vmware.com\n  names:\n    kind: Feature\n    listKind: FeatureList\n    plural: features\n    singular: feature\n  scope: Cluster\n  versions:\n    - additionalPrinterColumns:\n        - jsonPath: .spec.activated\n          name: Activated\n          type: boolean\n        - jsonPath: .spec.description\n          name: Description\n          type: string\n        - jsonPath: .spec.immutable\n          name: Immutable\n          type: boolean\n        - jsonPath: .spec.maturity\n          name: Maturity\n          type: string\n      name: v1alpha1\n      schema:\n        openAPIV3Schema:\n          description: Feature is the Schema for the features API\n          properties:\n            apiVersion:\n              description: 'APIVersion defines the versioned schema of this representation\n              of an object. Servers should convert recognized schemas to the latest\n              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'\n              type: string\n            kind:\n              description: 'Kind is a string value representing the REST resource this\n              object represents. Servers may infer this from the endpoint the client\n              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n              type: string\n            metadata:\n              type: object\n            spec:\n              description: FeatureSpec defines the desired state of Feature\n              properties:\n                activated:\n                  description: Activated defines the default state of the features activation\n                  type: boolean\n                description:\n                  description: Description of the feature.\n                  type: string\n                discoverable:\n                  description: Discoverable indicates if clients should include consider\n                    the Feature available for their use Allowing clients to control\n                    discoverability is one of the ways the API allows gradual rollout\n                    of functionality\n                  type: boolean\n                immutable:\n                  description: Immutable indicates this feature cannot be toggled once\n                    set If set at creation time, this state will persist for the life\n                    of the cluster\n                  type: boolean\n                maturity:\n                  description: 'Maturity indicates maturity level of this feature. Maturity\n                  levels are Dev, Alpha, Beta, GA and Deprecated. - dev: the default\n                  for new resources, represents local dev. intended to be hidden and\n                  deactivated - alpha: the first milestone meant for limited wider\n                  consumption, discoverable and defaults to deactivated - beta: greater\n                  visibility for proven designs, discoverable and defaults to activated\n                  - ga: intended to be part of the mainline codebase, non-optional\n                  - deprecated: destined for future removal'\n                  enum:\n                    - dev\n                    - alpha\n                    - beta\n                    - ga\n                    - deprecated\n                  type: string\n              required:\n                - activated\n                - discoverable\n                - immutable\n                - maturity\n              type: object\n            status:\n              description: FeatureStatus defines the observed state of Feature\n              type: object\n          type: object\n      served: true\n      storage: true\n      subresources: {}\nstatus:\n  acceptedNames:\n    kind: \"\"\n    plural: \"\"\n  conditions: []\n  storedVersions: []\n"
  },
  {
    "path": "packages/featuregates/bundle/config/upstream/crds/core/core.tanzu.vmware.com_featuregates.yaml",
    "content": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.9.2\n  creationTimestamp: null\n  name: featuregates.core.tanzu.vmware.com\nspec:\n  group: core.tanzu.vmware.com\n  names:\n    kind: FeatureGate\n    listKind: FeatureGateList\n    plural: featuregates\n    singular: featuregate\n  scope: Cluster\n  versions:\n  - name: v1alpha2\n    schema:\n      openAPIV3Schema:\n        description: FeatureGate is the Schema for the featuregates API\n        properties:\n          apiVersion:\n            description: 'APIVersion defines the versioned schema of this representation\n              of an object. Servers should convert recognized schemas to the latest\n              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'\n            type: string\n          kind:\n            description: 'Kind is a string value representing the REST resource this\n              object represents. Servers may infer this from the endpoint the client\n              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: Spec is the specification for gating features.\n            properties:\n              features:\n                description: Features is a slice of FeatureReference to gate features.\n                  Feature controller sets the specified activation state only if the\n                  Feature policy is satisfied.\n                items:\n                  description: FeatureReference refers to a Feature resource and specifies\n                    its intended activation state.\n                  properties:\n                    activate:\n                      description: Activate indicates the activation intent for the\n                        feature.\n                      type: boolean\n                    name:\n                      description: Name is the name of the Feature resource, which\n                        represents a feature the system offers.\n                      type: string\n                    permanentlyVoidAllSupportGuarantees:\n                      description: PermanentlyVoidAllSupportGuarantees when set to\n                        true permanently voids all support guarantees. Once set to\n                        true, cannot be set back to false\n                      type: boolean\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n            type: object\n          status:\n            description: Status reports activation state and availability of features\n              in the system.\n            properties:\n              featureReferenceResults:\n                description: FeatureReferenceResult represents the results of all\n                  the features specified in the FeatureGate spec.\n                items:\n                  description: FeatureReferenceResult represents the result of FeatureReference.\n                  properties:\n                    message:\n                      description: Message represents the reason for status\n                      type: string\n                    name:\n                      description: Name is the name of the feature.\n                      minLength: 1\n                      type: string\n                    status:\n                      description: 'Status represents the outcome of the feature reference\n                        operation specified in the FeatureGate spec - Applied: represents\n                        feature toggle has been successfully applied. - Invalid: represents\n                        that the intended state of the feature is invalid.'\n                      enum:\n                      - Applied\n                      - Invalid\n                      type: string\n                  required:\n                  - name\n                  - status\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n            required:\n            - featureReferenceResults\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n"
  },
  {
    "path": "packages/featuregates/bundle/config/upstream/crds/core/core.tanzu.vmware.com_features.yaml",
    "content": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.9.2\n  creationTimestamp: null\n  name: features.core.tanzu.vmware.com\nspec:\n  group: core.tanzu.vmware.com\n  names:\n    kind: Feature\n    listKind: FeatureList\n    plural: features\n    singular: feature\n  scope: Cluster\n  versions:\n  - additionalPrinterColumns:\n    - jsonPath: .spec.description\n      name: Description\n      type: string\n    - jsonPath: .spec.stability\n      name: Stability\n      type: string\n    - jsonPath: .status.activated\n      name: Activated?\n      type: string\n    name: v1alpha2\n    schema:\n      openAPIV3Schema:\n        description: Feature is the Schema for the features API\n        properties:\n          apiVersion:\n            description: 'APIVersion defines the versioned schema of this representation\n              of an object. Servers should convert recognized schemas to the latest\n              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'\n            type: string\n          kind:\n            description: 'Kind is a string value representing the REST resource this\n              object represents. Servers may infer this from the endpoint the client\n              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: FeatureSpec defines the desired state of Feature\n            properties:\n              description:\n                description: Description of the feature.\n                type: string\n              stability:\n                description: 'Stability indicates stability level of the feature.\n                  Stability levels are Work In Progress, Experimental, Technical Preview,\n                  Stable and Deprecated. - Work In Progress: Feature is still under\n                  development. It is not ready to be used, except by the team working\n                  on it. Activating this feature is not recommended under any circumstances.\n                  - Experimental: Feature is not ready, but may be used in pre-production\n                  environments. However, if an experimental feature has ever been\n                  used in an environment, that environment will not be supported.\n                  Activating an experimental feature requires you to permanently,\n                  irrevocably void all support guarantees for this environment by\n                  setting permanentlyVoidAllSupportGuarantees in feature reference\n                  in featuregate spec to true. You will need to recreate the environment\n                  to return to a supported state. - Technical Preview: Feature is\n                  not ready, but is not believed to be dangerous. The feature itself\n                  is unsupported, but activating a technical preview feature does\n                  not affect the support status of the environment. - Stable: Feature\n                  is ready and fully supported - Deprecated: Feature is destined for\n                  removal, usage is discouraged. Deactivate this feature prior to\n                  upgrading to a release which has removed it to validate that you\n                  are not still using it and to prevent users from introducing new\n                  usage of it.'\n                enum:\n                - Work In Progress\n                - Experimental\n                - Technical Preview\n                - Stable\n                - Deprecated\n                type: string\n            required:\n            - description\n            - stability\n            type: object\n          status:\n            description: FeatureStatus defines the observed state of Feature\n            properties:\n              activated:\n                description: Activated is a boolean which indicates whether a feature\n                  is activated or not.\n                type: boolean\n            required:\n            - activated\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources: {}\n"
  },
  {
    "path": "packages/featuregates/bundle/config/upstream/helpers.star",
    "content": "load(\"@ytt:data\", \"data\")\nload(\"@ytt:assert\", \"assert\")\n\ndef getWebhookServerPort():\n    webhookServerPort = str(data.values.deployment.webhookServerPort)\n    if hasattr(data.values, 'deployment') and webhookServerPort.isdigit():\n        return data.values.deployment.webhookServerPort\n    else:\n        assert.fail(\"Invalid webhook server port!!\")\n    end\nend\n"
  },
  {
    "path": "packages/featuregates/bundle/config/upstream/rbac.yaml",
    "content": "#@ load(\"@ytt:data\", \"data\")\n\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  labels:\n    app: tanzu-featuregates-manager\n  annotations:\n    kapp.k14s.io/change-group: \"featuregates.config.tanzu.vmware.com/serviceaccount\"\n  name: tanzu-featuregates-manager-sa\n  namespace: #@ data.values.namespace\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  annotations:\n    kapp.k14s.io/change-group: \"featuregates.config.tanzu.vmware.com/serviceaccount\"\n  name: tanzu-featuregates-manager-clusterrole\nrules:\n  - apiGroups:\n      - config.tanzu.vmware.com\n    resources:\n      - featuregates\n    verbs:\n      - create\n      - delete\n      - get\n      - list\n      - patch\n      - update\n      - watch\n  - apiGroups:\n      - config.tanzu.vmware.com\n    resources:\n      - featuregates/status\n    verbs:\n      - get\n      - patch\n      - update\n  - apiGroups:\n      - config.tanzu.vmware.com\n    resources:\n      - features\n    verbs:\n      - get\n      - list\n      - watch\n  - apiGroups:\n      - config.tanzu.vmware.com\n    resources:\n      - features/status\n    verbs:\n      - get\n      - patch\n      - update\n  - apiGroups:\n      - core.tanzu.vmware.com\n    resources:\n      - featuregates\n    verbs:\n      - get\n      - list\n      - patch\n      - update\n      - watch\n  - apiGroups:\n      - core.tanzu.vmware.com\n    resources:\n      - featuregates/status\n    verbs:\n      - get\n      - patch\n      - update\n  - apiGroups:\n      - core.tanzu.vmware.com\n    resources:\n      - features\n    verbs:\n      - create\n      - delete\n      - get\n      - list\n      - patch\n      - update\n      - watch\n  - apiGroups:\n      - core.tanzu.vmware.com\n    resources:\n      - features/status\n    verbs:\n      - get\n      - patch\n      - update\n  - apiGroups:\n      - \"\"\n    resources:\n      - namespaces\n    verbs:\n      - get\n      - list\n      - watch\n  - apiGroups:\n      - \"\"\n    resources:\n        - secrets\n    verbs:\n        - get\n        - list\n        - patch\n        - update\n        - watch\n  - apiGroups:\n      - \"admissionregistration.k8s.io\"\n    resources:\n      - mutatingwebhookconfigurations\n      - validatingwebhookconfigurations\n    verbs:\n      - get\n      - list\n      - patch\n      - update\n      - watch\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  annotations:\n    kapp.k14s.io/change-rule: \"upsert after upserting featuregates.config.tanzu.vmware.com/serviceaccount\"\n  name: tanzu-featuregates-manager-clusterrolebinding\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: tanzu-featuregates-manager-clusterrole\nsubjects:\n  - kind: ServiceAccount\n    name: tanzu-featuregates-manager-sa\n    namespace: #@ data.values.namespace\n"
  },
  {
    "path": "packages/featuregates/bundle/config/upstream/service.yaml",
    "content": "#@ load(\"@ytt:data\", \"data\")\n\napiVersion: v1\nkind: Service\nmetadata:\n  name: tanzu-featuregates-webhook-service\n  namespace: #@ data.values.namespace\nspec:\n  ports:\n    - port: 443\n      targetPort: webhook-server\n  selector:\n    app: tanzu-featuregates-manager\n"
  },
  {
    "path": "packages/featuregates/bundle/config/upstream/tanzu-featuregates-manager.yaml",
    "content": "#@ load(\"@ytt:data\", \"data\")\n#@ load(\"@ytt:overlay\", \"overlay\")\n#@ load(\"helpers.star\", \"getWebhookServerPort\")\n\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  labels:\n    app: tanzu-featuregates-manager\n  name: tanzu-featuregates-controller-manager\n  namespace: #@ data.values.namespace\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: tanzu-featuregates-manager\n  template:\n    metadata:\n      labels:\n        app: tanzu-featuregates-manager\n    spec:\n      containers:\n        - image: featuregates-controller-manager:latest\n          imagePullPolicy: IfNotPresent\n          name: manager\n          args:\n            - #@ \"--webhook-server-port={}\".format(getWebhookServerPort())\n            - #@ \"--tls-cipher-suites={}\".format(data.values.deployment.tlsCipherSuites)\n            - \"--webhook-config-label=tanzu.vmware.com/featuregates-webhook-managed-certs=true\"\n            - #@ \"--webhook-service-namespace={}\".format(data.values.namespace)\n            - \"--webhook-service-name=tanzu-featuregates-webhook-service\"\n            - #@ \"--webhook-secret-namespace={}\".format(data.values.namespace)\n            - \"--webhook-secret-name=tanzu-featuregates-webhook-server-cert\"\n          resources:\n            limits:\n              cpu: 100m\n              memory: 30Mi\n            requests:\n              cpu: 100m\n              memory: 20Mi\n          ports:\n            - containerPort: #@ getWebhookServerPort()\n              name: webhook-server\n              protocol: TCP\n          volumeMounts:\n            - mountPath: /tmp/k8s-webhook-server/serving-certs\n              name: cert\n              readOnly: true\n      volumes:\n        - name: cert\n          secret:\n            defaultMode: 420\n            secretName: tanzu-featuregates-webhook-server-cert\n      serviceAccount: tanzu-featuregates-manager-sa\n      terminationGracePeriodSeconds: 10\n      #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'hostNetwork') and data.values.deployment.hostNetwork:\n      #@overlay/match missing_ok=True\n      hostNetwork: true\n      #@ end\n      #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'tolerations') and data.values.deployment.tolerations:\n      #@overlay/match missing_ok=True\n      tolerations: #@ data.values.deployment.tolerations\n      #@ else:\n      tolerations:\n        - effect: NoSchedule\n          key: node-role.kubernetes.io/master\n        - effect: NoSchedule\n          key: node-role.kubernetes.io/control-plane\n      #@ end\n      #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'nodeSelector') and data.values.deployment.nodeSelector:\n      #@overlay/match missing_ok=True\n      nodeSelector: #@ data.values.deployment.nodeSelector\n      #@ end\n"
  },
  {
    "path": "packages/featuregates/bundle/config/upstream/webhook-secret.yaml",
    "content": "#@ load(\"@ytt:data\", \"data\")\n\napiVersion: v1\nkind: Secret\nmetadata:\n  annotations:\n    tanzu.vmware.com/featuregates-webhook-rotation-interval: 168h\n  name: tanzu-featuregates-webhook-server-cert\n  namespace: #@ data.values.namespace\ntype: Opaque\n"
  },
  {
    "path": "packages/featuregates/bundle/config/upstream/webhooks/config/webhook.yaml",
    "content": "#@ load(\"@ytt:data\", \"data\")\n\napiVersion: admissionregistration.k8s.io/v1\nkind: ValidatingWebhookConfiguration\nmetadata:\n  name: tanzu-featuregates-validating-webhook\n  labels:\n    tanzu.vmware.com/featuregates-webhook-managed-certs: \"true\"\nwebhooks:\n  - admissionReviewVersions:\n      - v1beta1\n    clientConfig:\n      service:\n        name: tanzu-featuregates-webhook-service\n        namespace: #@ data.values.namespace\n        path: /validate-config-tanzu-vmware-com-v1alpha1-featuregate\n    failurePolicy: Fail\n    name: featuregate.config.tanzu.vmware.com\n    rules:\n      - apiGroups:\n          - config.tanzu.vmware.com\n        apiVersions:\n          - v1alpha1\n        operations:\n          - CREATE\n          - UPDATE\n        resources:\n          - featuregates\n    sideEffects: None\n"
  },
  {
    "path": "packages/featuregates/bundle/config/upstream/webhooks/core/webhook.yaml",
    "content": "#@ load(\"@ytt:data\", \"data\")\n\napiVersion: admissionregistration.k8s.io/v1\nkind: ValidatingWebhookConfiguration\nmetadata:\n  name: tanzu-featuregates-validating-webhook-core\n  labels:\n    tanzu.vmware.com/featuregates-webhook-managed-certs: \"true\"\nwebhooks:\n  - admissionReviewVersions:\n      - v1beta1\n    clientConfig:\n      service:\n        name: tanzu-featuregates-webhook-service\n        namespace: #@ data.values.namespace\n        path: /validate-core-tanzu-vmware-com-v1alpha2-featuregate\n    failurePolicy: Fail\n    name: featuregate.core.tanzu.vmware.com\n    rules:\n      - apiGroups:\n          - core.tanzu.vmware.com\n        apiVersions:\n          - v1alpha2\n        operations:\n          - CREATE\n          - UPDATE\n        resources:\n          - featuregates\n    sideEffects: None\n"
  },
  {
    "path": "packages/featuregates/bundle/config/values.yaml",
    "content": "#@data/values\n---\nnamespace: tkg-system\ndeployment:\n  hostNetwork: false\n  nodeSelector: null\n  tolerations: []\n  webhookServerPort: 9443\n  tlsCipherSuites: \"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384\"\n"
  },
  {
    "path": "packages/featuregates/kbld-config.yaml",
    "content": "apiVersion: kbld.k14s.io/v1alpha1\nkind: Config\noverrides:\n- image: featuregates-controller-manager:latest\n  newImage: \"\"\n"
  },
  {
    "path": "packages/featuregates/metadata.yaml",
    "content": "apiVersion: data.packaging.carvel.dev/v1alpha1\nkind: PackageMetadata\nmetadata:\n  name: featuregates.tanzu.vmware.com\n  namespace: featuregates\nspec:\n  displayName: \"featuregates\"\n  longDescription: \"Featuregates package provides Features and Featuregates APIs to allow developers to have a system to control rollout and availability of new Features\"\n  shortDescription: \"Feature management\"\n  providerName: VMware\n  maintainers:\n    - name: \"Rajath Agasthya\"\n    - name: \"Jeff Moroski\"\n    - name: \"Harish Yayi\"\n  categories:\n    - \"feature management\"\n"
  },
  {
    "path": "packages/featuregates/package.yaml",
    "content": "apiVersion: data.packaging.carvel.dev/v1alpha1\nkind: Package\nmetadata:\n  name: featuregates.tanzu.vmware.com\n  namespace: featuregates\nspec:\n  refName: featuregates.tanzu.vmware.com\n  version: latest\n  licenses:\n    - \"Apache 2.0\"\n  template:\n    spec:\n      fetch:\n        - imgpkgBundle:\n            image: # Get this value by pushing to your OCI Registry\n      template:\n        - ytt:\n            paths:\n              - config/\n        - kbld:\n            paths:\n              - \"-\"\n              - .imgpkg/images.yml\n      deploy:\n        - kapp: {}\n"
  },
  {
    "path": "packages/featuregates/vendir.lock.yml",
    "content": "apiVersion: vendir.k14s.io/v1alpha1\ndirectories:\n- contents:\n  - manual: {}\n    path: crds/config\n  - directory: {}\n    path: crds/core\n  - manual: {}\n    path: webhook-secret.yaml\n  - manual: {}\n    path: rbac.yaml\n  - manual: {}\n    path: service.yaml\n  - manual: {}\n    path: tanzu-featuregates-manager.yaml\n  - manual: {}\n    path: webhooks/config/webhook.yaml\n  - manual: {}\n    path: webhooks/core/webhook.yaml\n  - manual: {}\n    path: helpers.star\n  path: bundle/config/upstream\nkind: LockConfig\n"
  },
  {
    "path": "packages/featuregates/vendir.yml",
    "content": "apiVersion: vendir.k14s.io/v1alpha1\nkind: Config\nminimumRequiredVersion: 0.12.0\ndirectories:\n  - path: bundle/config/upstream\n    contents:\n      - path: crds/config\n        manual: {}\n      - path: crds/core\n        directory:\n          path: ../../apis/core/config/crd/bases/\n        includePaths:\n          - core.tanzu.vmware.com_features.yaml\n          - core.tanzu.vmware.com_featuregates.yaml\n      - path: webhook-secret.yaml\n        manual: {}\n      - path: rbac.yaml\n        manual: {}\n      - path: service.yaml\n        manual: {}\n      - path: tanzu-featuregates-manager.yaml\n        manual: {}\n      - path: webhooks/config/webhook.yaml\n        manual: {}\n      - path: webhooks/core/webhook.yaml\n        manual: {}\n      - path: helpers.star\n        manual: {}\n\n"
  },
  {
    "path": "packages/package-values.yaml",
    "content": "#@data/values\n---\nrepositories:\n  runtime-core:\n    version: null\n    sha256: latest\n    name: runtime-core\n    domain: tanzu.vmware.com\n    registry: registry\n\n    packageSpec:\n      syncPeriod: 5m\n      deploy:\n        kappWaitTimeout: 5m\n        kubeAPIQPS: 20\n        kubeAPIBurst: 30\n\n    packages:\n      - name: featuregates\n        displayName: featuregates\n        #! Relative path to package bundle\n        path: packages/featuregates\n        domain: tanzu.vmware.com\n        version: latest\n        #! Gets replaced with imgpkg sha256 at build, this should be name:version\n        sha256: \"featuregates:latest\"\n      - name: capabilities\n        path: packages/capabilities\n        domain: tanzu.vmware.com\n        version: latest\n        sha256: \"capabilities:latest\"\n      - name: readiness\n        path: packages/readiness\n        domain: tanzu.vmware.com\n        version: latest\n        sha256: \"readiness:latest\"\n"
  },
  {
    "path": "packages/readiness/Makefile",
    "content": "# Copyright 2023 VMware, Inc. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\nconfigure-package: ## Configure package before creating the package\n\nreset-package: ## Reset configured package\n"
  },
  {
    "path": "packages/readiness/README.md",
    "content": "# readiness Package\n\nThis package provides the functionality to define and evaluate k8s clusters for suitability of running enterprise workloads using [readiness](https://INFO_NEEDED).\n\n## Components\n\n## Configuration\n\nThe following configuration values can be set to customize the readiness installation.\n\n### Global\n\n| Value | Required/Optional | Description |\n|-------|-------------------|-------------|\n| `namespace` | Optional | Target deployment namespace. Defaults to `default` namespace |\n\n### readiness Configuration\n\n| Value | Required/Optional | Description |\n|-------|-------------------|-------------|\n| `deployment.hostNetwork` | Optional | If true, use the host's network namespace. Defaults to `false` |\n| `deployment.nodeSelector` | Optional | node selectors for deployment of controller-manager pods |\n| `deployment.tolerations` | Optional | tolerations for deployment of controller-manager pods. Defaults to `NoSchedule` on `control-plane` nodes |\n| `deployment.webhookServerPort` | Optional | The port that the webhook server serves at |\n| `deployment.tlsCipherSuites` | Optional | Comma-separated list of cipher suites for the server. If omitted, the default Go cipher suites will be used. |\n\n## Usage Example\n\nReadiness and ReadinessProvider API concepts and usage guide can be found [here](../../docs/runtime-core/readiness-framework.md).\n"
  },
  {
    "path": "packages/readiness/bundle/config/upstream/crds/core.tanzu.vmware.com_readinesses.yaml",
    "content": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.9.2\n  creationTimestamp: null\n  name: readinesses.core.tanzu.vmware.com\nspec:\n  group: core.tanzu.vmware.com\n  names:\n    kind: Readiness\n    listKind: ReadinessList\n    plural: readinesses\n    singular: readiness\n  scope: Cluster\n  versions:\n  - additionalPrinterColumns:\n    - jsonPath: .status.ready\n      name: Ready\n      type: boolean\n    - jsonPath: .metadata.creationTimestamp\n      name: Age\n      type: date\n    name: v1alpha2\n    schema:\n      openAPIV3Schema:\n        description: Readiness is the Schema for the readinesses API\n        properties:\n          apiVersion:\n            description: 'APIVersion defines the versioned schema of this representation\n              of an object. Servers should convert recognized schemas to the latest\n              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'\n            type: string\n          kind:\n            description: 'Kind is a string value representing the REST resource this\n              object represents. Servers may infer this from the endpoint the client\n              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ReadinessSpec defines the desired state of Readiness\n            properties:\n              checks:\n                description: Checks is the set of checks that are required to mark\n                  the readiness\n                items:\n                  properties:\n                    category:\n                      description: Category is the category of the check. Examples\n                        of categories are availability and security.\n                      type: string\n                    name:\n                      description: Name is the name of the check\n                      type: string\n                    type:\n                      description: Type is the type of the check. Type can be either\n                        basic or composite. The basic checks depend on its providers\n                        to be ready. The composite checks depend on the basic checks\n                        for their readiness.\n                      enum:\n                      - basic\n                      - composite\n                      type: string\n                  required:\n                  - category\n                  - name\n                  - type\n                  type: object\n                type: array\n            required:\n            - checks\n            type: object\n          status:\n            description: ReadinessStatus defines the observed state of Readiness\n            properties:\n              checkStatus:\n                description: CheckStatus presents the status of check defined in the\n                  spec\n                items:\n                  properties:\n                    name:\n                      description: Name is the name of the check\n                      type: string\n                    providers:\n                      description: Providers is the list of providers available for\n                        the given check\n                      items:\n                        properties:\n                          isActive:\n                            description: IsActive is the boolean flag indicating if\n                              the provider is active\n                            type: boolean\n                          name:\n                            description: Name is the name of the provider\n                            type: string\n                        required:\n                        - isActive\n                        - name\n                        type: object\n                      type: array\n                    status:\n                      description: Ready is the boolean flag indicating if the check\n                        is ready\n                      type: boolean\n                  required:\n                  - name\n                  - providers\n                  - status\n                  type: object\n                type: array\n              ready:\n                description: Ready is the flag that denotes if the defined readiness\n                  is ready. The readiness is marked ready if all the checks are satisfied.\n                type: boolean\n            required:\n            - checkStatus\n            - ready\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n"
  },
  {
    "path": "packages/readiness/bundle/config/upstream/crds/core.tanzu.vmware.com_readinessproviders.yaml",
    "content": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.9.2\n  creationTimestamp: null\n  name: readinessproviders.core.tanzu.vmware.com\nspec:\n  group: core.tanzu.vmware.com\n  names:\n    kind: ReadinessProvider\n    listKind: ReadinessProviderList\n    plural: readinessproviders\n    singular: readinessprovider\n  scope: Cluster\n  versions:\n  - additionalPrinterColumns:\n    - jsonPath: .status.state\n      name: State\n      type: string\n    - jsonPath: .spec.checkRefs\n      name: Checks\n      priority: 1\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: Age\n      type: date\n    name: v1alpha2\n    schema:\n      openAPIV3Schema:\n        description: ReadinessProvider is the Schema for the readinessproviders API\n        properties:\n          apiVersion:\n            description: 'APIVersion defines the versioned schema of this representation\n              of an object. Servers should convert recognized schemas to the latest\n              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'\n            type: string\n          kind:\n            description: 'Kind is a string value representing the REST resource this\n              object represents. Servers may infer this from the endpoint the client\n              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ReadinessProviderSpec defines the desired state of ReadinessProvider\n            properties:\n              checkRefs:\n                description: CheckRefs contains names of the checks that the current\n                  provider satisfies\n                items:\n                  type: string\n                type: array\n              conditions:\n                description: Conditions is the set of checks that must be evaluated\n                  to true to mark the provider as ready\n                items:\n                  description: ReadinessProviderCondition defines the readiness provider\n                    condition\n                  properties:\n                    name:\n                      description: Name is the name of the condition\n                      type: string\n                    resourceExistenceCondition:\n                      description: ResourceExistenceCondition is the condition that\n                        checks for the presence of a certain resource in the cluster\n                      properties:\n                        apiVersion:\n                          description: 'APIVersion is the API version of the resource\n                            that is being checked. This should be provided in <group>/<version>\n                            format. More info: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#resources'\n                          type: string\n                        kind:\n                          description: 'Kind is the API kind of the resource that\n                            is being checked More info: More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n                          type: string\n                        name:\n                          type: string\n                        namespace:\n                          description: Namespace is the namespace of the resource\n                            that is being checked; if the Namespace is nil, the resource\n                            is assumed to be cluster scoped. Empty string for the\n                            namespace will throw error.\n                          type: string\n                      required:\n                      - apiVersion\n                      - kind\n                      - name\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n              serviceAccountRef:\n                description: ServiceAccountRef represents the service account to be\n                  used to make requests to the API server for evaluating conditions.\n                  If not provided, it uses the default service account of the readiness\n                  provider controller, which may not have appropriate RBAC for evaluating\n                  conditions.\n                properties:\n                  name:\n                    description: Name is the name of the service account to be used\n                      to make requests to the API server for evaluating conditions.\n                    type: string\n                  namespace:\n                    description: Namespace is the namespace containing the service\n                      account.\n                    type: string\n                required:\n                - name\n                - namespace\n                type: object\n            required:\n            - checkRefs\n            - conditions\n            type: object\n          status:\n            description: ReadinessProviderStatus defines the observed state of ReadinessProvider\n            properties:\n              conditions:\n                description: Conditions is the set of ReadinessConditions that are\n                  being evaluated\n                items:\n                  properties:\n                    message:\n                      description: Message is the field that provides information\n                        about the condition evaluation\n                      type: string\n                    name:\n                      description: Name is the name of the readiness condition\n                      type: string\n                    state:\n                      description: State is the computed state of the condition\n                      enum:\n                      - success\n                      - failure\n                      - inprogress\n                      type: string\n                  required:\n                  - message\n                  - name\n                  - state\n                  type: object\n                type: array\n              message:\n                description: Message provides information about the ReadinessProvider\n                  state\n                type: string\n              state:\n                description: State is the computed state of the provider. The state\n                  will be success if all the conditions pass; The state will be failure\n                  if any of the conditions fail. Otherwise, the state will be in-progress.\n                enum:\n                - success\n                - failure\n                - inprogress\n                type: string\n            required:\n            - conditions\n            - message\n            - state\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n"
  },
  {
    "path": "packages/readiness/bundle/config/upstream/helpers.star",
    "content": "load(\"@ytt:data\", \"data\")\nload(\"@ytt:assert\", \"assert\")\n\ndef getWebhookServerPort():\n    webhookServerPort = str(data.values.deployment.webhookServerPort)\n    if hasattr(data.values, 'deployment') and webhookServerPort.isdigit():\n        return data.values.deployment.webhookServerPort\n    else:\n        assert.fail(\"Invalid webhook server port!!\")\n    end\nend\n"
  },
  {
    "path": "packages/readiness/bundle/config/upstream/rbac.yaml",
    "content": "#@ load(\"@ytt:data\", \"data\")\n---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  labels:\n    app: tanzu-readiness-manager\n  annotations:\n    kapp.k14s.io/change-group: \"readiness.core.tanzu.vmware.com/serviceaccount\"\n  name: tanzu-readiness-manager-sa\n  namespace: #@ data.values.namespace\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  annotations:\n    kapp.k14s.io/change-group: \"readiness.core.tanzu.vmware.com/serviceaccount\"\n  name: tanzu-readiness-manager-clusterrole\nrules:\n  - apiGroups:\n    - core.tanzu.vmware.com\n    resources:\n      - readinesses\n      - readinessproviders\n    verbs:\n      - create\n      - delete\n      - get\n      - list\n      - patch\n      - update\n      - watch\n  - apiGroups:\n      - core.tanzu.vmware.com\n    resources:\n      - readinesses/finalizers\n      - readinessproviders/finalizers\n    verbs:\n      - update\n  - apiGroups:\n      - core.tanzu.vmware.com\n    resources:\n      - readinesses/status\n      - readinessproviders/status\n    verbs:\n      - get\n      - patch\n      - update\n  - apiGroups:\n      - \"\"\n    resources:\n      - secrets\n    verbs:\n      - get\n      - list\n      - patch\n      - update\n  - apiGroups:\n      - admissionregistration.k8s.io\n    resources:\n      - validatingwebhookconfigurations\n      - mutatingwebhookconfigurations\n    verbs:\n      - get\n      - list\n      - update\n  - apiGroups:\n      - \"\"\n    resources:\n      - serviceaccounts/token\n    verbs:\n      - create\n  - apiGroups:\n      - \"\"\n    resources:\n      - serviceaccounts\n    verbs:\n      - get\n      - list\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  annotations:\n    kapp.k14s.io/change-rule: \"upsert after upserting readiness.core.tanzu.vmware.com/serviceaccount\"\n    kapp.k14s.io/change-rule.1: \"delete before deleting readiness.core.tanzu.vmware.com/serviceaccount\"\n  name: tanzu-readiness-manager-clusterrolebinding\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: tanzu-readiness-manager-clusterrole\nsubjects:\n  - kind: ServiceAccount\n    name: tanzu-readiness-manager-sa\n    namespace: #@ data.values.namespace\n"
  },
  {
    "path": "packages/readiness/bundle/config/upstream/service.yaml",
    "content": "#@ load(\"@ytt:data\", \"data\")\n\napiVersion: v1\nkind: Service\nmetadata:\n  name: tanzu-readinessprovider-webhook-service\n  namespace: #@ data.values.namespace\nspec:\n  ports:\n    - port: 443\n      targetPort: webhook-server\n  selector:\n    app: tanzu-readiness-manager\n"
  },
  {
    "path": "packages/readiness/bundle/config/upstream/tanzu-readiness-manager.yaml",
    "content": "#@ load(\"@ytt:data\", \"data\")\n#@ load(\"helpers.star\", \"getWebhookServerPort\")\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: tanzu-readiness-controller-manager\n  labels:\n    app: tanzu-readiness-manager\n  annotations:\n    kapp.k14s.io/update-strategy: \"fallback-on-replace\"\n  namespace: #@ data.values.namespace\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: tanzu-readiness-manager\n  template:\n    metadata:\n      labels:\n        app: tanzu-readiness-manager\n    spec:\n      containers:\n        - name: manager\n          image: readiness-controller-manager:latest\n          imagePullPolicy: IfNotPresent\n          args:\n            - #@ \"--webhook-server-port={}\".format(getWebhookServerPort())\n            - #@ \"--tls-cipher-suites={}\".format(data.values.deployment.tlsCipherSuites)\n            - \"--webhook-config-label=tanzu.vmware.com/readinessprovider-webhook-managed-certs=true\"\n            - #@ \"--webhook-service-namespace={}\".format(data.values.namespace)\n            - \"--webhook-service-name=tanzu-readinessprovider-webhook-service\"\n            - #@ \"--webhook-secret-namespace={}\".format(data.values.namespace)\n            - \"--webhook-secret-name=tanzu-readinessprovider-webhook-server-cert\"\n          ports:\n            - containerPort: #@ getWebhookServerPort()\n              name: webhook-server\n              protocol: TCP\n          volumeMounts:\n            - mountPath: /tmp/k8s-webhook-server/serving-certs\n              name: cert\n              readOnly: true\n      serviceAccount: tanzu-readiness-manager-sa\n      volumes:\n        - name: cert\n          secret:\n            defaultMode: 420\n            secretName: tanzu-readinessprovider-webhook-server-cert\n      terminationGracePeriodSeconds: 10\n      #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'hostNetwork') and data.values.deployment.hostNetwork:\n      #@overlay/match missing_ok=True\n      hostNetwork: true\n      #@ end\n      #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'tolerations') and data.values.deployment.tolerations:\n      #@overlay/match missing_ok=True\n      tolerations: #@ data.values.deployment.tolerations\n      #@ else:\n      tolerations:\n        - effect: NoSchedule\n          key: node-role.kubernetes.io/master\n        - effect: NoSchedule\n          key: node-role.kubernetes.io/control-plane\n      #@ end\n      #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'nodeSelector') and data.values.deployment.nodeSelector:\n      #@overlay/match missing_ok=True\n      nodeSelector: #@ data.values.deployment.nodeSelector\n      #@ end\n"
  },
  {
    "path": "packages/readiness/bundle/config/upstream/webhook-secret.yaml",
    "content": "#@ load(\"@ytt:data\", \"data\")\n\napiVersion: v1\nkind: Secret\nmetadata:\n  annotations:\n    tanzu.vmware.com/readinessprovider-webhook-rotation-interval: 168h\n  name: tanzu-readinessprovider-webhook-server-cert\n  namespace: #@ data.values.namespace\ntype: Opaque\n"
  },
  {
    "path": "packages/readiness/bundle/config/upstream/webhooks/core/webhook.yaml",
    "content": "#@ load(\"@ytt:data\", \"data\")\n\napiVersion: admissionregistration.k8s.io/v1\nkind: ValidatingWebhookConfiguration\nmetadata:\n  name: tanzu-readinessprovider-validating-webhook-core\n  labels:\n    tanzu.vmware.com/readinessprovider-webhook-managed-certs: \"true\"\nwebhooks:\n  - admissionReviewVersions:\n      - v1beta1\n    clientConfig:\n      service:\n        name: tanzu-readinessprovider-webhook-service\n        namespace: #@ data.values.namespace\n        path: /validate-core-tanzu-vmware-com-v1alpha2-readinessprovider\n    failurePolicy: Fail\n    name: readinessprovider.core.tanzu.vmware.com\n    rules:\n      - apiGroups:\n          - core.tanzu.vmware.com\n        apiVersions:\n          - v1alpha2\n        operations:\n          - CREATE\n          - UPDATE\n        resources:\n          - readinessproviders\n    sideEffects: None\n"
  },
  {
    "path": "packages/readiness/bundle/config/values.yaml",
    "content": "#@data/values\n---\nnamespace: default\ndeployment:\n  hostNetwork: false\n  nodeSelector: null\n  tolerations: []\n  webhookServerPort: 9443\n  tlsCipherSuites: \"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384\"\n"
  },
  {
    "path": "packages/readiness/kbld-config.yaml",
    "content": "apiVersion: kbld.k14s.io/v1alpha1\nkind: Config\noverrides:\n- image: readiness-controller-manager:latest\n  newImage: \"\"\n"
  },
  {
    "path": "packages/readiness/metadata.yaml",
    "content": "apiVersion: data.packaging.carvel.dev/v1alpha1\nkind: PackageMetadata\nmetadata:\n  name: readiness.tanzu.vmware.com\n  namespace: readiness\nspec:\n  displayName: \"readiness\"\n  longDescription: \"Readiness package provides Readiness APIs to allow users to define k8s cluster evaluation checks for suitability to run enterprise workloads\"\n  shortDescription: \"Readiness\"\n  providerName: VMware\n  maintainers:\n    - name: \"Sathyanarayanan Saravanamuthu\"\n    - name: \"Avi Sharma\"\n  categories:\n    - \"enterprise readiness\"\n"
  },
  {
    "path": "packages/readiness/package.yaml",
    "content": "apiVersion: data.packaging.carvel.dev/v1alpha1\nkind: Package\nmetadata:\n  name: readiness.tanzu.vmware.com\n  namespace: readiness\nspec:\n  refName: readiness.tanzu.vmware.com\n  version: latest\n  licenses:\n    - \"Apache 2.0\"\n  template:\n    spec:\n      fetch:\n        - imgpkgBundle:\n            image: # Get this value by pushing to your OCI Registry\n      template:\n        - ytt:\n            paths:\n              - config/\n        - kbld:\n            paths:\n              - \"-\"\n              - .imgpkg/images.yml\n      deploy:\n        - kapp: {}\n"
  },
  {
    "path": "packages/readiness/vendir.lock.yml",
    "content": "apiVersion: vendir.k14s.io/v1alpha1\ndirectories:\n- contents:\n  - directory: {}\n    path: crds\n  - manual: {}\n    path: rbac.yaml\n  - manual: {}\n    path: tanzu-readiness-manager.yaml\n  - manual: {}\n    path: helpers.star\n  - manual: {}\n    path: service.yaml\n  - manual: {}\n    path: webhook-secret.yaml\n  - manual: {}\n    path: webhooks/core/webhook.yaml\n  path: bundle/config/upstream\nkind: LockConfig\n"
  },
  {
    "path": "packages/readiness/vendir.yml",
    "content": "apiVersion: vendir.k14s.io/v1alpha1\nkind: Config\nminimumRequiredVersion: 0.12.0\ndirectories:\n  - path: bundle/config/upstream\n    contents:\n      - path: crds\n        directory:\n          path: ../../apis/core/config/crd/bases/\n        includePaths:\n          - core.tanzu.vmware.com_readinesses.yaml\n          - core.tanzu.vmware.com_readinessproviders.yaml\n      - path: rbac.yaml\n        manual: {}\n      - path: tanzu-readiness-manager.yaml\n        manual: {}\n      - path: helpers.star\n        manual: {}\n      - path: service.yaml\n        manual: {}\n      - path: webhook-secret.yaml\n        manual: {}\n      - path: webhooks/core/webhook.yaml\n        manual: {}\n"
  },
  {
    "path": "readiness/controller/go.mod",
    "content": "module github.com/vmware-tanzu/tanzu-framework/readiness/controller\n\ngo 1.19\n\nreplace (\n\tgithub.com/vmware-tanzu/tanzu-framework/apis/core => ../../apis/core\n\tgithub.com/vmware-tanzu/tanzu-framework/capabilities/client => ../../capabilities/client\n\tgithub.com/vmware-tanzu/tanzu-framework/util => ../../util\n)\n\nrequire (\n\tgithub.com/go-logr/logr v1.2.3\n\tgithub.com/onsi/ginkgo/v2 v2.9.2\n\tgithub.com/onsi/gomega v1.27.6\n\tgithub.com/vmware-tanzu/tanzu-framework/apis/core v0.0.0-00010101000000-000000000000\n\tgithub.com/vmware-tanzu/tanzu-framework/capabilities/client v0.0.0-00010101000000-000000000000\n\tgithub.com/vmware-tanzu/tanzu-framework/util v0.0.0-00010101000000-000000000000\n\tk8s.io/api v0.26.1\n\tk8s.io/apimachinery v0.26.1\n\tk8s.io/client-go v0.26.1\n\tk8s.io/component-base v0.26.1\n\tsigs.k8s.io/controller-runtime v0.14.5\n)\n\nrequire (\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/blang/semver v3.5.1+incompatible // indirect\n\tgithub.com/blendle/zapdriver v1.3.1 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.1.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.1 // indirect\n\tgithub.com/emicklei/go-restful/v3 v3.9.0 // indirect\n\tgithub.com/evanphx/json-patch v5.6.0+incompatible // indirect\n\tgithub.com/evanphx/json-patch/v5 v5.6.0 // indirect\n\tgithub.com/fsnotify/fsnotify v1.6.0 // indirect\n\tgithub.com/go-logr/zapr v1.2.3 // indirect\n\tgithub.com/go-openapi/jsonpointer v0.19.5 // indirect\n\tgithub.com/go-openapi/jsonreference v0.20.0 // indirect\n\tgithub.com/go-openapi/swag v0.22.3 // indirect\n\tgithub.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect\n\tgithub.com/gogo/protobuf v1.3.2 // indirect\n\tgithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/gnostic v0.6.9 // indirect\n\tgithub.com/google/go-cmp v0.5.9 // indirect\n\tgithub.com/google/gofuzz v1.2.0 // indirect\n\tgithub.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect\n\tgithub.com/google/uuid v1.3.0 // indirect\n\tgithub.com/imdario/mergo v0.3.13 // indirect\n\tgithub.com/inconshreveable/mousetrap v1.0.1 // indirect\n\tgithub.com/josharian/intern v1.0.0 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/mailru/easyjson v0.7.7 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions v1.0.2 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect\n\tgithub.com/pkg/errors v0.9.1 // indirect\n\tgithub.com/prometheus/client_golang v1.14.0 // indirect\n\tgithub.com/prometheus/client_model v0.3.0 // indirect\n\tgithub.com/prometheus/common v0.37.0 // indirect\n\tgithub.com/prometheus/procfs v0.8.0 // indirect\n\tgithub.com/spf13/cobra v1.6.1 // indirect\n\tgithub.com/spf13/pflag v1.0.5 // indirect\n\tgithub.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-20230419030809-7081502ebf68 // indirect\n\tgo.uber.org/atomic v1.9.0 // indirect\n\tgo.uber.org/multierr v1.8.0 // indirect\n\tgo.uber.org/zap v1.24.0 // indirect\n\tgolang.org/x/net v0.8.0 // indirect\n\tgolang.org/x/oauth2 v0.6.0 // indirect\n\tgolang.org/x/sys v0.6.0 // indirect\n\tgolang.org/x/term v0.6.0 // indirect\n\tgolang.org/x/text v0.8.0 // indirect\n\tgolang.org/x/time v0.3.0 // indirect\n\tgolang.org/x/tools v0.7.0 // indirect\n\tgomodules.xyz/jsonpatch/v2 v2.2.0 // indirect\n\tgoogle.golang.org/appengine v1.6.7 // indirect\n\tgoogle.golang.org/protobuf v1.28.1 // indirect\n\tgopkg.in/inf.v0 v0.9.1 // indirect\n\tgopkg.in/yaml.v2 v2.4.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tk8s.io/apiextensions-apiserver v0.26.1 // indirect\n\tk8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54 // indirect\n\tk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect\n\tk8s.io/kubectl v0.25.0 // indirect\n\tk8s.io/utils v0.0.0-20221128185143-99ec85e7a448 // indirect\n\tknative.dev/pkg v0.0.0-20230404101938-ee73c9355c9d // indirect\n\tsigs.k8s.io/cluster-api v1.4.2 // indirect\n\tsigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect\n\tsigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect\n\tsigs.k8s.io/yaml v1.3.0 // indirect\n)\n"
  },
  {
    "path": "readiness/controller/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=\ngithub.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=\ngithub.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=\ngithub.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=\ngithub.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE=\ngithub.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc=\ngithub.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=\ngithub.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE=\ngithub.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ=\ngithub.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U=\ngithub.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=\ngithub.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww=\ngithub.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4=\ngithub.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0=\ngithub.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=\ngithub.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=\ngithub.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=\ngithub.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=\ngithub.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A=\ngithub.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4=\ngithub.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=\ngithub.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA=\ngithub.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo=\ngithub.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=\ngithub.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=\ngithub.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=\ngithub.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0=\ngithub.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=\ngithub.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE=\ngithub.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=\ngithub.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk=\ngithub.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg=\ngithub.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=\ngithub.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=\ngithub.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=\ngithub.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=\ngithub.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=\ngithub.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2 h1:hAHbPm5IJGijwng3PWk09JkG9WeqChjprR5s9bBZ+OM=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=\ngithub.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=\ngithub.com/onsi/ginkgo/v2 v2.9.2 h1:BA2GMJOtfGAfagzYtrAlufIP0lq6QERkFmHLMLPwFSU=\ngithub.com/onsi/ginkgo/v2 v2.9.2/go.mod h1:WHcJJG2dIlcCqVfBAwUCrJxSPFb6v4azBwgxeMeDuts=\ngithub.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE=\ngithub.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw=\ngithub.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=\ngithub.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE=\ngithub.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo=\ngithub.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=\ngithub.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=\ngithub.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=\ngithub.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=\ngithub.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=\ngithub.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=\ngithub.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-20230419030809-7081502ebf68 h1:DMsg44rX3xSBDCoKYU7zfJGzs9dfPkMYmM7C5fFx7Es=\ngithub.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-20230419030809-7081502ebf68/go.mod h1:e1Uef+Ux5BIHpYwqbeP2ZZmOzehBcez2vUEWXHe+xHE=\ngithub.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=\ngithub.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=\ngithub.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=\ngo.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=\ngo.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=\ngo.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=\ngo.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=\ngo.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=\ngo.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=\ngo.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=\ngo.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=\ngo.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=\ngo.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=\ngo.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=\ngo.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=\ngo.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=\ngo.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=\ngolang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw=\ngolang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw=\ngolang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=\ngolang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=\ngolang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4=\ngolang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY=\ngomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=\ngoogle.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=\ngoogle.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=\ngopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nk8s.io/api v0.26.1 h1:f+SWYiPd/GsiWwVRz+NbFyCgvv75Pk9NK6dlkZgpCRQ=\nk8s.io/api v0.26.1/go.mod h1:xd/GBNgR0f707+ATNyPmQ1oyKSgndzXij81FzWGsejg=\nk8s.io/apiextensions-apiserver v0.26.1 h1:cB8h1SRk6e/+i3NOrQgSFij1B2S0Y0wDoNl66bn8RMI=\nk8s.io/apiextensions-apiserver v0.26.1/go.mod h1:AptjOSXDGuE0JICx/Em15PaoO7buLwTs0dGleIHixSM=\nk8s.io/apimachinery v0.26.1 h1:8EZ/eGJL+hY/MYCNwhmDzVqq2lPl3N3Bo8rvweJwXUQ=\nk8s.io/apimachinery v0.26.1/go.mod h1:tnPmbONNJ7ByJNz9+n9kMjNP8ON+1qoAIIC70lztu74=\nk8s.io/client-go v0.26.1 h1:87CXzYJnAMGaa/IDDfRdhTzxk/wzGZ+/HUQpqgVSZXU=\nk8s.io/client-go v0.26.1/go.mod h1:IWNSglg+rQ3OcvDkhY6+QLeasV4OYHDjdqeWkDQZwGE=\nk8s.io/component-base v0.26.1 h1:4ahudpeQXHZL5kko+iDHqLj/FSGAEUnSVO0EBbgDd+4=\nk8s.io/component-base v0.26.1/go.mod h1:VHrLR0b58oC035w6YQiBSbtsf0ThuSwXP+p5dD/kAWU=\nk8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54 h1:hWRbsoRWt44OEBnYUd4ceLy4ofBoh+p9vauWp/I5Gdg=\nk8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=\nk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s=\nk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4=\nk8s.io/kubectl v0.25.0 h1:/Wn1cFqo8ik3iee1EvpxYre3bkWsGLXzLQI6uCCAkQc=\nk8s.io/kubectl v0.25.0/go.mod h1:n16ULWsOl2jmQpzt2o7Dud1t4o0+Y186ICb4O+GwKAU=\nk8s.io/utils v0.0.0-20221128185143-99ec85e7a448 h1:KTgPnR10d5zhztWptI952TNtt/4u5h3IzDXkdIMuo2Y=\nk8s.io/utils v0.0.0-20221128185143-99ec85e7a448/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=\nknative.dev/pkg v0.0.0-20230404101938-ee73c9355c9d h1:mubqXUjYfnwNg3IGWYEj2YffXYIxg44Qn9GS5vPAjck=\nknative.dev/pkg v0.0.0-20230404101938-ee73c9355c9d/go.mod h1:EQk8+qkZ8fMtrDYOOb9e9xMQG29N+L54iXBCfNXRm90=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/cluster-api v1.4.2 h1:hdIz0Ms2j7YaU1qBK5yF2R8ii0GcGb3jQ7EO6i3tAN8=\nsigs.k8s.io/cluster-api v1.4.2/go.mod h1:IIebZTsqyXU8CHbINV2zuMh0/wykqdr+vEXxQNeteEU=\nsigs.k8s.io/controller-runtime v0.14.5 h1:6xaWFqzT5KuAQ9ufgUaj1G/+C4Y1GRkhrxl+BJ9i+5s=\nsigs.k8s.io/controller-runtime v0.14.5/go.mod h1:WqIdsAY6JBsjfc/CqO0CORmNtoCtE4S6qbPc9s68h+0=\nsigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k=\nsigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=\nsigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=\nsigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=\n"
  },
  {
    "path": "readiness/controller/main.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage main\n\nimport (\n\t\"crypto/tls\"\n\t\"flag\"\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\tutilruntime \"k8s.io/apimachinery/pkg/util/runtime\"\n\t\"k8s.io/client-go/kubernetes\"\n\tclientgoscheme \"k8s.io/client-go/kubernetes/scheme\"\n\tcliflag \"k8s.io/component-base/cli/flag\"\n\tctrl \"sigs.k8s.io/controller-runtime\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\t\"sigs.k8s.io/controller-runtime/pkg/healthz\"\n\t\"sigs.k8s.io/controller-runtime/pkg/log/zap\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n\tcapabilitiesdiscovery \"github.com/vmware-tanzu/tanzu-framework/capabilities/client/pkg/discovery\"\n\t\"github.com/vmware-tanzu/tanzu-framework/readiness/controller/pkg/conditions\"\n\treadinesscontroller \"github.com/vmware-tanzu/tanzu-framework/readiness/controller/pkg/readiness\"\n\treadinessprovidercontroller \"github.com/vmware-tanzu/tanzu-framework/readiness/controller/pkg/readinessprovider\"\n\t\"github.com/vmware-tanzu/tanzu-framework/util/webhook/certs\"\n\t//+kubebuilder:scaffold:imports\n)\n\nvar (\n\tscheme                              = runtime.NewScheme()\n\tsetupLog                            = ctrl.Log.WithName(\"setup\")\n\tdefaultWebhookConfigLabel           = \"tanzu.vmware.com/readinessprovider-webhook-managed-certs=true\"\n\tdefaultWebhookServiceNamespace      = \"default\"\n\tdefaultWebhookServiceName           = \"tanzu-readinessprovider-webhook-service\"\n\tdefaultWebhookSecretNamespace       = \"default\"\n\tdefaultWebhookSecretName            = \"tanzu-readinessprovider-webhook-server-cert\" //nolint:gosec\n\tdefaultWebhookSecretVolumeMountPath = \"/tmp/k8s-webhook-server/serving-certs\"       //nolint:gosec\n)\n\nfunc init() {\n\tutilruntime.Must(clientgoscheme.AddToScheme(scheme))\n\n\tutilruntime.Must(corev1alpha2.AddToScheme(scheme))\n\t//+kubebuilder:scaffold:scheme\n}\n\nfunc setCipherSuiteFunc(cipherSuiteString string) (func(cfg *tls.Config), error) {\n\tcipherSuites := strings.Split(cipherSuiteString, \",\")\n\tsuites, err := cliflag.TLSCipherSuites(cipherSuites)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn func(cfg *tls.Config) {\n\t\tcfg.CipherSuites = suites\n\t}, nil\n}\n\n//nolint:funlen\nfunc main() {\n\tvar (\n\t\twebhookServerPort            int\n\t\ttlsMinVersion                string\n\t\ttlsCipherSuites              string\n\t\twebhookConfigLabel           string\n\t\twebhookServiceNamespace      string\n\t\twebhookServiceName           string\n\t\twebhookSecretNamespace       string\n\t\twebhookSecretName            string\n\t\twebhookSecretVolumeMountPath string\n\t)\n\n\tflag.IntVar(&webhookServerPort, \"webhook-server-port\", 9443, \"The port that the webhook server serves at.\")\n\tflag.StringVar(&tlsMinVersion, \"tls-min-version\", \"1.2\", \"The minimum TLS version to be used by the webhook server. Recommended values are \\\"1.2\\\" and \\\"1.3\\\".\")\n\tflag.StringVar(&tlsCipherSuites, \"tls-cipher-suites\", \"\", \"Comma-separated list of cipher suites for the server. If omitted, the default Go cipher suites will be used.\\n\"+fmt.Sprintf(\"Possible values are %s.\", strings.Join(cliflag.TLSCipherPossibleValues(), \", \")))\n\tflag.StringVar(&webhookConfigLabel, \"webhook-config-label\", defaultWebhookConfigLabel, \"The label used to select webhook configurations to update the certs for.\")\n\tflag.StringVar(&webhookServiceNamespace, \"webhook-service-namespace\", defaultWebhookServiceNamespace, \"The namespace in which webhook service is installed.\")\n\tflag.StringVar(&webhookServiceName, \"webhook-service-name\", defaultWebhookServiceName, \"The name of the webhook service.\")\n\tflag.StringVar(&webhookSecretNamespace, \"webhook-secret-namespace\", defaultWebhookSecretNamespace, \"The namespace in which webhook secret is installed.\")\n\tflag.StringVar(&webhookSecretName, \"webhook-secret-name\", defaultWebhookSecretName, \"The name of the webhook secret.\")\n\tflag.StringVar(&webhookSecretVolumeMountPath, \"webhook-secret-volume-mount-path\", defaultWebhookSecretVolumeMountPath, \"The filesystem path to which the webhook secret is mounted.\")\n\n\tvar metricsAddr string\n\tvar probeAddr string\n\tflag.StringVar(&metricsAddr, \"metrics-bind-address\", \":8080\", \"The address the metric endpoint binds to.\")\n\tflag.StringVar(&probeAddr, \"health-probe-bind-address\", \":8081\", \"The address the probe endpoint binds to.\")\n\topts := zap.Options{\n\t\tDevelopment: true,\n\t}\n\topts.BindFlags(flag.CommandLine)\n\tflag.Parse()\n\n\tctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts)))\n\n\trestConfig := ctrl.GetConfigOrDie()\n\n\tmgr, err := ctrl.NewManager(restConfig, ctrl.Options{\n\t\tScheme:                 scheme,\n\t\tMetricsBindAddress:     metricsAddr,\n\t\tPort:                   webhookServerPort,\n\t\tHealthProbeBindAddress: probeAddr,\n\t\tCertDir:                webhookSecretVolumeMountPath,\n\t})\n\tif err != nil {\n\t\tsetupLog.Error(err, \"unable to start manager\")\n\t\tos.Exit(1)\n\t}\n\n\tk8sClientset := kubernetes.NewForConfigOrDie(restConfig)\n\n\tclusterQueryClient, err := capabilitiesdiscovery.NewClusterQueryClientForConfig(restConfig)\n\tif err != nil {\n\t\tsetupLog.Error(err, \"unable to create cluster query client\")\n\t\tos.Exit(1)\n\t}\n\n\tcl, err := client.New(restConfig, client.Options{})\n\tif err != nil {\n\t\tsetupLog.Error(err, \"unable to create client\")\n\t\tos.Exit(1)\n\t}\n\n\tmgr.GetWebhookServer().TLSMinVersion = tlsMinVersion\n\tif tlsCipherSuites != \"\" {\n\t\tcipherSuitesSetFunc, err := setCipherSuiteFunc(tlsCipherSuites)\n\t\tif err != nil {\n\t\t\tsetupLog.Error(err, \"unable to set TLS Cipher suites\")\n\t\t\tos.Exit(1)\n\t\t}\n\t\tmgr.GetWebhookServer().TLSOpts = append(mgr.GetWebhookServer().TLSOpts, cipherSuitesSetFunc)\n\t}\n\n\tif err = (&readinesscontroller.ReadinessReconciler{\n\t\tClient: mgr.GetClient(),\n\t\tScheme: mgr.GetScheme(),\n\t\tLog:    ctrl.Log.WithName(\"controllers\").WithName(\"Readiness\").WithValues(\"apigroup\", \"core\"),\n\t}).SetupWithManager(mgr); err != nil {\n\t\tsetupLog.Error(err, \"unable to create controller\", \"controller\", \"Readiness\")\n\t\tos.Exit(1)\n\t}\n\n\tif err = (&readinessprovidercontroller.ReadinessProviderReconciler{\n\t\tClient:                     mgr.GetClient(),\n\t\tClientset:                  k8sClientset,\n\t\tLog:                        ctrl.Log.WithName(\"controllers\").WithName(\"ReadinessProvider\").WithValues(\"apigroup\", \"core\"),\n\t\tScheme:                     mgr.GetScheme(),\n\t\tResourceExistenceCondition: conditions.NewResourceExistenceConditionFunc(),\n\t\tRestConfig:                 restConfig,\n\t\tDefaultQueryClient:         clusterQueryClient,\n\t}).SetupWithManager(mgr); err != nil {\n\t\tsetupLog.Error(err, \"unable to create controller\", \"controller\", \"ReadinessProvider\")\n\t\tos.Exit(1)\n\t}\n\n\tif err = (&corev1alpha2.ReadinessProvider{}).SetupWebhookWithManager(mgr); err != nil {\n\t\tsetupLog.Error(err, \"unable to create webhook\", \"webhook\", \"ReadinessProvider\", \"apigroup\", \"config\")\n\t\tos.Exit(1)\n\t}\n\n\t//+kubebuilder:scaffold:builder\n\n\tsignalHandler := ctrl.SetupSignalHandler()\n\n\tsetupLog.Info(\"Starting certificate manager\")\n\tcertManagerOpts := &certs.Options{\n\t\tClient:                        cl,\n\t\tLogger:                        ctrl.Log.WithName(\"readinessprovider-webhook-cert-manager\"),\n\t\tCertDir:                       webhookSecretVolumeMountPath,\n\t\tWebhookConfigLabel:            webhookConfigLabel,\n\t\tRotationIntervalAnnotationKey: \"tanzu.vmware.com/readinessprovider-webhook-rotation-interval\",\n\t\tNextRotationAnnotationKey:     \"tanzu.vmware.com/readinessprovider-webhook-next-rotation\",\n\t\tRotationCountAnnotationKey:    \"tanzu.vmware.com/readinessprovider-webhook-rotation-count\",\n\t\tSecretName:                    webhookSecretName,\n\t\tSecretNamespace:               webhookSecretNamespace,\n\t\tServiceName:                   webhookServiceName,\n\t\tServiceNamespace:              webhookServiceNamespace,\n\t}\n\n\tcertManager, err := certs.New(certManagerOpts)\n\tif err != nil {\n\t\tsetupLog.Error(err, \"failed to create certificate manager\")\n\t\tos.Exit(1)\n\t}\n\n\t// Start cert manager.\n\tif err := certManager.Start(signalHandler); err != nil {\n\t\tsetupLog.Error(err, \"failed to start certificate manager\")\n\t\tos.Exit(1)\n\t}\n\n\t// Wait for cert dir to be ready.\n\tif err := certManager.WaitForCertDirReady(); err != nil {\n\t\tsetupLog.Error(err, \"certificates not ready\")\n\t\tos.Exit(1)\n\t}\n\n\tif err := mgr.AddHealthzCheck(\"healthz\", healthz.Ping); err != nil {\n\t\tsetupLog.Error(err, \"unable to set up health check\")\n\t\tos.Exit(1)\n\t}\n\tif err := mgr.AddReadyzCheck(\"readyz\", healthz.Ping); err != nil {\n\t\tsetupLog.Error(err, \"unable to set up ready check\")\n\t\tos.Exit(1)\n\t}\n\n\tsetupLog.Info(\"starting manager\")\n\tif err := mgr.Start(signalHandler); err != nil {\n\t\tsetupLog.Error(err, \"problem running manager\")\n\t\tos.Exit(1)\n\t}\n}\n"
  },
  {
    "path": "readiness/controller/pkg/conditions/doc.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package conditions has the conditions defined that are used by readiness providers\npackage conditions\n"
  },
  {
    "path": "readiness/controller/pkg/conditions/resourceexistence.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage conditions\n\nimport (\n\t\"context\"\n\n\tcorev1 \"k8s.io/api/core/v1\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n\tcapabilitiesdiscovery \"github.com/vmware-tanzu/tanzu-framework/capabilities/client/pkg/discovery\"\n)\n\n// NewResourceExistenceConditionFunc returns a function for evaluating evaluate a ResourceExistenceCondition\nfunc NewResourceExistenceConditionFunc() func(context.Context, *capabilitiesdiscovery.ClusterQueryClient, *corev1alpha2.ResourceExistenceCondition, string) (corev1alpha2.ReadinessConditionState, string) {\n\treturn func(ctx context.Context, queryClient *capabilitiesdiscovery.ClusterQueryClient, c *corev1alpha2.ResourceExistenceCondition, conditionName string) (corev1alpha2.ReadinessConditionState, string) {\n\t\tif c == nil {\n\t\t\treturn corev1alpha2.ConditionFailureState, \"resourceExistenceCondition is not defined\"\n\t\t}\n\n\t\tvar err error\n\t\tvar resourceToFind corev1.ObjectReference\n\n\t\tif c.Namespace == nil {\n\t\t\tresourceToFind = corev1.ObjectReference{\n\t\t\t\tKind:       c.Kind,\n\t\t\t\tName:       c.Name,\n\t\t\t\tAPIVersion: c.APIVersion,\n\t\t\t}\n\t\t} else {\n\t\t\tresourceToFind = corev1.ObjectReference{\n\t\t\t\tKind:       c.Kind,\n\t\t\t\tName:       c.Name,\n\t\t\t\tNamespace:  *(c.Namespace),\n\t\t\t\tAPIVersion: c.APIVersion,\n\t\t\t}\n\t\t}\n\n\t\tqueryObject := capabilitiesdiscovery.Object(conditionName, &resourceToFind)\n\t\tok, err := queryClient.PreparedQuery(queryObject)()\n\t\tif err != nil {\n\t\t\treturn corev1alpha2.ConditionFailureState, err.Error()\n\t\t}\n\n\t\tif !ok {\n\t\t\treturn corev1alpha2.ConditionFailureState, \"resource not found\"\n\t\t}\n\t\treturn corev1alpha2.ConditionSuccessState, \"resource found\"\n\t}\n}\n"
  },
  {
    "path": "readiness/controller/pkg/conditions/resourceexistence_test.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage conditions\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t. \"github.com/onsi/ginkgo/v2\"\n\t. \"github.com/onsi/gomega\"\n\n\tv1 \"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/client-go/dynamic\"\n\t\"k8s.io/client-go/kubernetes\"\n\t\"k8s.io/client-go/kubernetes/scheme\"\n\t\"k8s.io/client-go/rest\"\n\tctrl \"sigs.k8s.io/controller-runtime\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\t\"sigs.k8s.io/controller-runtime/pkg/envtest\"\n\tlogf \"sigs.k8s.io/controller-runtime/pkg/log\"\n\t\"sigs.k8s.io/controller-runtime/pkg/log/zap\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n\tcapabilitiesdiscovery \"github.com/vmware-tanzu/tanzu-framework/capabilities/client/pkg/discovery\"\n\t\"github.com/vmware-tanzu/tanzu-framework/util/kubeclient\"\n\ttestutil \"github.com/vmware-tanzu/tanzu-framework/util/test\"\n)\n\nvar (\n\tcfg          *rest.Config\n\tk8sClient    client.Client\n\ttestEnv      *envtest.Environment\n\tctx          context.Context\n\tcancel       context.CancelFunc\n\tqueryClient  *capabilitiesdiscovery.ClusterQueryClient\n\tk8sClientset *kubernetes.Clientset\n)\n\nconst defaultNamespace = \"default\"\n\nfunc TestResourceExistenceCondition(t *testing.T) {\n\tRegisterFailHandler(Fail)\n\n\tRunSpecs(t, \"ResourceExistenceCondition Suite\")\n}\n\nvar _ = BeforeSuite(func() {\n\tlogf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true)))\n\n\tBy(\"bootstrapping test environment\")\n\ttestEnv = &envtest.Environment{\n\t\tCRDDirectoryPaths:     []string{filepath.Join(\"..\", \"..\", \"..\", \"..\", \"apis\", \"core\", \"config\", \"crd\", \"bases\")},\n\t\tErrorIfCRDPathMissing: true,\n\t}\n\n\tvar err error\n\t// cfg is defined in this file globally.\n\tcfg, err = testEnv.Start()\n\tExpect(err).NotTo(HaveOccurred())\n\tExpect(cfg).NotTo(BeNil())\n\n\tctx, cancel = context.WithCancel(context.TODO())\n\n\tk8sManager, err := ctrl.NewManager(cfg, ctrl.Options{\n\t\tMetricsBindAddress: \"0\",\n\t\tHost:               \"127.0.0.1\",\n\t\tPort:               9443,\n\t})\n\tExpect(err).ToNot(HaveOccurred())\n\n\t//+kubebuilder:scaffold:scheme\n\n\tk8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme})\n\tExpect(err).NotTo(HaveOccurred())\n\tExpect(k8sClient).NotTo(BeNil())\n\n\tqueryClient, err = capabilitiesdiscovery.NewClusterQueryClientForConfig(cfg)\n\tExpect(err).NotTo(HaveOccurred())\n\tExpect(queryClient).NotTo(BeNil())\n\n\t// k8sClientset is package-scoped\n\tk8sClientset, err = kubernetes.NewForConfig(cfg)\n\tExpect(err).NotTo(HaveOccurred())\n\tExpect(k8sClientset).NotTo(BeNil())\n\n\tmanifestBytes, err := os.ReadFile(\"testdata/rbac.yaml\")\n\tExpect(err).ToNot(HaveOccurred())\n\n\tdynamicClient, err := dynamic.NewForConfig(cfg)\n\tExpect(err).NotTo(HaveOccurred())\n\tExpect(dynamicClient).NotTo(BeNil())\n\n\terr = testutil.CreateResourcesFromManifest(manifestBytes, cfg, dynamicClient)\n\tExpect(err).ToNot(HaveOccurred())\n\n\tgo func() {\n\t\tdefer GinkgoRecover()\n\t\terr = k8sManager.Start(ctx)\n\t\tExpect(err).ToNot(HaveOccurred(), \"failed to run manager\")\n\t}()\n\n})\n\nvar _ = AfterSuite(func() {\n\tcancel()\n\tBy(\"tearing down the test environment\")\n\terr := testEnv.Stop()\n\tExpect(err).NotTo(HaveOccurred())\n})\n\nvar _ = Describe(\"Readiness controller\", func() {\n\tIt(\"should succeed when querying an existing namespaced resource\", func() {\n\t\tnewPod := v1.Pod{\n\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\tName:      \"testpod\",\n\t\t\t\tNamespace: defaultNamespace,\n\t\t\t},\n\t\t\tSpec: v1.PodSpec{\n\t\t\t\tContainers: []v1.Container{\n\t\t\t\t\t{\n\t\t\t\t\t\tName:  \"test-container\",\n\t\t\t\t\t\tImage: \"test:tag\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\n\t\terr := k8sClient.Create(context.TODO(), &newPod)\n\t\tExpect(err).To(BeNil())\n\n\t\tstate, _ := NewResourceExistenceConditionFunc()(context.TODO(), queryClient, &corev1alpha2.ResourceExistenceCondition{\n\t\t\tAPIVersion: \"v1\",\n\t\t\tKind:       \"Pod\",\n\t\t\tNamespace:  &newPod.Namespace,\n\t\t\tName:       newPod.Name,\n\t\t},\n\t\t\t\"podCondition\")\n\n\t\tExpect(state).To(Equal(corev1alpha2.ConditionSuccessState))\n\t})\n\n\tIt(\"should fail when querying a non-existing namespaced resource\", func() {\n\t\tstate, _ := NewResourceExistenceConditionFunc()(context.TODO(), queryClient, &corev1alpha2.ResourceExistenceCondition{\n\t\t\tAPIVersion: \"v1\",\n\t\t\tKind:       \"Pod\",\n\t\t\tNamespace: func() *string {\n\t\t\t\tn := defaultNamespace\n\t\t\t\treturn &n\n\t\t\t}(),\n\t\t\tName: \"somename\",\n\t\t},\n\t\t\t\"nonExistingCondition\")\n\n\t\tExpect(state).To(Equal(corev1alpha2.ConditionFailureState))\n\t})\n\n\tIt(\"should succeed when querying an existing cluster scoped resource\", func() {\n\t\tstate, _ := NewResourceExistenceConditionFunc()(context.TODO(), queryClient, &corev1alpha2.ResourceExistenceCondition{\n\t\t\tAPIVersion: \"apiextensions.k8s.io/v1\",\n\t\t\tKind:       \"CustomResourceDefinition\",\n\t\t\tName:       \"readinesses.core.tanzu.vmware.com\",\n\t\t},\n\t\t\t\"crdCondition\")\n\n\t\tExpect(state).To(Equal(corev1alpha2.ConditionSuccessState))\n\t})\n\n\tIt(\"should fail when querying a non-existing cluster scoped resource\", func() {\n\t\tstate, _ := NewResourceExistenceConditionFunc()(context.TODO(), queryClient, &corev1alpha2.ResourceExistenceCondition{\n\t\t\tAPIVersion: \"apiextensions.k8s.io/v1\",\n\t\t\tKind:       \"CustomResourceDefinition\",\n\t\t\tName:       \"readinesses.config.tanzu.vmware.com\",\n\t\t},\n\t\t\t\"crdCondition\")\n\n\t\tExpect(state).To(Equal(corev1alpha2.ConditionFailureState))\n\t})\n\n\tIt(\"should fail when resourceExistenceCondition is undefined\", func() {\n\t\tstate, _ := NewResourceExistenceConditionFunc()(context.TODO(), queryClient, nil, \"undefinedCondition\")\n\n\t\tExpect(state).To(Equal(corev1alpha2.ConditionFailureState))\n\t})\n\n\tIt(\"should succeed when query client has required permissions\", func() {\n\t\tcustomQueryClient, err := getCustomQueryClient()\n\t\tExpect(err).To(BeNil())\n\t\tExpect(customQueryClient).ToNot(BeNil())\n\n\t\tnewPod := v1.Pod{\n\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\tName:      \"test-pod\",\n\t\t\t\tNamespace: defaultNamespace,\n\t\t\t},\n\t\t\tSpec: v1.PodSpec{\n\t\t\t\tContainers: []v1.Container{\n\t\t\t\t\t{\n\t\t\t\t\t\tName:  \"test-container\",\n\t\t\t\t\t\tImage: \"test:tag\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\n\t\terr = k8sClient.Create(context.TODO(), &newPod)\n\t\tExpect(err).To(BeNil())\n\n\t\tstate, _ := NewResourceExistenceConditionFunc()(context.TODO(), customQueryClient, &corev1alpha2.ResourceExistenceCondition{\n\t\t\tAPIVersion: \"v1\",\n\t\t\tKind:       \"Pod\",\n\t\t\tNamespace:  &newPod.Namespace,\n\t\t\tName:       newPod.Name,\n\t\t},\n\t\t\t\"podCondition\")\n\n\t\tExpect(state).To(Equal(corev1alpha2.ConditionSuccessState))\n\t})\n\n\tIt(\"should fail when query client is missing required permissions\", func() {\n\t\tcustomQueryClient, err := getCustomQueryClient()\n\t\tExpect(err).To(BeNil())\n\t\tExpect(customQueryClient).ToNot(BeNil())\n\n\t\tstate, _ := NewResourceExistenceConditionFunc()(context.TODO(), customQueryClient, &corev1alpha2.ResourceExistenceCondition{\n\t\t\tAPIVersion: \"apps/v1\",\n\t\t\tKind:       \"Deployment\",\n\t\t\tName:       \"test-deploy\",\n\t\t\tNamespace: func() *string {\n\t\t\t\tn := defaultNamespace\n\t\t\t\treturn &n\n\t\t\t}(),\n\t\t},\n\t\t\t\"deploymentCondition\")\n\n\t\tExpect(state).To(Equal(corev1alpha2.ConditionFailureState))\n\t})\n})\n\nfunc getCustomQueryClient() (*capabilitiesdiscovery.ClusterQueryClient, error) {\n\tcustomCfg, err := kubeclient.GetConfigForServiceAccount(ctx, k8sClientset, cfg, defaultNamespace, \"pod-sa\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn capabilitiesdiscovery.NewClusterQueryClientForConfig(customCfg)\n}\n"
  },
  {
    "path": "readiness/controller/pkg/conditions/testdata/rbac.yaml",
    "content": "---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: pod-sa\n  namespace: default\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n  name: pod-read-role\n  namespace: default\nrules:\n  - apiGroups:\n    - \"\"\n    resources:\n      - pods\n    verbs:\n      - get\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: RoleBinding\nmetadata:\n  name: pod-read-rolebinding\n  namespace: default\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: Role\n  name: pod-read-role\nsubjects:\n  - kind: ServiceAccount\n    name: pod-sa\n    namespace: default\n"
  },
  {
    "path": "readiness/controller/pkg/readiness/doc.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package readiness has the controller for Readiness in core API group.\npackage readiness\n"
  },
  {
    "path": "readiness/controller/pkg/readiness/readiness_controller.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage readiness\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/go-logr/logr\"\n\t\"k8s.io/apimachinery/pkg/fields\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"k8s.io/apimachinery/pkg/types\"\n\tctrl \"sigs.k8s.io/controller-runtime\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\t\"sigs.k8s.io/controller-runtime/pkg/handler\"\n\t\"sigs.k8s.io/controller-runtime/pkg/reconcile\"\n\t\"sigs.k8s.io/controller-runtime/pkg/source\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n)\n\nconst contextTimeout = 30 * time.Second\n\n// ReadinessReconciler reconciles a Readiness object\ntype ReadinessReconciler struct {\n\tclient.Client\n\tLog    logr.Logger\n\tScheme *runtime.Scheme\n}\n\n//+kubebuilder:rbac:groups=core.tanzu.vmware.com,resources=readinesses,verbs=get;list;watch;create;update;patch;delete\n//+kubebuilder:rbac:groups=core.tanzu.vmware.com,resources=readinesses/status,verbs=get;update;patch\n\n// Reconcile is part of the main kubernetes reconciliation loop which aims to\n// move the current state of the cluster closer to the desired state.\nfunc (r *ReadinessReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {\n\tctxCancel, cancel := context.WithTimeout(ctx, contextTimeout)\n\tdefer cancel()\n\n\treadiness := &corev1alpha2.Readiness{}\n\terr := r.Client.Get(ctxCancel, req.NamespacedName, readiness)\n\tif err != nil {\n\t\treturn ctrl.Result{}, client.IgnoreNotFound(err)\n\t}\n\n\tif len(readiness.Spec.Checks) == 0 && !readiness.Status.Ready {\n\t\treadiness.Status.Ready = true\n\t\treadiness.Status.CheckStatus = []corev1alpha2.CheckStatus{}\n\t\treturn ctrl.Result{}, r.Client.Status().Update(ctxCancel, readiness)\n\t}\n\n\treadiness.Status.CheckStatus = []corev1alpha2.CheckStatus{}\n\tprovidersList := &corev1alpha2.ReadinessProviderList{}\n\n\t// TODO: Find a better way to index and fetch the providers in a single list call\n\tfor _, check := range readiness.Spec.Checks {\n\t\tproviders := &corev1alpha2.ReadinessProviderList{}\n\t\terr = r.Client.List(ctxCancel, providers, &client.ListOptions{\n\t\t\tFieldSelector: fields.OneTermEqualSelector(\"spec.checkRef\", check.Name),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn ctrl.Result{}, err\n\t\t}\n\n\t\tprovidersList.Items = append(providersList.Items, providers.Items...)\n\t}\n\n\t// uniqueProviders contain all the providers that satisfy at least one of the checks\n\tuniqueProviders := make([]corev1alpha2.ReadinessProvider, 0)\n\tuniqueProviderNames := make(map[string]bool)\n\n\tfor i := 0; i < len(providersList.Items); i++ {\n\t\tif _, ok := uniqueProviderNames[providersList.Items[i].Name]; !ok {\n\t\t\tuniqueProviders = append(uniqueProviders, providersList.Items[i])\n\t\t\tuniqueProviderNames[providersList.Items[i].Name] = true\n\t\t}\n\t}\n\n\t// allChecks contain the check names and the list of associated providers\n\tallChecks := make(map[string][]int)\n\tfor i := 0; i < len(uniqueProviders); i++ {\n\t\tfor _, checkRef := range uniqueProviders[i].Spec.CheckRefs {\n\t\t\tallChecks[checkRef] = append(allChecks[checkRef], i)\n\t\t}\n\t}\n\n\t// TODO: Handle Composite checks\n\tfor _, check := range readiness.Spec.Checks {\n\t\tcheckStatusUpdate := corev1alpha2.CheckStatus{\n\t\t\tName:      check.Name,\n\t\t\tProviders: make([]corev1alpha2.Provider, 0),\n\t\t\tReady:     false,\n\t\t}\n\n\t\tfor _, index := range allChecks[check.Name] {\n\t\t\tprovider := uniqueProviders[index]\n\n\t\t\tcheckStatusUpdate.Ready = checkStatusUpdate.Ready || (provider.Status.State == corev1alpha2.ProviderSuccessState)\n\n\t\t\tcheckStatusUpdate.Providers = append(checkStatusUpdate.Providers, corev1alpha2.Provider{\n\t\t\t\tName:     provider.Name,\n\t\t\t\tIsActive: provider.Status.State == corev1alpha2.ProviderSuccessState,\n\t\t\t})\n\t\t}\n\t\treadiness.Status.CheckStatus = append(readiness.Status.CheckStatus, checkStatusUpdate)\n\t}\n\n\treadiness.Status.Ready = true\n\n\tfor _, checkStatus := range readiness.Status.CheckStatus {\n\t\treadiness.Status.Ready = readiness.Status.Ready && checkStatus.Ready\n\t}\n\n\treturn ctrl.Result{}, r.Client.Status().Update(ctxCancel, readiness)\n}\n\n// SetupWithManager sets up the controller with the Manager.\nfunc (r *ReadinessReconciler) SetupWithManager(mgr ctrl.Manager) error {\n\terr := mgr.GetFieldIndexer().IndexField(context.Background(), &corev1alpha2.ReadinessProvider{}, \"spec.checkRef\", func(rawObj client.Object) []string {\n\t\tprovider := rawObj.(*corev1alpha2.ReadinessProvider)\n\t\tvar indices []string\n\t\tindices = append(indices, provider.Spec.CheckRefs...)\n\t\treturn indices\n\t})\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = mgr.GetFieldIndexer().IndexField(context.Background(), &corev1alpha2.Readiness{}, \"spec.checks.name\", func(rawObj client.Object) []string {\n\t\tprovider := rawObj.(*corev1alpha2.Readiness)\n\n\t\tkeys := []string{}\n\t\tfor _, check := range provider.Spec.Checks {\n\t\t\tkeys = append(keys, check.Name)\n\t\t}\n\n\t\treturn keys\n\t})\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn ctrl.NewControllerManagedBy(mgr).\n\t\tFor(&corev1alpha2.Readiness{}).\n\t\tWatches(\n\t\t\t&source.Kind{Type: &corev1alpha2.ReadinessProvider{}},\n\t\t\thandler.EnqueueRequestsFromMapFunc(r.findObjectsForReadinessProvider),\n\t\t).\n\t\tComplete(r)\n}\n\nfunc (r *ReadinessReconciler) findObjectsForReadinessProvider(readinessProviderObject client.Object) []reconcile.Request {\n\tctxCancel, cancel := context.WithTimeout(context.Background(), contextTimeout)\n\tdefer cancel()\n\n\tprovider, _ := readinessProviderObject.(*corev1alpha2.ReadinessProvider)\n\n\ttotalReadinessList := &corev1alpha2.ReadinessList{}\n\tfor _, checkRef := range provider.Spec.CheckRefs {\n\t\treadinessList := &corev1alpha2.ReadinessList{}\n\t\terr := r.Client.List(ctxCancel, readinessList, &client.ListOptions{\n\t\t\tFieldSelector: fields.OneTermEqualSelector(\"spec.checks.name\", checkRef),\n\t\t})\n\t\tif err != nil {\n\t\t\tr.Log.Error(err, \"error while updating readiness status\")\n\t\t\treturn []reconcile.Request{}\n\t\t}\n\t\ttotalReadinessList.Items = append(totalReadinessList.Items, readinessList.Items...)\n\t}\n\n\trequests := []reconcile.Request{}\n\n\tfor i := 0; i < len(totalReadinessList.Items); i++ {\n\t\trequests = append(requests, reconcile.Request{\n\t\t\tNamespacedName: types.NamespacedName{\n\t\t\t\tName: totalReadinessList.Items[i].Name,\n\t\t\t},\n\t\t})\n\t}\n\n\treturn requests\n}\n"
  },
  {
    "path": "readiness/controller/pkg/readiness/suite_test.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage readiness\n\nimport (\n\t\"context\"\n\t\"path/filepath\"\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/onsi/ginkgo/v2\"\n\t. \"github.com/onsi/gomega\"\n\n\tv1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/types\"\n\t\"k8s.io/client-go/kubernetes/scheme\"\n\t\"k8s.io/client-go/rest\"\n\tctrl \"sigs.k8s.io/controller-runtime\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\t\"sigs.k8s.io/controller-runtime/pkg/envtest\"\n\tlogf \"sigs.k8s.io/controller-runtime/pkg/log\"\n\t\"sigs.k8s.io/controller-runtime/pkg/log/zap\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n\t//+kubebuilder:scaffold:imports\n)\n\n// These tests use Ginkgo (BDD-style Go testing framework). Refer to\n// http://onsi.github.io/ginkgo/ to learn more about Ginkgo.\n\nvar cfg *rest.Config\nvar k8sClient client.Client\nvar testEnv *envtest.Environment\nvar ctx context.Context\nvar timeout = 5 * time.Second\nvar interval = 100 * time.Millisecond\nvar setupLog = ctrl.Log.WithName(\"controllers\").WithName(\"readiness\")\nvar cancel context.CancelFunc\n\nfunc TestAPIs(t *testing.T) {\n\tRegisterFailHandler(Fail)\n\n\tRunSpecs(t, \"Controller Suite\")\n}\n\nvar _ = BeforeSuite(func() {\n\tlogf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true)))\n\n\tBy(\"bootstrapping test environment\")\n\ttestEnv = &envtest.Environment{\n\t\tCRDDirectoryPaths:     []string{filepath.Join(\"..\", \"..\", \"..\", \"..\", \"apis\", \"core\", \"config\", \"crd\", \"bases\")},\n\t\tErrorIfCRDPathMissing: true,\n\t}\n\n\tvar err error\n\t// cfg is defined in this file globally.\n\tcfg, err = testEnv.Start()\n\tExpect(err).NotTo(HaveOccurred())\n\tExpect(cfg).NotTo(BeNil())\n\n\terr = corev1alpha2.AddToScheme(scheme.Scheme)\n\tExpect(err).NotTo(HaveOccurred())\n\n\tctx, cancel = context.WithCancel(context.TODO())\n\n\tk8sManager, err := ctrl.NewManager(cfg, ctrl.Options{\n\t\tScheme:             scheme.Scheme,\n\t\tMetricsBindAddress: \"0\",\n\t\tHost:               \"127.0.0.1\",\n\t\tPort:               9443,\n\t})\n\tExpect(err).ToNot(HaveOccurred())\n\n\t//+kubebuilder:scaffold:scheme\n\n\tk8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme})\n\tExpect(err).NotTo(HaveOccurred())\n\tExpect(k8sClient).NotTo(BeNil())\n\n\terr = (&ReadinessReconciler{\n\t\tClient: k8sManager.GetClient(),\n\t\tScheme: k8sManager.GetScheme(),\n\t\tLog:    setupLog,\n\t}).SetupWithManager(k8sManager)\n\tExpect(err).ToNot(HaveOccurred())\n\n\tgo func() {\n\t\tdefer GinkgoRecover()\n\t\terr = k8sManager.Start(ctx)\n\t\tExpect(err).ToNot(HaveOccurred(), \"failed to run manager\")\n\t}()\n\n})\n\nvar _ = AfterSuite(func() {\n\tcancel()\n\tBy(\"tearing down the test environment\")\n\terr := testEnv.Stop()\n\tExpect(err).NotTo(HaveOccurred())\n})\n\nvar _ = Describe(\"Readiness controller\", func() {\n\tIt(\"Readiness with no checks should succeed\", func() {\n\t\treadiness := getTestReadiness()\n\t\terr := k8sClient.Create(ctx, readiness)\n\t\tExpect(err).To(BeNil())\n\n\t\tEventually(func() bool {\n\t\t\tans := corev1alpha2.Readiness{}\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readiness.Name}, &ans)\n\t\t\treturn err == nil && ans.Status.Ready\n\t\t}, timeout, interval).Should(BeTrue())\n\t})\n\n\tIt(\"Readiness with one check and no matching providers should not be ready\", func() {\n\t\tprovider := getTestReadinessProvider()\n\t\tprovider.Spec.CheckRefs = []string{\"check2\"}\n\t\tprovider.Status.State = corev1alpha2.ProviderSuccessState\n\t\terr := k8sClient.Create(ctx, provider)\n\t\tExpect(err).To(BeNil())\n\n\t\treadiness := getTestReadiness()\n\t\treadiness.Spec.Checks = append(readiness.Spec.Checks, corev1alpha2.Check{\n\t\t\tName: \"check1\",\n\t\t\tType: corev1alpha2.BasicReadinessCheck,\n\t\t})\n\t\terr = k8sClient.Create(ctx, readiness)\n\t\tExpect(err).To(BeNil())\n\n\t\tEventually(func() bool {\n\t\t\tans := corev1alpha2.Readiness{}\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readiness.Name}, &ans)\n\t\t\treturn err == nil && !ans.Status.Ready && len(ans.Status.CheckStatus) > 0 && len(ans.Status.CheckStatus[0].Providers) == 0\n\t\t}, timeout, interval).Should(BeTrue())\n\t})\n\n\tIt(\"Readiness with one check and matching providers in inactive state; should not be ready\", func() {\n\t\tprovider := getTestReadinessProvider()\n\t\tprovider.Spec.CheckRefs = []string{\"check3\"}\n\t\tprovider.Status.State = corev1alpha2.ProviderFailureState\n\t\terr := k8sClient.Create(ctx, provider)\n\t\tExpect(err).To(BeNil())\n\n\t\treadiness := getTestReadiness()\n\t\treadiness.Spec.Checks = append(readiness.Spec.Checks, corev1alpha2.Check{\n\t\t\tName: \"check3\",\n\t\t\tType: corev1alpha2.BasicReadinessCheck,\n\t\t})\n\t\terr = k8sClient.Create(ctx, readiness)\n\t\tExpect(err).To(BeNil())\n\n\t\tEventually(func() bool {\n\t\t\tans := corev1alpha2.Readiness{}\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readiness.Name}, &ans)\n\t\t\treturn err == nil &&\n\t\t\t\t!ans.Status.Ready &&\n\t\t\t\tlen(ans.Status.CheckStatus) == 1 &&\n\t\t\t\tlen(ans.Status.CheckStatus[0].Providers) == 1\n\t\t}, timeout, interval).Should(BeTrue())\n\t})\n\n\tIt(\"Readiness with one check and matching providers in active state; should be ready\", func() {\n\t\tprovider := getTestReadinessProvider()\n\t\tprovider.Spec.CheckRefs = []string{\"check4\"}\n\t\terr := k8sClient.Create(ctx, provider)\n\t\tExpect(err).To(BeNil())\n\n\t\tprovider.Status.State = corev1alpha2.ProviderSuccessState\n\t\tprovider.Status.Conditions = []corev1alpha2.ReadinessConditionStatus{}\n\t\terr = k8sClient.Status().Update(ctx, provider)\n\t\tExpect(err).To(BeNil())\n\n\t\treadiness := getTestReadiness()\n\t\treadiness.Spec.Checks = append(readiness.Spec.Checks, corev1alpha2.Check{\n\t\t\tName: \"check4\",\n\t\t\tType: corev1alpha2.BasicReadinessCheck,\n\t\t})\n\t\terr = k8sClient.Create(ctx, readiness)\n\t\tExpect(err).To(BeNil())\n\n\t\tEventually(func() bool {\n\t\t\tans := corev1alpha2.Readiness{}\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readiness.Name}, &ans)\n\t\t\treturn err == nil &&\n\t\t\t\tans.Status.Ready &&\n\t\t\t\tlen(ans.Status.CheckStatus[0].Providers) == 1\n\t\t}, timeout, interval).Should(BeTrue())\n\t})\n\n\tIt(\"Readiness with one check and two matching providers\", func() {\n\t\tprovider1 := getTestReadinessProvider()\n\t\tprovider1.Spec.CheckRefs = []string{\"check5\"}\n\t\terr := k8sClient.Create(ctx, provider1)\n\t\tExpect(err).To(BeNil())\n\n\t\tprovider1.Status.State = corev1alpha2.ProviderFailureState\n\t\tprovider1.Status.Conditions = []corev1alpha2.ReadinessConditionStatus{}\n\t\terr = k8sClient.Status().Update(ctx, provider1)\n\t\tExpect(err).To(BeNil())\n\n\t\tprovider2 := getTestReadinessProvider()\n\t\tprovider2.Spec.CheckRefs = []string{\"check5\"}\n\t\terr = k8sClient.Create(ctx, provider2)\n\t\tExpect(err).To(BeNil())\n\n\t\tprovider2.Status.State = corev1alpha2.ProviderFailureState\n\t\tprovider2.Status.Conditions = []corev1alpha2.ReadinessConditionStatus{}\n\t\terr = k8sClient.Status().Update(ctx, provider2)\n\t\tExpect(err).To(BeNil())\n\n\t\treadiness := getTestReadiness()\n\t\treadiness.Spec.Checks = append(readiness.Spec.Checks, corev1alpha2.Check{\n\t\t\tName: \"check5\",\n\t\t\tType: corev1alpha2.BasicReadinessCheck,\n\t\t})\n\t\terr = k8sClient.Create(ctx, readiness)\n\t\tExpect(err).To(BeNil())\n\n\t\t// None of the providers is active\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readiness.Name}, readiness)\n\t\t\treturn err == nil &&\n\t\t\t\t!readiness.Status.Ready &&\n\t\t\t\tlen(readiness.Status.CheckStatus) == 1 &&\n\t\t\t\tlen(readiness.Status.CheckStatus[0].Providers) == 2\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tprovider2.Status.State = corev1alpha2.ProviderSuccessState\n\t\tprovider2.Status.Conditions = []corev1alpha2.ReadinessConditionStatus{}\n\t\terr = k8sClient.Status().Update(ctx, provider2)\n\t\tExpect(err).To(BeNil())\n\n\t\t// One of the providers is active\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readiness.Name}, readiness)\n\t\t\treturn err == nil &&\n\t\t\t\treadiness.Status.Ready &&\n\t\t\t\tlen(readiness.Status.CheckStatus[0].Providers) == 2\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tprovider1.Status.State = corev1alpha2.ProviderSuccessState\n\t\tprovider1.Status.Conditions = []corev1alpha2.ReadinessConditionStatus{}\n\t\terr = k8sClient.Status().Update(ctx, provider1)\n\t\tExpect(err).To(BeNil())\n\n\t\t// Both proviers are active\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readiness.Name}, readiness)\n\t\t\treturn err == nil &&\n\t\t\t\treadiness.Status.Ready &&\n\t\t\t\tlen(readiness.Status.CheckStatus[0].Providers) == 2\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t})\n\n\tIt(\"Readiness with two checks\", func() {\n\t\treadiness := getTestReadiness()\n\t\treadiness.Spec.Checks = append(readiness.Spec.Checks, corev1alpha2.Check{\n\t\t\tName: \"check6\",\n\t\t\tType: corev1alpha2.BasicReadinessCheck,\n\t\t})\n\t\treadiness.Spec.Checks = append(readiness.Spec.Checks, corev1alpha2.Check{\n\t\t\tName: \"check7\",\n\t\t\tType: corev1alpha2.BasicReadinessCheck,\n\t\t})\n\t\terr := k8sClient.Create(ctx, readiness)\n\t\tExpect(err).To(BeNil())\n\n\t\t// Two checks and no providers\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readiness.Name}, readiness)\n\t\t\treturn err == nil &&\n\t\t\t\t!readiness.Status.Ready &&\n\t\t\t\tlen(readiness.Status.CheckStatus) == 2 &&\n\t\t\t\tlen(readiness.Status.CheckStatus[0].Providers) == 0 &&\n\t\t\t\tlen(readiness.Status.CheckStatus[1].Providers) == 0\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tprovider1 := getTestReadinessProvider()\n\t\tprovider1.Spec.CheckRefs = []string{\"check6\"}\n\t\terr = k8sClient.Create(ctx, provider1)\n\t\tExpect(err).To(BeNil())\n\n\t\t// Provider is available for one check and the provider is not successful\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readiness.Name}, readiness)\n\t\t\treturn err == nil &&\n\t\t\t\t!readiness.Status.Ready &&\n\t\t\t\tlen(readiness.Status.CheckStatus[0].Providers) == 1 &&\n\t\t\t\tlen(readiness.Status.CheckStatus[1].Providers) == 0\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tprovider2 := getTestReadinessProvider()\n\t\tprovider2.Spec.CheckRefs = []string{\"check7\"}\n\t\terr = k8sClient.Create(ctx, provider2)\n\t\tExpect(err).To(BeNil())\n\n\t\t// Provider is available for two checks and both providers are not successful\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readiness.Name}, readiness)\n\t\t\treturn err == nil &&\n\t\t\t\t!readiness.Status.Ready &&\n\t\t\t\tlen(readiness.Status.CheckStatus[0].Providers) == 1 &&\n\t\t\t\tlen(readiness.Status.CheckStatus[1].Providers) == 1\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tprovider2.Status.State = corev1alpha2.ProviderSuccessState\n\t\tprovider2.Status.Conditions = []corev1alpha2.ReadinessConditionStatus{}\n\t\terr = k8sClient.Status().Update(ctx, provider2)\n\t\tExpect(err).To(BeNil())\n\n\t\t// Provider is available for two checks and one of the providers is successful\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readiness.Name}, readiness)\n\t\t\treturn err == nil &&\n\t\t\t\t!readiness.Status.Ready &&\n\t\t\t\tlen(readiness.Status.CheckStatus[0].Providers) == 1 &&\n\t\t\t\tlen(readiness.Status.CheckStatus[1].Providers) == 1 &&\n\t\t\t\treadiness.Status.CheckStatus[1].Ready &&\n\t\t\t\t!readiness.Status.CheckStatus[0].Ready\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tprovider1.Status.State = corev1alpha2.ProviderSuccessState\n\t\tprovider1.Status.Conditions = []corev1alpha2.ReadinessConditionStatus{}\n\t\terr = k8sClient.Status().Update(ctx, provider1)\n\t\tExpect(err).To(BeNil())\n\n\t\t// Providers for all the checks are successful\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readiness.Name}, readiness)\n\t\t\treturn err == nil &&\n\t\t\t\treadiness.Status.Ready &&\n\t\t\t\tlen(readiness.Status.CheckStatus) == 2 &&\n\t\t\t\tlen(readiness.Status.CheckStatus[0].Providers) == 1 &&\n\t\t\t\tlen(readiness.Status.CheckStatus[1].Providers) == 1 &&\n\t\t\t\treadiness.Status.CheckStatus[1].Ready &&\n\t\t\t\treadiness.Status.CheckStatus[0].Ready\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\treadiness.Spec.Checks = []corev1alpha2.Check{readiness.Spec.Checks[0]}\n\t\treadiness.Spec.Checks = append(readiness.Spec.Checks, corev1alpha2.Check{\n\t\t\tName: \"check8\",\n\t\t\tType: corev1alpha2.BasicReadinessCheck,\n\t\t})\n\t\terr = k8sClient.Update(ctx, readiness)\n\t\tExpect(err).To(BeNil())\n\n\t\t// One check is removed and a new check is added\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readiness.Name}, readiness)\n\t\t\treturn err == nil &&\n\t\t\t\t!readiness.Status.Ready &&\n\t\t\t\tlen(readiness.Status.CheckStatus[0].Providers) == 1 &&\n\t\t\t\tlen(readiness.Status.CheckStatus[1].Providers) == 0 &&\n\t\t\t\treadiness.Status.CheckStatus[0].Ready\n\t\t}, timeout, interval).Should(BeTrue())\n\t})\n\n\tIt(\"Readiness with two checks and one provider\", func() {\n\t\treadiness := getTestReadiness()\n\t\treadiness.Spec.Checks = append(readiness.Spec.Checks, corev1alpha2.Check{\n\t\t\tName: \"check8\",\n\t\t\tType: corev1alpha2.BasicReadinessCheck,\n\t\t})\n\t\treadiness.Spec.Checks = append(readiness.Spec.Checks, corev1alpha2.Check{\n\t\t\tName: \"check9\",\n\t\t\tType: corev1alpha2.BasicReadinessCheck,\n\t\t})\n\t\terr := k8sClient.Create(ctx, readiness)\n\t\tExpect(err).To(BeNil())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readiness.Name}, readiness)\n\t\t\treturn err == nil &&\n\t\t\t\t!readiness.Status.Ready &&\n\t\t\t\tlen(readiness.Status.CheckStatus) == 2 &&\n\t\t\t\tlen(readiness.Status.CheckStatus[0].Providers) == 0 &&\n\t\t\t\tlen(readiness.Status.CheckStatus[1].Providers) == 0\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tprovider1 := getTestReadinessProvider()\n\t\tprovider1.Spec.CheckRefs = []string{\"check8\", \"check9\"}\n\t\terr = k8sClient.Create(ctx, provider1)\n\t\tExpect(err).To(BeNil())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readiness.Name}, readiness)\n\t\t\treturn err == nil &&\n\t\t\t\t!readiness.Status.Ready &&\n\t\t\t\tlen(readiness.Status.CheckStatus[0].Providers) == 1 &&\n\t\t\t\tlen(readiness.Status.CheckStatus[1].Providers) == 1\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\tprovider1.Status.State = corev1alpha2.ProviderSuccessState\n\t\tprovider1.Status.Conditions = []corev1alpha2.ReadinessConditionStatus{}\n\t\terr = k8sClient.Status().Update(ctx, provider1)\n\t\tExpect(err).To(BeNil())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readiness.Name}, readiness)\n\t\t\treturn err == nil &&\n\t\t\t\treadiness.Status.Ready &&\n\t\t\t\tlen(readiness.Status.CheckStatus[0].Providers) == 1 &&\n\t\t\t\tlen(readiness.Status.CheckStatus[1].Providers) == 1\n\t\t}, timeout, interval).Should(BeTrue())\n\t})\n\n})\n\nfunc getTestReadiness() *corev1alpha2.Readiness {\n\treturn &corev1alpha2.Readiness{\n\t\tObjectMeta: v1.ObjectMeta{\n\t\t\tGenerateName: \"test-readiness-\",\n\t\t},\n\t\tSpec: corev1alpha2.ReadinessSpec{\n\t\t\tChecks: []corev1alpha2.Check{},\n\t\t},\n\t}\n}\n\nfunc getTestReadinessProvider() *corev1alpha2.ReadinessProvider {\n\treturn &corev1alpha2.ReadinessProvider{\n\t\tObjectMeta: v1.ObjectMeta{\n\t\t\tGenerateName: \"test-readiness-provider-\",\n\t\t},\n\t\tSpec: corev1alpha2.ReadinessProviderSpec{\n\t\t\tConditions: []corev1alpha2.ReadinessProviderCondition{},\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "readiness/controller/pkg/readinessprovider/doc.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package readinessprovider has the controller for ReadinessProviders in core API group.\npackage readinessprovider\n"
  },
  {
    "path": "readiness/controller/pkg/readinessprovider/readinessprovider_controller.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage readinessprovider\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/go-logr/logr\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"k8s.io/client-go/kubernetes\"\n\t\"k8s.io/client-go/rest\"\n\tctrl \"sigs.k8s.io/controller-runtime\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n\tcapabilitiesdiscovery \"github.com/vmware-tanzu/tanzu-framework/capabilities/client/pkg/discovery\"\n\t\"github.com/vmware-tanzu/tanzu-framework/util/kubeclient\"\n)\n\nconst (\n\trequeueInterval = 60 * time.Second\n\tcontextTimeout  = 60 * time.Second\n)\n\n// ReadinessProviderReconciler reconciles a ReadinessProvider object\ntype ReadinessProviderReconciler struct {\n\tclient.Client\n\tClientset                  *kubernetes.Clientset\n\tLog                        logr.Logger\n\tScheme                     *runtime.Scheme\n\tResourceExistenceCondition func(context.Context, *capabilitiesdiscovery.ClusterQueryClient, *corev1alpha2.ResourceExistenceCondition, string) (corev1alpha2.ReadinessConditionState, string)\n\tRestConfig                 *rest.Config\n\tDefaultQueryClient         *capabilitiesdiscovery.ClusterQueryClient\n}\n\n//+kubebuilder:rbac:groups=core.tanzu.vmware.com,resources=readinessproviders,verbs=get;list;watch;create;update;patch;delete\n//+kubebuilder:rbac:groups=core.tanzu.vmware.com,resources=readinessproviders/status,verbs=get;update;patch\n\n// Reconcile is part of the main kubernetes reconciliation loop which aims to\n// move the current state of the cluster closer to the desired state.\nfunc (r *ReadinessProviderReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {\n\tctxCancel, cancel := context.WithTimeout(ctx, contextTimeout)\n\tdefer cancel()\n\n\tlog := r.Log.WithValues(\"readinessprovider\", req.NamespacedName)\n\tlog.Info(\"starting reconcile\")\n\n\treadinessProvider := corev1alpha2.ReadinessProvider{}\n\tresult := ctrl.Result{\n\t\tRequeueAfter: requeueInterval,\n\t}\n\n\tif err := r.Client.Get(ctxCancel, req.NamespacedName, &readinessProvider); err != nil {\n\t\tlog.Error(err, \"unable to fetch ReadinessProvider\")\n\t\treturn result, client.IgnoreNotFound(err)\n\t}\n\n\tvar clusterQueryClient *capabilitiesdiscovery.ClusterQueryClient\n\n\t// If provided in the spec, use the serviceAccount for evaluating conditions\n\tif readinessProvider.Spec.ServiceAccountRef != nil {\n\t\tcfg, err := kubeclient.GetConfigForServiceAccount(ctx, r.Clientset, r.RestConfig, readinessProvider.Spec.ServiceAccountRef.Namespace, readinessProvider.Spec.ServiceAccountRef.Name)\n\t\tif err != nil {\n\t\t\treadinessProvider.Status.Message = err.Error()\n\t\t\treadinessProvider.Status.State = corev1alpha2.ProviderFailureState\n\t\t\treadinessProvider.Status.Conditions = []corev1alpha2.ReadinessConditionStatus{}\n\t\t\treturn result, r.Status().Update(ctxCancel, &readinessProvider)\n\t\t}\n\t\tclusterQueryClient, err = capabilitiesdiscovery.NewClusterQueryClientForConfig(cfg)\n\t\tif err != nil {\n\t\t\treturn ctrl.Result{}, fmt.Errorf(\"unable to create ClusterQueryClient: %w\", err)\n\t\t}\n\t} else {\n\t\tclusterQueryClient = r.DefaultQueryClient\n\t}\n\n\t// Evaluate provider conditions\n\treadinessProvider.Status.Conditions = make([]corev1alpha2.ReadinessConditionStatus, len(readinessProvider.Spec.Conditions))\n\n\tfor i, condition := range readinessProvider.Spec.Conditions {\n\t\treadinessProvider.Status.Conditions[i].Name = condition.Name\n\t\tvar state corev1alpha2.ReadinessConditionState\n\t\tvar message string\n\t\tstate, message = r.ResourceExistenceCondition(ctxCancel, clusterQueryClient, condition.ResourceExistenceCondition, condition.Name)\n\t\treadinessProvider.Status.Conditions[i].State = state\n\t\treadinessProvider.Status.Conditions[i].Message = message\n\t}\n\n\treadinessProvider.Status.State, readinessProvider.Status.Message = determineProviderStatus(log, readinessProvider.Status.Conditions)\n\n\tlog.Info(\"Successfully reconciled\")\n\n\treturn result, r.Status().Update(ctxCancel, &readinessProvider)\n}\n\n// Evaluate and return cumulative state of ReadinessProvider based on ReadinessConditionStatus values\nfunc determineProviderStatus(log logr.Logger, conditionStatusList []corev1alpha2.ReadinessConditionStatus) (state corev1alpha2.ReadinessProviderState, message string) {\n\tinProgress := false\n\tfor _, status := range conditionStatusList {\n\t\tif status.State == corev1alpha2.ConditionFailureState {\n\t\t\treturn corev1alpha2.ProviderFailureState, \"one or more condition(s) failed\"\n\t\t} else if status.State == corev1alpha2.ConditionInProgressState {\n\t\t\tinProgress = true\n\t\t}\n\t}\n\tlog.V(2).Info(\"evaluating ReadinessProviderState\")\n\tif inProgress {\n\t\treturn corev1alpha2.ProviderInProgressState, \"one or more condition(s) are being evaluated\"\n\t}\n\n\treturn corev1alpha2.ProviderSuccessState, \"all condition(s) passed\"\n}\n\n// SetupWithManager sets up the controller with the Manager.\nfunc (r *ReadinessProviderReconciler) SetupWithManager(mgr ctrl.Manager) error {\n\treturn ctrl.NewControllerManagedBy(mgr).\n\t\tFor(&corev1alpha2.ReadinessProvider{}).\n\t\tComplete(r)\n}\n"
  },
  {
    "path": "readiness/controller/pkg/readinessprovider/suite_test.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage readinessprovider\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"log\"\n\t\"net\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/onsi/ginkgo/v2\"\n\t. \"github.com/onsi/gomega\"\n\n\tcorev1 \"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/types\"\n\t\"k8s.io/client-go/dynamic\"\n\t\"k8s.io/client-go/kubernetes\"\n\t\"k8s.io/client-go/kubernetes/scheme\"\n\t\"k8s.io/client-go/rest\"\n\t\"k8s.io/client-go/util/cert\"\n\tctrl \"sigs.k8s.io/controller-runtime\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\t\"sigs.k8s.io/controller-runtime/pkg/envtest\"\n\tlogf \"sigs.k8s.io/controller-runtime/pkg/log\"\n\t\"sigs.k8s.io/controller-runtime/pkg/log/zap\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n\tcapabilitiesdiscovery \"github.com/vmware-tanzu/tanzu-framework/capabilities/client/pkg/discovery\"\n\ttestutil \"github.com/vmware-tanzu/tanzu-framework/util/test\"\n\t//+kubebuilder:scaffold:imports\n)\n\n// These tests use Ginkgo (BDD-style Go testing framework). Refer to\n// http://onsi.github.io/ginkgo/ to learn more about Ginkgo.\n\nvar cfg *rest.Config\nvar k8sClient client.Client\nvar testEnv *envtest.Environment\nvar ctx context.Context\nvar cancel context.CancelFunc\nvar setupLog = ctrl.Log.WithName(\"controllers\").WithName(\"readinessprovider\")\nvar timeout = 10 * time.Second\nvar interval = 100 * time.Millisecond\nvar calls int\nvar tmpDir string\nvar generatedWebhookManifestBytes []byte\n\nfunc TestAPIs(t *testing.T) {\n\tRegisterFailHandler(Fail)\n\n\tRunSpecs(t, \"Controller Suite\")\n}\n\nfunc generateCertificateAndManifests() error {\n\tcert, key, err := cert.GenerateSelfSignedCertKey(\"tanzu-readinessprovider-webhook-service.default.svc\", []net.IP{}, []string{})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\ttmpDir, err = os.MkdirTemp(\"/tmp\", \"readinessprovider-test\")\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = os.WriteFile(path.Join(tmpDir, \"readinessprovider-webhook.crt\"), cert, 0644)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = os.WriteFile(path.Join(tmpDir, \"readinessprovider-webhook.key\"), key, 0644)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tinput, err := os.ReadFile(\"testdata/webhook.yaml\")\n\tif err != nil {\n\t\tlog.Fatalln(err)\n\t}\n\n\tlines := strings.Split(string(input), \"\\n\")\n\n\tfor i, line := range lines {\n\t\tif strings.Contains(line, \"Cg==\") {\n\t\t\tlines[i] = strings.Replace(lines[i], \"Cg==\", base64.StdEncoding.EncodeToString(cert), 1)\n\t\t}\n\t}\n\tgeneratedWebhookManifestBytes = []byte(strings.Join(lines, \"\\n\"))\n\treturn nil\n}\n\nvar _ = BeforeSuite(func() {\n\tlogf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true)))\n\n\tBy(\"bootstrapping test environment\")\n\ttestEnv = &envtest.Environment{\n\t\tCRDDirectoryPaths:     []string{filepath.Join(\"..\", \"..\", \"..\", \"..\", \"apis\", \"core\", \"config\", \"crd\", \"bases\")},\n\t\tErrorIfCRDPathMissing: true,\n\t}\n\n\tvar err error\n\t// cfg is defined in this file globally.\n\tcfg, err = testEnv.Start()\n\tExpect(err).NotTo(HaveOccurred())\n\tExpect(cfg).NotTo(BeNil())\n\n\ttestEnv.ControlPlane.APIServer.Configure().Append(\"admission-control\", \"ValidatingAdmissionWebhook\")\n\n\terr = corev1alpha2.AddToScheme(scheme.Scheme)\n\tExpect(err).NotTo(HaveOccurred())\n\n\tctx, cancel = context.WithCancel(context.TODO())\n\n\tk8sManager, err := ctrl.NewManager(cfg, ctrl.Options{\n\t\tScheme:             scheme.Scheme,\n\t\tMetricsBindAddress: \"0\",\n\t\tHost:               \"127.0.0.1\",\n\t\tPort:               9443,\n\t})\n\tExpect(err).ToNot(HaveOccurred())\n\n\terr = generateCertificateAndManifests()\n\tExpect(err).ToNot(HaveOccurred())\n\n\tk8sManager.GetWebhookServer().TLSMinVersion = \"1.2\"\n\tk8sManager.GetWebhookServer().CertDir = tmpDir\n\tk8sManager.GetWebhookServer().CertName = \"readinessprovider-webhook.crt\"\n\tk8sManager.GetWebhookServer().KeyName = \"readinessprovider-webhook.key\"\n\tk8sManager.GetWebhookServer().Port = 9443\n\n\t//+kubebuilder:scaffold:scheme\n\n\tk8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme})\n\tExpect(err).NotTo(HaveOccurred())\n\tExpect(k8sClient).NotTo(BeNil())\n\n\tdynamicClient, err := dynamic.NewForConfig(cfg)\n\tExpect(err).ToNot(HaveOccurred())\n\tExpect(dynamicClient).ToNot(BeNil())\n\n\tqueryClient, err := capabilitiesdiscovery.NewClusterQueryClientForConfig(k8sManager.GetConfig())\n\tExpect(err).ToNot(HaveOccurred())\n\tExpect(queryClient).ToNot(BeNil())\n\n\terr = (&ReadinessProviderReconciler{\n\t\tClient:    k8sManager.GetClient(),\n\t\tClientset: kubernetes.NewForConfigOrDie(k8sManager.GetConfig()),\n\t\tScheme:    k8sManager.GetScheme(),\n\t\tLog:       setupLog,\n\t\tResourceExistenceCondition: func(context context.Context, client *capabilitiesdiscovery.ClusterQueryClient, rec *corev1alpha2.ResourceExistenceCondition, conditionName string) (corev1alpha2.ReadinessConditionState, string) {\n\t\t\tif rec.Kind == \"failurekind\" {\n\t\t\t\treturn corev1alpha2.ConditionFailureState, \"TestFailure\"\n\t\t\t}\n\t\t\tif rec.Kind == \"inprogresskind\" {\n\t\t\t\treturn corev1alpha2.ConditionInProgressState, \"TestInProgress\"\n\t\t\t}\n\t\t\tif rec.Kind == \"repeatkind\" {\n\t\t\t\tcalls++\n\t\t\t}\n\n\t\t\treturn corev1alpha2.ConditionSuccessState, \"TestSuccess\"\n\t\t},\n\t\tRestConfig:         k8sManager.GetConfig(),\n\t\tDefaultQueryClient: queryClient,\n\t}).SetupWithManager(k8sManager)\n\tExpect(err).ToNot(HaveOccurred())\n\n\terr = (&corev1alpha2.ReadinessProvider{}).SetupWebhookWithManager(k8sManager)\n\tExpect(err).ToNot(HaveOccurred())\n\n\tgo func() {\n\t\tdefer GinkgoRecover()\n\t\terr = k8sManager.Start(ctx)\n\t\tExpect(err).ToNot(HaveOccurred(), \"failed to run manager\")\n\t}()\n\n\terr = testutil.CreateResourcesFromManifest(generatedWebhookManifestBytes, cfg, dynamicClient)\n\tExpect(err).ToNot(HaveOccurred())\n\n\tmanifestBytes, err := os.ReadFile(\"testdata/rbac.yaml\")\n\tExpect(err).ToNot(HaveOccurred())\n\n\terr = testutil.CreateResourcesFromManifest(manifestBytes, cfg, dynamicClient)\n\tExpect(err).ToNot(HaveOccurred())\n})\n\nvar _ = AfterSuite(func() {\n\tcancel()\n\tBy(\"tearing down the test environment\")\n\terr := testEnv.Stop()\n\tExpect(err).NotTo(HaveOccurred())\n})\n\nvar _ = Describe(\"Readiness Provider controller\", func() {\n\tIt(\"should fail when the condition type is empty\", func() {\n\t\treadinessProvider := getTestReadinessProvider()\n\t\treadinessProvider.Spec.Conditions = append(readinessProvider.Spec.Conditions, corev1alpha2.ReadinessProviderCondition{})\n\t\terr := k8sClient.Create(ctx, readinessProvider)\n\t\tExpect(err).NotTo(BeNil())\n\t})\n\n\tIt(\"should succeed when the provider has no conditions\", func() {\n\t\treadinessProvider := getTestReadinessProvider()\n\t\terr := k8sClient.Create(ctx, readinessProvider)\n\t\tExpect(err).To(BeNil())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readinessProvider.Name}, readinessProvider)\n\t\t\treturn err == nil && readinessProvider.Status.State == corev1alpha2.ProviderSuccessState\n\t\t}, timeout, interval).Should(BeTrue())\n\t})\n\n\tIt(\"should succeed when all the conditions satisfy\", func() {\n\t\treadinessProvider := getTestReadinessProvider()\n\t\treadinessProvider.Spec.Conditions = append(readinessProvider.Spec.Conditions, corev1alpha2.ReadinessProviderCondition{\n\t\t\tName:                       \"cond1\",\n\t\t\tResourceExistenceCondition: &corev1alpha2.ResourceExistenceCondition{},\n\t\t})\n\t\treadinessProvider.Spec.Conditions = append(readinessProvider.Spec.Conditions, corev1alpha2.ReadinessProviderCondition{\n\t\t\tName:                       \"cond1\",\n\t\t\tResourceExistenceCondition: &corev1alpha2.ResourceExistenceCondition{},\n\t\t})\n\t\terr := k8sClient.Create(ctx, readinessProvider)\n\t\tExpect(err).To(BeNil())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readinessProvider.Name}, readinessProvider)\n\t\t\treturn err == nil &&\n\t\t\t\treadinessProvider.Status.State == corev1alpha2.ProviderSuccessState &&\n\t\t\t\tlen(readinessProvider.Status.Conditions) == 2 &&\n\t\t\t\treadinessProvider.Status.Conditions[0].State == corev1alpha2.ConditionSuccessState &&\n\t\t\t\treadinessProvider.Status.Conditions[1].State == corev1alpha2.ConditionSuccessState\n\t\t}, timeout, interval).Should(BeTrue())\n\t})\n\n\tIt(\"should fail when one of the conditions does not satisfy\", func() {\n\t\treadinessProvider := getTestReadinessProvider()\n\t\treadinessProvider.Spec.Conditions = append(readinessProvider.Spec.Conditions, corev1alpha2.ReadinessProviderCondition{\n\t\t\tName:                       \"cond1\",\n\t\t\tResourceExistenceCondition: &corev1alpha2.ResourceExistenceCondition{},\n\t\t})\n\t\treadinessProvider.Spec.Conditions = append(readinessProvider.Spec.Conditions, corev1alpha2.ReadinessProviderCondition{\n\t\t\tName: \"cond2\",\n\t\t\tResourceExistenceCondition: &corev1alpha2.ResourceExistenceCondition{\n\t\t\t\tKind: \"failurekind\",\n\t\t\t},\n\t\t})\n\t\terr := k8sClient.Create(ctx, readinessProvider)\n\t\tExpect(err).To(BeNil())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readinessProvider.Name}, readinessProvider)\n\t\t\treturn err == nil &&\n\t\t\t\treadinessProvider.Status.State == corev1alpha2.ProviderFailureState &&\n\t\t\t\tlen(readinessProvider.Status.Conditions) == 2 &&\n\t\t\t\treadinessProvider.Status.Conditions[0].State == corev1alpha2.ConditionSuccessState &&\n\t\t\t\treadinessProvider.Status.Conditions[1].State == corev1alpha2.ConditionFailureState\n\t\t}, timeout, interval).Should(BeTrue())\n\t})\n\n\tIt(\"should be in progress when one of the conditions is in progress and other succeed\", func() {\n\t\treadinessProvider := getTestReadinessProvider()\n\t\treadinessProvider.Spec.Conditions = append(readinessProvider.Spec.Conditions, corev1alpha2.ReadinessProviderCondition{\n\t\t\tName:                       \"cond1\",\n\t\t\tResourceExistenceCondition: &corev1alpha2.ResourceExistenceCondition{},\n\t\t})\n\t\treadinessProvider.Spec.Conditions = append(readinessProvider.Spec.Conditions, corev1alpha2.ReadinessProviderCondition{\n\t\t\tName: \"cond2\",\n\t\t\tResourceExistenceCondition: &corev1alpha2.ResourceExistenceCondition{\n\t\t\t\tKind: \"inprogresskind\",\n\t\t\t},\n\t\t})\n\t\terr := k8sClient.Create(ctx, readinessProvider)\n\t\tExpect(err).To(BeNil())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readinessProvider.Name}, readinessProvider)\n\t\t\treturn err == nil &&\n\t\t\t\treadinessProvider.Status.State == corev1alpha2.ProviderInProgressState &&\n\t\t\t\tlen(readinessProvider.Status.Conditions) == 2 &&\n\t\t\t\treadinessProvider.Status.Conditions[0].State == corev1alpha2.ConditionSuccessState &&\n\t\t\t\treadinessProvider.Status.Conditions[1].State == corev1alpha2.ConditionInProgressState\n\t\t}, timeout, interval).Should(BeTrue())\n\t})\n\n\tIt(\"should fail when one of the conditions does not satisfy and other is in progress\", func() {\n\t\treadinessProvider := getTestReadinessProvider()\n\t\treadinessProvider.Spec.Conditions = append(readinessProvider.Spec.Conditions, corev1alpha2.ReadinessProviderCondition{\n\t\t\tName: \"cond1\",\n\t\t\tResourceExistenceCondition: &corev1alpha2.ResourceExistenceCondition{\n\t\t\t\tKind: \"inprogresskind\",\n\t\t\t},\n\t\t})\n\t\treadinessProvider.Spec.Conditions = append(readinessProvider.Spec.Conditions, corev1alpha2.ReadinessProviderCondition{\n\t\t\tName: \"cond2\",\n\t\t\tResourceExistenceCondition: &corev1alpha2.ResourceExistenceCondition{\n\t\t\t\tKind: \"failurekind\",\n\t\t\t},\n\t\t})\n\t\terr := k8sClient.Create(ctx, readinessProvider)\n\t\tExpect(err).To(BeNil())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readinessProvider.Name}, readinessProvider)\n\t\t\treturn err == nil &&\n\t\t\t\treadinessProvider.Status.State == corev1alpha2.ProviderFailureState &&\n\t\t\t\tlen(readinessProvider.Status.Conditions) == 2 &&\n\t\t\t\treadinessProvider.Status.Conditions[0].State == corev1alpha2.ConditionInProgressState &&\n\t\t\t\treadinessProvider.Status.Conditions[1].State == corev1alpha2.ConditionFailureState\n\t\t}, timeout, interval).Should(BeTrue())\n\t})\n\n\tIt(\"should fail when a newly added condition fails\", func() {\n\t\treadinessProvider := getTestReadinessProvider()\n\t\treadinessProvider.Spec.Conditions = append(readinessProvider.Spec.Conditions, corev1alpha2.ReadinessProviderCondition{\n\t\t\tName:                       \"cond1\",\n\t\t\tResourceExistenceCondition: &corev1alpha2.ResourceExistenceCondition{},\n\t\t})\n\t\terr := k8sClient.Create(ctx, readinessProvider)\n\t\tExpect(err).To(BeNil())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readinessProvider.Name}, readinessProvider)\n\t\t\treturn err == nil &&\n\t\t\t\treadinessProvider.Status.State == corev1alpha2.ProviderSuccessState &&\n\t\t\t\tlen(readinessProvider.Status.Conditions) == 1 &&\n\t\t\t\treadinessProvider.Status.Conditions[0].State == corev1alpha2.ConditionSuccessState\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\treadinessProvider.Spec.Conditions = append(readinessProvider.Spec.Conditions, corev1alpha2.ReadinessProviderCondition{\n\t\t\tName: \"cond1\",\n\t\t\tResourceExistenceCondition: &corev1alpha2.ResourceExistenceCondition{\n\t\t\t\tKind: \"failurekind\",\n\t\t\t},\n\t\t})\n\n\t\terr = k8sClient.Update(ctx, readinessProvider)\n\t\tExpect(err).To(BeNil())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readinessProvider.Name}, readinessProvider)\n\t\t\treturn err == nil &&\n\t\t\t\treadinessProvider.Status.State == corev1alpha2.ProviderFailureState\n\t\t}, timeout, interval).Should(BeTrue())\n\t})\n\n\tIt(\"should fail when a newly added condition does not have any valid condition type\", func() {\n\t\treadinessProvider := getTestReadinessProvider()\n\t\treadinessProvider.Spec.Conditions = append(readinessProvider.Spec.Conditions, corev1alpha2.ReadinessProviderCondition{\n\t\t\tName:                       \"cond1\",\n\t\t\tResourceExistenceCondition: &corev1alpha2.ResourceExistenceCondition{},\n\t\t})\n\t\terr := k8sClient.Create(ctx, readinessProvider)\n\t\tExpect(err).To(BeNil())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readinessProvider.Name}, readinessProvider)\n\t\t\treturn err == nil &&\n\t\t\t\treadinessProvider.Status.State == corev1alpha2.ProviderSuccessState &&\n\t\t\t\tlen(readinessProvider.Status.Conditions) == 1 &&\n\t\t\t\treadinessProvider.Status.Conditions[0].State == corev1alpha2.ConditionSuccessState\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\treadinessProvider.Spec.Conditions = append(readinessProvider.Spec.Conditions, corev1alpha2.ReadinessProviderCondition{\n\t\t\tName: \"cond1\",\n\t\t})\n\n\t\terr = k8sClient.Update(ctx, readinessProvider)\n\t\tExpect(err).NotTo(BeNil())\n\t})\n\n\tIt(\"should succeed when a readiness provider is deleted\", func() {\n\t\treadinessProvider := getTestReadinessProvider()\n\t\treadinessProvider.Spec.Conditions = append(readinessProvider.Spec.Conditions, corev1alpha2.ReadinessProviderCondition{\n\t\t\tName:                       \"cond1\",\n\t\t\tResourceExistenceCondition: &corev1alpha2.ResourceExistenceCondition{},\n\t\t})\n\t\terr := k8sClient.Create(ctx, readinessProvider)\n\t\tExpect(err).To(BeNil())\n\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readinessProvider.Name}, readinessProvider)\n\t\t\treturn err == nil &&\n\t\t\t\treadinessProvider.Status.State == corev1alpha2.ProviderSuccessState &&\n\t\t\t\tlen(readinessProvider.Status.Conditions) == 1 &&\n\t\t\t\treadinessProvider.Status.Conditions[0].State == corev1alpha2.ConditionSuccessState\n\t\t}, timeout, interval).Should(BeTrue())\n\n\t\terr = k8sClient.Delete(ctx, readinessProvider)\n\t\tExpect(err).To(BeNil())\n\t})\n\n\tIt(\"should fail when service account details are partial\", func() {\n\t\treadinessProvider := getTestReadinessProvider()\n\t\treadinessProvider.Spec.ServiceAccountRef = &corev1alpha2.ServiceAccountRef{\n\t\t\tName:      \"default\",\n\t\t\tNamespace: \"\",\n\t\t}\n\t\terr := k8sClient.Create(ctx, readinessProvider)\n\t\tExpect(err).NotTo(BeNil())\n\t})\n\n\tIt(\"should fail when service account does not exist\", func() {\n\t\treadinessProvider := getTestReadinessProvider()\n\t\treadinessProvider.Spec.ServiceAccountRef = &corev1alpha2.ServiceAccountRef{\n\t\t\tName:      \"non-existent-sa\",\n\t\t\tNamespace: \"default\",\n\t\t}\n\t\terr := k8sClient.Create(ctx, readinessProvider)\n\t\tExpect(err).NotTo(BeNil())\n\t})\n\n\tIt(\"should fail when service account token cannot be retrieved\", func() {\n\t\tsa := corev1.ServiceAccount{\n\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\tName:      \"sa-to-be-deleted\",\n\t\t\t\tNamespace: \"default\",\n\t\t\t},\n\t\t}\n\n\t\t// Create readiness provider\n\t\treadinessProvider := getTestReadinessProvider()\n\t\treadinessProvider.Spec.ServiceAccountRef = &corev1alpha2.ServiceAccountRef{\n\t\t\tName:      sa.ObjectMeta.Name,\n\t\t\tNamespace: sa.ObjectMeta.Namespace,\n\t\t}\n\t\treadinessProvider.Spec.Conditions = append(readinessProvider.Spec.Conditions, corev1alpha2.ReadinessProviderCondition{\n\t\t\tName:                       \"cond1\",\n\t\t\tResourceExistenceCondition: &corev1alpha2.ResourceExistenceCondition{},\n\t\t})\n\t\terr := k8sClient.Create(ctx, readinessProvider)\n\t\tExpect(err).To(BeNil())\n\n\t\t// Delete the service account which leads to failure in token generation\n\t\terr = k8sClient.Delete(ctx, &sa)\n\t\tExpect(err).To(BeNil())\n\n\t\tvar status corev1alpha2.ReadinessProviderStatus\n\t\tEventually(func() bool {\n\t\t\terr := k8sClient.Get(ctx, types.NamespacedName{Name: readinessProvider.Name}, readinessProvider)\n\t\t\tstatus = readinessProvider.Status\n\t\t\treturn err == nil &&\n\t\t\t\treadinessProvider.Status.State == corev1alpha2.ProviderFailureState\n\t\t}, timeout, interval).Should(BeTrue())\n\t\tExpect(len(status.Conditions)).To(Equal(0))\n\t})\n\n})\n\nfunc getTestReadinessProvider() *corev1alpha2.ReadinessProvider {\n\treturn &corev1alpha2.ReadinessProvider{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tGenerateName: \"test-readiness-provider-\",\n\t\t},\n\t\tSpec: corev1alpha2.ReadinessProviderSpec{\n\t\t\tConditions:        []corev1alpha2.ReadinessProviderCondition{},\n\t\t\tCheckRefs:         []string{},\n\t\t\tServiceAccountRef: nil,\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "readiness/controller/pkg/readinessprovider/testdata/rbac.yaml",
    "content": "---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: sa-to-be-deleted\n  namespace: default\n---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: pod-sa\n  namespace: default\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n  name: pod-read-role\n  namespace: default\nrules:\n  - apiGroups:\n    - \"\"\n    resources:\n      - pods\n    verbs:\n      - get\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: RoleBinding\nmetadata:\n  name: pod-read-rolebinding\n  namespace: default\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: Role\n  name: pod-read-role\nsubjects:\n  - kind: ServiceAccount\n    name: pod-sa\n    namespace: default\n"
  },
  {
    "path": "readiness/controller/pkg/readinessprovider/testdata/webhook.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: tanzu-readinessprovider-webhook-service\n  namespace: default\nspec:\n  type: ExternalName\n  externalName: 127.0.0.1\n---\napiVersion: admissionregistration.k8s.io/v1\nkind: ValidatingWebhookConfiguration\nmetadata:\n  name: tanzu-readinessprovider-validating-webhook-core\n  annotations:\nwebhooks:\n  - admissionReviewVersions:\n      - v1beta1\n    clientConfig:\n      caBundle: Cg==\n      service:\n        name: tanzu-readinessprovider-webhook-service\n        namespace: default\n        path: /validate-core-tanzu-vmware-com-v1alpha2-readinessprovider\n        port: 9443\n    failurePolicy: Fail\n    name: readinessproviders.core.tanzu.vmware.com\n    rules:\n      - apiGroups:\n          - core.tanzu.vmware.com\n        apiVersions:\n          - v1alpha2\n        operations:\n          - CREATE\n          - UPDATE\n        resources:\n          - readinessproviders\n    sideEffects: None\n"
  },
  {
    "path": "readiness/e2e/doc.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package e2e has the end-to-end tests for readiness framework\npackage e2e\n"
  },
  {
    "path": "readiness/e2e/e2e_test.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage e2e\n\nimport (\n\t\"testing\"\n\n\t\"github.com/onsi/ginkgo\"\n\t\"github.com/onsi/gomega\"\n\tv1 \"k8s.io/api/core/v1\"\n\trbacv1 \"k8s.io/api/rbac/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\tutilruntime \"k8s.io/apimachinery/pkg/util/runtime\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client/config\"\n\n\tcorev1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n)\n\nvar (\n\tscheme = runtime.NewScheme()\n\tcl     client.Client\n)\n\nfunc init() {\n\tutilruntime.Must(corev1alpha2.AddToScheme(scheme))\n\tutilruntime.Must(v1.AddToScheme(scheme))\n\tutilruntime.Must(rbacv1.AddToScheme(scheme))\n}\n\nfunc TestE2E(t *testing.T) {\n\tdefer ginkgo.GinkgoRecover()\n\n\tvar err error\n\tcl, err = client.New(config.GetConfigOrDie(), client.Options{Scheme: scheme})\n\tif err != nil {\n\t\tt.Error(err)\n\t}\n\n\tgomega.RegisterFailHandler(ginkgo.Fail)\n\tginkgo.RunSpecs(t, \"readiness e2e suite\")\n}\n"
  },
  {
    "path": "readiness/e2e/go.mod",
    "content": "module github.com/vmware-tanzu/tanzu-framework/readiness/e2e\n\ngo 1.19\n\nreplace github.com/vmware-tanzu/tanzu-framework/apis/core => ../../apis/core\n\nrequire (\n\tgithub.com/onsi/ginkgo v1.16.5\n\tgithub.com/onsi/gomega v1.27.8\n\tgithub.com/vmware-tanzu/tanzu-framework/apis/core v0.0.0-00010101000000-000000000000\n\tk8s.io/api v0.24.2\n\tk8s.io/apimachinery v0.24.2\n\tsigs.k8s.io/controller-runtime v0.12.3\n)\n\nrequire (\n\tgithub.com/PuerkitoBio/purell v1.1.1 // indirect\n\tgithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.1.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.1 // indirect\n\tgithub.com/emicklei/go-restful/v3 v3.9.0 // indirect\n\tgithub.com/evanphx/json-patch v5.6.0+incompatible // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/go-logr/logr v1.2.4 // indirect\n\tgithub.com/go-openapi/jsonpointer v0.19.5 // indirect\n\tgithub.com/go-openapi/jsonreference v0.19.6 // indirect\n\tgithub.com/go-openapi/swag v0.21.1 // indirect\n\tgithub.com/gogo/protobuf v1.3.2 // indirect\n\tgithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect\n\tgithub.com/golang/protobuf v1.5.3 // indirect\n\tgithub.com/google/gnostic v0.5.7-v3refs // indirect\n\tgithub.com/google/go-cmp v0.5.9 // indirect\n\tgithub.com/google/gofuzz v1.2.0 // indirect\n\tgithub.com/google/uuid v1.3.0 // indirect\n\tgithub.com/imdario/mergo v0.3.12 // indirect\n\tgithub.com/josharian/intern v1.0.0 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/mailru/easyjson v0.7.7 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect\n\tgithub.com/nxadm/tail v1.4.8 // indirect\n\tgithub.com/pkg/errors v0.9.1 // indirect\n\tgithub.com/prometheus/client_golang v1.12.2 // indirect\n\tgithub.com/prometheus/client_model v0.2.0 // indirect\n\tgithub.com/prometheus/common v0.32.1 // indirect\n\tgithub.com/prometheus/procfs v0.7.3 // indirect\n\tgithub.com/spf13/pflag v1.0.5 // indirect\n\tgolang.org/x/net v0.10.0 // indirect\n\tgolang.org/x/oauth2 v0.3.0 // indirect\n\tgolang.org/x/sys v0.8.0 // indirect\n\tgolang.org/x/term v0.8.0 // indirect\n\tgolang.org/x/text v0.9.0 // indirect\n\tgolang.org/x/time v0.3.0 // indirect\n\tgomodules.xyz/jsonpatch/v2 v2.2.0 // indirect\n\tgoogle.golang.org/appengine v1.6.7 // indirect\n\tgoogle.golang.org/protobuf v1.28.1 // indirect\n\tgopkg.in/inf.v0 v0.9.1 // indirect\n\tgopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect\n\tgopkg.in/yaml.v2 v2.4.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tk8s.io/apiextensions-apiserver v0.24.2 // indirect\n\tk8s.io/client-go v0.24.2 // indirect\n\tk8s.io/component-base v0.24.2 // indirect\n\tk8s.io/klog/v2 v2.70.1 // indirect\n\tk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect\n\tk8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect\n\tsigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect\n\tsigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect\n\tsigs.k8s.io/yaml v1.3.0 // indirect\n)\n"
  },
  {
    "path": "readiness/e2e/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=\ncloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=\ncloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=\ncloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=\ncloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngithub.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=\ngithub.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=\ngithub.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA=\ngithub.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M=\ngithub.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=\ngithub.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=\ngithub.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=\ngithub.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=\ngithub.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=\ngithub.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=\ngithub.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=\ngithub.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=\ngithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=\ngithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=\ngithub.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=\ngithub.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=\ngithub.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=\ngithub.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=\ngithub.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=\ngithub.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=\ngithub.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=\ngithub.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=\ngithub.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=\ngithub.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=\ngithub.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=\ngithub.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=\ngithub.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=\ngithub.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=\ngithub.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=\ngithub.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=\ngithub.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=\ngithub.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=\ngithub.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=\ngithub.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=\ngithub.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=\ngithub.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=\ngithub.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=\ngithub.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=\ngithub.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=\ngithub.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE=\ngithub.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ=\ngithub.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=\ngithub.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U=\ngithub.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=\ngithub.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=\ngithub.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=\ngithub.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=\ngithub.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg=\ngithub.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=\ngithub.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=\ngithub.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=\ngithub.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=\ngithub.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk=\ngithub.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro=\ngithub.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=\ngithub.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=\ngithub.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg=\ngithub.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs=\ngithub.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns=\ngithub.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=\ngithub.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=\ngithub.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU=\ngithub.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=\ngithub.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=\ngithub.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=\ngithub.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=\ngithub.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\ngithub.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=\ngithub.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w=\ngithub.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA=\ngithub.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=\ngithub.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=\ngithub.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=\ngithub.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=\ngithub.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=\ngithub.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=\ngithub.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=\ngithub.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=\ngithub.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=\ngithub.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=\ngithub.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=\ngithub.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=\ngithub.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=\ngithub.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=\ngithub.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=\ngithub.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=\ngithub.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=\ngithub.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=\ngithub.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=\ngithub.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=\ngithub.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=\ngithub.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=\ngithub.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=\ngithub.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=\ngithub.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=\ngithub.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=\ngithub.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=\ngithub.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=\ngithub.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=\ngithub.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=\ngithub.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=\ngithub.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=\ngithub.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=\ngithub.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=\ngithub.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=\ngithub.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=\ngithub.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=\ngithub.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=\ngithub.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=\ngithub.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=\ngithub.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=\ngithub.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=\ngithub.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=\ngithub.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=\ngithub.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=\ngithub.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=\ngithub.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=\ngithub.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=\ngithub.com/onsi/ginkgo/v2 v2.9.7 h1:06xGQy5www2oN160RtEZoTvnP2sPhEfePYmCDc2szss=\ngithub.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=\ngithub.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=\ngithub.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=\ngithub.com/onsi/gomega v1.27.8 h1:gegWiwZjBsf2DgiSbf5hpokZ98JVDMcWkUiigk6/KXc=\ngithub.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ=\ngithub.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=\ngithub.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=\ngithub.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=\ngithub.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=\ngithub.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34=\ngithub.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=\ngithub.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=\ngithub.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=\ngithub.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=\ngithub.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=\ngithub.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=\ngithub.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=\ngithub.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0=\ngithub.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=\ngithub.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=\ngithub.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=\ngithub.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=\ngithub.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=\ngithub.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=\ngithub.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=\ngithub.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=\ngithub.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=\ngithub.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=\ngithub.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=\ngithub.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=\ngithub.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=\ngithub.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=\ngithub.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=\ngithub.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngo.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=\ngo.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=\ngo.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=\ngo.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=\ngo.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=\ngo.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=\ngo.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=\ngo.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0=\ngo.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q=\ngo.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE=\ngo.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc=\ngo.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=\ngo.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=\ngo.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=\ngo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E=\ngo.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=\ngo.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=\ngo.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM=\ngo.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=\ngo.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=\ngo.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=\ngo.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE=\ngo.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE=\ngo.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=\ngo.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=\ngo.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=\ngo.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=\ngo.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=\ngo.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=\ngo.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=\ngo.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=\ngo.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=\ngo.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=\ngo.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=\ngo.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=\ngo.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=\ngo.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8=\ngolang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=\ngolang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=\ngolang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=\ngolang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY=\ngomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=\ngoogle.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=\ngoogle.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=\ngoogle.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=\ngoogle.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=\ngoogle.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=\ngoogle.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=\ngoogle.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=\ngoogle.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=\ngoogle.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=\ngoogle.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=\ngoogle.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\ngoogle.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\ngoogle.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=\ngopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=\ngopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=\ngopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=\ngopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=\ngopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=\ngopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=\ngotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nk8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI=\nk8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg=\nk8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k=\nk8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ=\nk8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM=\nk8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=\nk8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI=\nk8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA=\nk8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30=\nk8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w=\nk8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU=\nk8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM=\nk8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=\nk8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=\nk8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=\nk8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=\nk8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=\nk8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ=\nk8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=\nk8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk=\nk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s=\nk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4=\nk8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=\nk8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc=\nk8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw=\nsigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio=\nsigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0=\nsigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y=\nsigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY=\nsigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=\nsigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=\nsigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=\nsigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=\n"
  },
  {
    "path": "readiness/e2e/suite_test.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage e2e\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t. \"github.com/onsi/ginkgo\"\n\t. \"github.com/onsi/gomega\"\n\tcorev1 \"k8s.io/api/core/v1\"\n\trbacv1 \"k8s.io/api/rbac/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/types\"\n\n\tv1alpha2 \"github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2\"\n)\n\nvar (\n\ttimeout         = 2 * time.Minute\n\tpollingInterval = 50 * time.Millisecond\n\ttestNamespace   = \"default\"\n)\n\nvar _ = Describe(\"Readiness\", func() {\n\tDescribe(\"with no checks\", func() {\n\t\tAfterEach(func() {\n\t\t\tdeleteReadinesses(\"readiness-without-checks\")\n\t\t})\n\n\t\terr := cl.Create(context.TODO(), &v1alpha2.Readiness{\n\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\tName: \"readiness-without-checks\",\n\t\t\t},\n\t\t\tSpec: v1alpha2.ReadinessSpec{\n\t\t\t\tChecks: []v1alpha2.Check{},\n\t\t\t},\n\t\t})\n\t\tExpect(err).To(BeNil())\n\n\t\tIt(\"Should reconcile to ready state\", func() {\n\t\t\tEventually(func() bool {\n\t\t\t\treadiness := &v1alpha2.Readiness{}\n\t\t\t\terr := cl.Get(context.TODO(), types.NamespacedName{Name: \"readiness-without-checks\"}, readiness)\n\t\t\t\treturn err == nil && readiness.Status.Ready == true\n\t\t\t}).WithTimeout(5 * timeout).WithPolling(pollingInterval).Should(BeTrue())\n\t\t})\n\t})\n\n\tDescribe(\"with one check and one provider\", func() {\n\t\tContext(\"after creating the readiness\", func() {\n\t\t\tIt(\"the readiness resource should be reconciled to non-ready state\", func() {\n\t\t\t\terr := cl.Create(context.TODO(), &v1alpha2.Readiness{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName: \"readiness-with-one-check-1\",\n\t\t\t\t\t},\n\t\t\t\t\tSpec: v1alpha2.ReadinessSpec{\n\t\t\t\t\t\tChecks: []v1alpha2.Check{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName:     \"check1\",\n\t\t\t\t\t\t\t\tType:     \"basic\",\n\t\t\t\t\t\t\t\tCategory: \"test\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tExpect(err).To(BeNil())\n\n\t\t\t\tEventually(func() bool {\n\t\t\t\t\treadiness := &v1alpha2.Readiness{}\n\t\t\t\t\terr := cl.Get(context.TODO(), types.NamespacedName{Name: \"readiness-with-one-check-1\"}, readiness)\n\t\t\t\t\treturn err == nil && readiness.Status.Ready == false\n\t\t\t\t}).WithTimeout(timeout).WithPolling(pollingInterval).Should(BeTrue())\n\t\t\t})\n\t\t})\n\n\t\tContext(\"after creating the readiness provider with no conditions\", func() {\n\t\t\tAfterEach(func() {\n\t\t\t\tdeleteReadinesses(\"readiness-with-one-check-1\")\n\t\t\t\tdeleteReadinessProviders(\"check-1-provider\")\n\t\t\t})\n\n\t\t\tIt(\"the readiness resource should be reconciled to ready state\", func() {\n\t\t\t\tEventually(func() bool {\n\t\t\t\t\terr := cl.Create(context.TODO(), &v1alpha2.ReadinessProvider{\n\t\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\t\tName: \"check-1-provider\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tSpec: v1alpha2.ReadinessProviderSpec{\n\t\t\t\t\t\t\tCheckRefs:  []string{\"check1\"},\n\t\t\t\t\t\t\tConditions: []v1alpha2.ReadinessProviderCondition{},\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\treturn err == nil\n\t\t\t\t}).WithTimeout(timeout).WithPolling(pollingInterval).Should(BeTrue())\n\n\t\t\t\tEventually(func() bool {\n\t\t\t\t\treadiness := &v1alpha2.Readiness{}\n\t\t\t\t\terr := cl.Get(context.TODO(), types.NamespacedName{Name: \"readiness-with-one-check-1\"}, readiness)\n\t\t\t\t\treturn err == nil && readiness.Status.Ready == true\n\t\t\t\t}).WithTimeout(timeout).WithPolling(pollingInterval).Should(BeTrue())\n\t\t\t})\n\t\t})\n\t})\n\n\tDescribe(\"with one check and two providers\", func() {\n\t\tContext(\"after creating a readiness resource and two providers\", func() {\n\t\t\tIt(\"the readiness resource should be in non-ready state\", func() {\n\t\t\t\terr := cl.Create(context.TODO(), &v1alpha2.Readiness{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName: \"readiness-with-one-check-2\",\n\t\t\t\t\t},\n\t\t\t\t\tSpec: v1alpha2.ReadinessSpec{\n\t\t\t\t\t\tChecks: []v1alpha2.Check{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName:     \"check2\",\n\t\t\t\t\t\t\t\tType:     \"basic\",\n\t\t\t\t\t\t\t\tCategory: \"test\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tExpect(err).To(BeNil())\n\n\t\t\t\terr = cl.Create(context.TODO(), &v1alpha2.ReadinessProvider{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName: \"check-2-provider-1\",\n\t\t\t\t\t},\n\t\t\t\t\tSpec: v1alpha2.ReadinessProviderSpec{\n\t\t\t\t\t\tCheckRefs: []string{\"check2\"},\n\t\t\t\t\t\tConditions: []v1alpha2.ReadinessProviderCondition{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName: \"secret1-exists\",\n\t\t\t\t\t\t\t\tResourceExistenceCondition: &v1alpha2.ResourceExistenceCondition{\n\t\t\t\t\t\t\t\t\tAPIVersion: \"v1\",\n\t\t\t\t\t\t\t\t\tKind:       \"Secret\",\n\t\t\t\t\t\t\t\t\tNamespace:  &testNamespace,\n\t\t\t\t\t\t\t\t\tName:       \"secret1\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\tExpect(err).To(BeNil())\n\n\t\t\t\terr = cl.Create(context.TODO(), &v1alpha2.ReadinessProvider{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName: \"check-2-provider-2\",\n\t\t\t\t\t},\n\t\t\t\t\tSpec: v1alpha2.ReadinessProviderSpec{\n\t\t\t\t\t\tCheckRefs: []string{\"check2\"},\n\t\t\t\t\t\tConditions: []v1alpha2.ReadinessProviderCondition{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName: \"secret2-exists\",\n\t\t\t\t\t\t\t\tResourceExistenceCondition: &v1alpha2.ResourceExistenceCondition{\n\t\t\t\t\t\t\t\t\tAPIVersion: \"v1\",\n\t\t\t\t\t\t\t\t\tKind:       \"Secret\",\n\t\t\t\t\t\t\t\t\tNamespace:  &testNamespace,\n\t\t\t\t\t\t\t\t\tName:       \"secret2\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\tExpect(err).To(BeNil())\n\n\t\t\t\treadiness := &v1alpha2.Readiness{}\n\t\t\t\terr = cl.Get(context.TODO(), types.NamespacedName{Name: \"readiness-with-one-check-2\"}, readiness)\n\t\t\t\tExpect(err).To(BeNil())\n\t\t\t\tExpect(readiness.Status.Ready).To(BeFalse())\n\t\t\t})\n\t\t})\n\n\t\tContext(\"after creating secret1 that activates provider1\", func() {\n\t\t\tIt(\"readiness should be marked as ready\", func() {\n\t\t\t\tsecret := &corev1.Secret{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName:      \"secret1\",\n\t\t\t\t\t\tNamespace: testNamespace,\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\t\terr := cl.Create(context.TODO(), secret)\n\t\t\t\tExpect(err).To(BeNil())\n\n\t\t\t\tEventually(func() bool {\n\t\t\t\t\treadiness := &v1alpha2.Readiness{}\n\t\t\t\t\terr := cl.Get(context.TODO(), types.NamespacedName{Name: \"readiness-with-one-check-2\"}, readiness)\n\t\t\t\t\treturn err == nil && readiness.Status.Ready == true\n\t\t\t\t}).WithTimeout(timeout).WithPolling(pollingInterval).Should(BeTrue())\n\n\t\t\t})\n\n\t\t})\n\n\t\tContext(\"after deleting secret1 that deactivates provider1\", func() {\n\t\t\tBeforeEach(func() {\n\t\t\t\tdeleteSecrets(\"secret1\")\n\t\t\t})\n\n\t\t\tIt(\"readiness resource should be marked as ready\", func() {\n\t\t\t\tEventually(func() bool {\n\t\t\t\t\treadiness := &v1alpha2.Readiness{}\n\t\t\t\t\terr := cl.Get(context.TODO(), types.NamespacedName{Name: \"readiness-with-one-check-2\"}, readiness)\n\t\t\t\t\treturn err == nil && readiness.Status.Ready == false\n\t\t\t\t}).WithTimeout(timeout).WithPolling(pollingInterval).Should(BeTrue())\n\n\t\t\t})\n\t\t})\n\n\t\tContext(\"after creating secret2 that activates provider2\", func() {\n\t\t\tAfterEach(func() {\n\t\t\t\tdeleteSecrets(\"secret2\")\n\t\t\t\tdeleteReadinesses(\"readiness-with-one-check-2\")\n\t\t\t\tdeleteReadinessProviders(\"check-2-provider-1\", \"check-2-provider-2\")\n\t\t\t})\n\n\t\t\tIt(\"readiness resource should be marked as ready\", func() {\n\t\t\t\tsecret := &corev1.Secret{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName:      \"secret2\",\n\t\t\t\t\t\tNamespace: testNamespace,\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\t\terr := cl.Create(context.TODO(), secret)\n\t\t\t\tExpect(err).To(BeNil())\n\n\t\t\t\tEventually(func() bool {\n\t\t\t\t\treadiness := &v1alpha2.Readiness{}\n\t\t\t\t\terr := cl.Get(context.TODO(), types.NamespacedName{Name: \"readiness-with-one-check-2\"}, readiness)\n\t\t\t\t\treturn err == nil && readiness.Status.Ready == true\n\t\t\t\t}).WithTimeout(timeout).WithPolling(pollingInterval).Should(BeTrue())\n\n\t\t\t})\n\t\t})\n\t})\n\n\tDescribe(\"Multiple readiness with multiple checks\", func() {\n\t\tContext(\"creating readines and readiness provider resources\", func() {\n\t\t\tIt(\"should be successful\", func() {\n\t\t\t\terr := cl.Create(context.TODO(), &v1alpha2.Readiness{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName: \"dev-readiness\",\n\t\t\t\t\t},\n\t\t\t\t\tSpec: v1alpha2.ReadinessSpec{\n\t\t\t\t\t\tChecks: []v1alpha2.Check{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName:     \"readinesscheck1\",\n\t\t\t\t\t\t\t\tType:     \"basic\",\n\t\t\t\t\t\t\t\tCategory: \"test\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tExpect(err).To(BeNil())\n\n\t\t\t\terr = cl.Create(context.TODO(), &v1alpha2.Readiness{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName: \"integration-readiness\",\n\t\t\t\t\t},\n\t\t\t\t\tSpec: v1alpha2.ReadinessSpec{\n\t\t\t\t\t\tChecks: []v1alpha2.Check{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName:     \"readinesscheck1\",\n\t\t\t\t\t\t\t\tType:     \"basic\",\n\t\t\t\t\t\t\t\tCategory: \"test\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName:     \"readinesscheck2\",\n\t\t\t\t\t\t\t\tType:     \"basic\",\n\t\t\t\t\t\t\t\tCategory: \"test\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tExpect(err).To(BeNil())\n\n\t\t\t\terr = cl.Create(context.TODO(), &v1alpha2.Readiness{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName: \"prod-readiness\",\n\t\t\t\t\t},\n\t\t\t\t\tSpec: v1alpha2.ReadinessSpec{\n\t\t\t\t\t\tChecks: []v1alpha2.Check{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName:     \"readinesscheck1\",\n\t\t\t\t\t\t\t\tType:     \"basic\",\n\t\t\t\t\t\t\t\tCategory: \"test\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName:     \"readinesscheck2\",\n\t\t\t\t\t\t\t\tType:     \"basic\",\n\t\t\t\t\t\t\t\tCategory: \"test\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName:     \"readinesscheck3\",\n\t\t\t\t\t\t\t\tType:     \"basic\",\n\t\t\t\t\t\t\t\tCategory: \"test\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tExpect(err).To(BeNil())\n\n\t\t\t\terr = cl.Create(context.TODO(), &v1alpha2.ReadinessProvider{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName: \"readinessprovider1\",\n\t\t\t\t\t},\n\t\t\t\t\tSpec: v1alpha2.ReadinessProviderSpec{\n\t\t\t\t\t\tCheckRefs: []string{\"readinesscheck1\"},\n\t\t\t\t\t\tConditions: []v1alpha2.ReadinessProviderCondition{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName: \"secret1-exists\",\n\t\t\t\t\t\t\t\tResourceExistenceCondition: &v1alpha2.ResourceExistenceCondition{\n\t\t\t\t\t\t\t\t\tAPIVersion: \"v1\",\n\t\t\t\t\t\t\t\t\tKind:       \"Secret\",\n\t\t\t\t\t\t\t\t\tNamespace:  &testNamespace,\n\t\t\t\t\t\t\t\t\tName:       \"readiness-secret1\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\tExpect(err).To(BeNil())\n\n\t\t\t\terr = cl.Create(context.TODO(), &v1alpha2.ReadinessProvider{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName: \"readinessprovider2\",\n\t\t\t\t\t},\n\t\t\t\t\tSpec: v1alpha2.ReadinessProviderSpec{\n\t\t\t\t\t\tCheckRefs: []string{\"readinesscheck2\"},\n\t\t\t\t\t\tConditions: []v1alpha2.ReadinessProviderCondition{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName: \"secret2-exists\",\n\t\t\t\t\t\t\t\tResourceExistenceCondition: &v1alpha2.ResourceExistenceCondition{\n\t\t\t\t\t\t\t\t\tAPIVersion: \"v1\",\n\t\t\t\t\t\t\t\t\tKind:       \"Secret\",\n\t\t\t\t\t\t\t\t\tNamespace:  &testNamespace,\n\t\t\t\t\t\t\t\t\tName:       \"readiness-secret2\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\tExpect(err).To(BeNil())\n\n\t\t\t\terr = cl.Create(context.TODO(), &v1alpha2.ReadinessProvider{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName: \"readinessprovider3\",\n\t\t\t\t\t},\n\t\t\t\t\tSpec: v1alpha2.ReadinessProviderSpec{\n\t\t\t\t\t\tCheckRefs: []string{\"readinesscheck3\"},\n\t\t\t\t\t\tConditions: []v1alpha2.ReadinessProviderCondition{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName: \"secret3-exists\",\n\t\t\t\t\t\t\t\tResourceExistenceCondition: &v1alpha2.ResourceExistenceCondition{\n\t\t\t\t\t\t\t\t\tAPIVersion: \"v1\",\n\t\t\t\t\t\t\t\t\tKind:       \"Secret\",\n\t\t\t\t\t\t\t\t\tNamespace:  &testNamespace,\n\t\t\t\t\t\t\t\t\tName:       \"readiness-secret3\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\tExpect(err).To(BeNil())\n\t\t\t})\n\t\t})\n\n\t\tContext(\"after the resources are created\", func() {\n\t\t\tIt(\"none of the readiness should be ready\", func() {\n\t\t\t\treadiness := &v1alpha2.Readiness{}\n\t\t\t\terr := cl.Get(context.TODO(), types.NamespacedName{Name: \"dev-readiness\"}, readiness)\n\t\t\t\tExpect(err).To(BeNil())\n\t\t\t\tExpect(readiness.Status.Ready).To(BeFalse())\n\n\t\t\t\terr = cl.Get(context.TODO(), types.NamespacedName{Name: \"integration-readiness\"}, readiness)\n\t\t\t\tExpect(err).To(BeNil())\n\t\t\t\tExpect(readiness.Status.Ready).To(BeFalse())\n\n\t\t\t\terr = cl.Get(context.TODO(), types.NamespacedName{Name: \"prod-readiness\"}, readiness)\n\t\t\t\tExpect(err).To(BeNil())\n\t\t\t\tExpect(readiness.Status.Ready).To(BeFalse())\n\t\t\t})\n\t\t})\n\n\t\tContext(\"after provider1 is activated by creating secret1\", func() {\n\t\t\tIt(\"dev readiness should be marked as ready\", func() {\n\t\t\t\tsecret := &corev1.Secret{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName:      \"readiness-secret1\",\n\t\t\t\t\t\tNamespace: testNamespace,\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\t\terr := cl.Create(context.TODO(), secret)\n\t\t\t\tExpect(err).To(BeNil())\n\n\t\t\t\tEventually(func() bool {\n\t\t\t\t\tdevReadiness := &v1alpha2.Readiness{}\n\t\t\t\t\tdevErr := cl.Get(context.TODO(), types.NamespacedName{Name: \"dev-readiness\"}, devReadiness)\n\n\t\t\t\t\tintReadiness := &v1alpha2.Readiness{}\n\t\t\t\t\tintErr := cl.Get(context.TODO(), types.NamespacedName{Name: \"integration-readiness\"}, intReadiness)\n\n\t\t\t\t\tprodReadiness := &v1alpha2.Readiness{}\n\t\t\t\t\tprodErr := cl.Get(context.TODO(), types.NamespacedName{Name: \"prod-readiness\"}, prodReadiness)\n\n\t\t\t\t\treturn devErr == nil && intErr == nil && prodErr == nil && devReadiness.Status.Ready && !intReadiness.Status.Ready && !prodReadiness.Status.Ready\n\t\t\t\t}).WithTimeout(timeout).WithPolling(pollingInterval).Should(BeTrue())\n\t\t\t})\n\t\t})\n\n\t\tContext(\"after provider2 is activated by creating secret2\", func() {\n\t\t\tIt(\"dev and int readiness should converge to ready state\", func() {\n\t\t\t\tsecret := &corev1.Secret{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName:      \"readiness-secret2\",\n\t\t\t\t\t\tNamespace: testNamespace,\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\t\terr := cl.Create(context.TODO(), secret)\n\t\t\t\tExpect(err).To(BeNil())\n\n\t\t\t\tEventually(func() bool {\n\t\t\t\t\tdevReadiness := &v1alpha2.Readiness{}\n\t\t\t\t\tdevErr := cl.Get(context.TODO(), types.NamespacedName{Name: \"dev-readiness\"}, devReadiness)\n\n\t\t\t\t\tintReadiness := &v1alpha2.Readiness{}\n\t\t\t\t\tintErr := cl.Get(context.TODO(), types.NamespacedName{Name: \"integration-readiness\"}, intReadiness)\n\n\t\t\t\t\tprodReadiness := &v1alpha2.Readiness{}\n\t\t\t\t\tprodErr := cl.Get(context.TODO(), types.NamespacedName{Name: \"prod-readiness\"}, prodReadiness)\n\n\t\t\t\t\treturn devErr == nil && intErr == nil && prodErr == nil && devReadiness.Status.Ready && intReadiness.Status.Ready && !prodReadiness.Status.Ready\n\t\t\t\t}).WithTimeout(timeout).WithPolling(pollingInterval).Should(BeTrue())\n\t\t\t})\n\t\t})\n\n\t\tContext(\"after provider3 is activated by creating secret3\", func() {\n\t\t\tAfterEach(func() {\n\t\t\t\tdeleteReadinesses(\"dev-readiness\", \"integration-readiness\", \"prod-readiness\")\n\t\t\t\tdeleteReadinessProviders(\"readinessprovider1\", \"readinessprovider2\", \"readinessprovider3\")\n\t\t\t\tdeleteSecrets(\"readiness-secret1\", \"readiness-secret2\", \"readiness-secret3\")\n\t\t\t})\n\n\t\t\tIt(\"dev, int and prod readiness should converge to ready state\", func() {\n\t\t\t\tsecret := &corev1.Secret{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName:      \"readiness-secret3\",\n\t\t\t\t\t\tNamespace: testNamespace,\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\t\terr := cl.Create(context.TODO(), secret)\n\t\t\t\tExpect(err).To(BeNil())\n\n\t\t\t\tEventually(func() bool {\n\t\t\t\t\tdevReadiness := &v1alpha2.Readiness{}\n\t\t\t\t\tdevErr := cl.Get(context.TODO(), types.NamespacedName{Name: \"dev-readiness\"}, devReadiness)\n\n\t\t\t\t\tintReadiness := &v1alpha2.Readiness{}\n\t\t\t\t\tintErr := cl.Get(context.TODO(), types.NamespacedName{Name: \"integration-readiness\"}, intReadiness)\n\n\t\t\t\t\tprodReadiness := &v1alpha2.Readiness{}\n\t\t\t\t\tprodErr := cl.Get(context.TODO(), types.NamespacedName{Name: \"prod-readiness\"}, prodReadiness)\n\n\t\t\t\t\treturn devErr == nil && intErr == nil && prodErr == nil && devReadiness.Status.Ready && intReadiness.Status.Ready && prodReadiness.Status.Ready\n\t\t\t\t}).WithTimeout(timeout).WithPolling(pollingInterval).Should(BeTrue())\n\t\t\t})\n\t\t})\n\t})\n\n\tDescribe(\"Providers that require additional roles\", func() {\n\t\tContext(\"creating a provider that access config maps\", func() {\n\t\t\tIt(\"should reconcile to failed state as the default service account does not have required roles\", func() {\n\t\t\t\terr := cl.Create(context.TODO(), &corev1.ConfigMap{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName:      \"readiness-config1\",\n\t\t\t\t\t\tNamespace: \"default\",\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\tExpect(err).To(BeNil())\n\n\t\t\t\terr = cl.Create(context.TODO(), &v1alpha2.ReadinessProvider{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName: \"configprovider\",\n\t\t\t\t\t},\n\t\t\t\t\tSpec: v1alpha2.ReadinessProviderSpec{\n\t\t\t\t\t\tCheckRefs: []string{\"readinesscheck1\"},\n\t\t\t\t\t\tConditions: []v1alpha2.ReadinessProviderCondition{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName: \"config1-exists\",\n\t\t\t\t\t\t\t\tResourceExistenceCondition: &v1alpha2.ResourceExistenceCondition{\n\t\t\t\t\t\t\t\t\tAPIVersion: \"v1\",\n\t\t\t\t\t\t\t\t\tKind:       \"ConfigMap\",\n\t\t\t\t\t\t\t\t\tNamespace:  &testNamespace,\n\t\t\t\t\t\t\t\t\tName:       \"readiness-config1\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\tExpect(err).To(BeNil())\n\n\t\t\t\tEventually(func() bool {\n\t\t\t\t\tprovider := &v1alpha2.ReadinessProvider{}\n\t\t\t\t\terr := cl.Get(context.TODO(), types.NamespacedName{Name: \"configprovider\"}, provider)\n\n\t\t\t\t\treturn err == nil &&\n\t\t\t\t\t\tprovider.Status.State == v1alpha2.ProviderFailureState &&\n\t\t\t\t\t\tlen(provider.Status.Conditions) == 1 &&\n\t\t\t\t\t\tprovider.Status.Conditions[0].Message == \"configmaps \\\"readiness-config1\\\" is forbidden: User \\\"system:serviceaccount:default:tanzu-readiness-manager-sa\\\" cannot get resource \\\"configmaps\\\" in API group \\\"\\\" in the namespace \\\"default\\\"\"\n\t\t\t\t}).WithTimeout(timeout).WithPolling(pollingInterval).Should(BeTrue())\n\t\t\t})\n\t\t})\n\n\t\tContext(\"updating provider with required service account\", func() {\n\t\t\tAfterEach(func() {\n\t\t\t\tdeleteReadinessProviders(\"configprovider\")\n\t\t\t\tdeleteResources(metav1.TypeMeta{\n\t\t\t\t\tKind:       \"ConfigMap\",\n\t\t\t\t\tAPIVersion: \"v1\",\n\t\t\t\t}, \"readiness-config1\")\n\t\t\t\tdeleteResources(metav1.TypeMeta{\n\t\t\t\t\tKind:       \"ServiceAccount\",\n\t\t\t\t\tAPIVersion: \"v1\",\n\t\t\t\t}, \"test-sa\")\n\t\t\t\tdeleteResources(metav1.TypeMeta{\n\t\t\t\t\tKind:       \"ClusterRole\",\n\t\t\t\t\tAPIVersion: \"rbac.authorization.k8s.io/v1\",\n\t\t\t\t}, \"test-cluster-role\")\n\t\t\t\tdeleteResources(metav1.TypeMeta{\n\t\t\t\t\tKind:       \"ClusterRoleBinding\",\n\t\t\t\t\tAPIVersion: \"rbac.authorization.k8s.io/v1\",\n\t\t\t\t}, \"test-cluster-role-binding\")\n\n\t\t\t})\n\n\t\t\tIt(\"provider should reconcile to success state\", func() {\n\t\t\t\terr := cl.Create(context.TODO(), &rbacv1.ClusterRole{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName: \"test-cluster-role\",\n\t\t\t\t\t},\n\t\t\t\t\tRules: []rbacv1.PolicyRule{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tAPIGroups: []string{\"\"},\n\t\t\t\t\t\t\tResources: []string{\"configmaps\"},\n\t\t\t\t\t\t\tVerbs:     []string{\"get\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\tExpect(err).To(BeNil())\n\n\t\t\t\terr = cl.Create(context.TODO(), &corev1.ServiceAccount{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName:      \"test-sa\",\n\t\t\t\t\t\tNamespace: \"default\",\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\tExpect(err).To(BeNil())\n\n\t\t\t\terr = cl.Create(context.TODO(), &rbacv1.ClusterRoleBinding{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tName: \"test-cluster-role-binding\",\n\t\t\t\t\t},\n\t\t\t\t\tRoleRef: rbacv1.RoleRef{\n\t\t\t\t\t\tAPIGroup: \"rbac.authorization.k8s.io\",\n\t\t\t\t\t\tKind:     \"ClusterRole\",\n\t\t\t\t\t\tName:     \"test-cluster-role\",\n\t\t\t\t\t},\n\t\t\t\t\tSubjects: []rbacv1.Subject{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tKind:      \"ServiceAccount\",\n\t\t\t\t\t\t\tName:      \"test-sa\",\n\t\t\t\t\t\t\tNamespace: \"default\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\tExpect(err).To(BeNil())\n\n\t\t\t\tprovider := &v1alpha2.ReadinessProvider{}\n\t\t\t\terr = cl.Get(context.TODO(), types.NamespacedName{Name: \"configprovider\"}, provider)\n\t\t\t\tExpect(err).To(BeNil())\n\n\t\t\t\tprovider.Spec.ServiceAccountRef = &v1alpha2.ServiceAccountRef{\n\t\t\t\t\tNamespace: \"default\",\n\t\t\t\t\tName:      \"test-sa\",\n\t\t\t\t}\n\n\t\t\t\terr = cl.Update(context.TODO(), provider)\n\t\t\t\tExpect(err).To(BeNil())\n\n\t\t\t\tEventually(func() bool {\n\t\t\t\t\tprovider := &v1alpha2.ReadinessProvider{}\n\t\t\t\t\terr := cl.Get(context.TODO(), types.NamespacedName{Name: \"configprovider\"}, provider)\n\n\t\t\t\t\treturn err == nil && provider.Status.State == v1alpha2.ProviderSuccessState\n\t\t\t\t}).WithTimeout(timeout).WithPolling(pollingInterval).Should(BeTrue())\n\t\t\t})\n\t\t})\n\t})\n})\n\nfunc deleteReadinessProviders(readinessNames ...string) {\n\tdeleteResources(metav1.TypeMeta{\n\t\tKind:       \"ReadinessProvider\",\n\t\tAPIVersion: \"core.tanzu.vmware.com/v1alpha2\",\n\t}, readinessNames...)\n}\n\nfunc deleteReadinesses(readinessNames ...string) {\n\tdeleteResources(metav1.TypeMeta{\n\t\tKind:       \"Readiness\",\n\t\tAPIVersion: \"core.tanzu.vmware.com/v1alpha2\",\n\t}, readinessNames...)\n}\n\nfunc deleteSecrets(secretNames ...string) {\n\tdeleteResources(metav1.TypeMeta{\n\t\tKind:       \"Secret\",\n\t\tAPIVersion: \"v1\",\n\t}, secretNames...)\n}\n\nfunc deleteResources(typeMeta metav1.TypeMeta, objectNames ...string) {\n\tfor _, objectName := range objectNames {\n\t\terr := cl.Delete(context.TODO(), &metav1.PartialObjectMetadata{\n\t\t\tTypeMeta: typeMeta,\n\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\tName:      objectName,\n\t\t\t\tNamespace: testNamespace,\n\t\t\t}})\n\t\tExpect(err).To(BeNil())\n\t}\n}\n"
  },
  {
    "path": "util/buildinfo/buildvar.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package buildinfo holds global vars set at build time to provide information about the build.\n// This package SHOULD NOT import other packages -- to avoid dependency cycles.\npackage buildinfo\n\nvar (\n\t// Date is the date the binary was built.\n\t// Set by go build -ldflags \"-X 'github.com/vmware-tanzu/tanzu-framework/util/buildinfo.Date=...'\"\n\tDate string\n\n\t// SHA is the git commit SHA the binary was built with.\n\t// Set by go build -ldflags \"-X 'github.com/vmware-tanzu/tanzu-framework/util/buildinfo.SHA=...'\"\n\tSHA string\n\n\t// Version is the version the binary was built with.\n\t// Set by go build -ldflags \"-X 'github.com/vmware-tanzu/tanzu-framework/util/buildinfo.Version=...'\"\n\tVersion string\n)\n"
  },
  {
    "path": "util/buildinfo/metadata.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage buildinfo\n\n// IsOfficialBuild is the flag that gets set to True if it is an official build being released.\n// Set by go build -ldflags \"-X\" flag\nvar IsOfficialBuild string\n"
  },
  {
    "path": "util/cmp/compare.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage cmp\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"reflect\"\n\n\t\"github.com/Jeffail/gabs\"\n\t\"github.com/golang/protobuf/proto\" //nolint\n\t\"github.com/jeremywohl/flatten\"\n)\n\n// Comparer is used to compare two values. An error means the fields are either not equal or that\n// an error occurred in comparing them.\ntype Comparer interface {\n\t// Eq will compare the interface values of 'a' and 'b' for equality.\n\tEq(a, b interface{}) error\n}\n\n// DeepEqualComparer compares two objects using the deep equal operators.\ntype DeepEqualComparer struct{}\n\n// Eq will compare using the reflect deep equal function.\nfunc (de *DeepEqualComparer) Eq(a, b interface{}) error {\n\teq := reflect.DeepEqual(a, b)\n\tif !eq {\n\t\tam, _ := json.Marshal(a)\n\t\tbm, _ := json.Marshal(b)\n\t\treturn fmt.Errorf(\"%q does not exactly equal %q\", string(am), string(bm))\n\t}\n\treturn nil\n}\n\n// DefinedComparer tells whether one interface contains the defined fields of another. This operator relies on `omitempty` json\n// tags being present in fields that shouldn't be compared when empty.\ntype DefinedComparer struct{}\n\n// Eq will tell whether the fields and values defined in 'a' are present in 'b'. An error mean the values are either not equal\n// or that an error occurred in comparing them.\nfunc (dc *DefinedComparer) Eq(a, b interface{}) error {\n\tam, err := json.Marshal(a)\n\tif err != nil {\n\t\treturn err\n\t}\n\tbm, err := json.Marshal(b)\n\tif err != nil {\n\t\treturn err\n\t}\n\tbc, err := gabs.ParseJSON(bm)\n\tif err != nil {\n\t\treturn err\n\t}\n\taflat, err := flatten.FlattenString(string(am), \"\", flatten.DotStyle)\n\tif err != nil {\n\t\treturn err\n\t}\n\tvar af map[string]interface{}\n\terr = json.Unmarshal([]byte(aflat), &af)\n\tif err != nil {\n\t\treturn err\n\t}\n\tcontains := true\n\tfor ak, av := range af {\n\t\teq := reflect.DeepEqual(bc.Path(ak).Data(), av)\n\t\tif !eq {\n\t\t\tcontains = false\n\t\t\tbreak\n\t\t}\n\t}\n\tif !contains {\n\t\treturn fmt.Errorf(\"values in %s are not present in %s\", string(am), string(bm))\n\t}\n\treturn nil\n}\n\n// Contains checks if the given list contains the element using the comparer.\nfunc Contains(list, contains interface{}, comparer Comparer) (err error) {\n\tswitch reflect.TypeOf(list).Kind() {\n\tcase reflect.Slice:\n\t\ts := reflect.ValueOf(list)\n\t\tfor i := 0; i < s.Len(); i++ {\n\t\t\to := s.Index(i)\n\t\t\terr = comparer.Eq(contains, o.Interface())\n\t\t\tif err == nil {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\tdefault:\n\t\treturn fmt.Errorf(\"not an iterable slice: %#v\", list)\n\t}\n\treturn err\n}\n\n// IterableMessage is an iterable proto message type.\ntype IterableMessage interface {\n\tproto.Message\n\tContains(a interface{}, comparer Comparer) error\n}\n"
  },
  {
    "path": "util/cmp/compare_test.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage cmp\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\ntype TestStruct struct {\n\tS1 string `json:\"s1,omitempty\"`\n\tS2 string `json:\"s2,omitempty\"`\n\tI1 int    `json:\"i1,omitempty\"`\n\tA  *A     `json:\"a,omitempty\"`\n}\n\ntype A struct {\n\tAA string `json:\"aa,omitempty\"`\n}\n\nfunc TestDefined(t *testing.T) {\n\tcc := DefinedComparer{}\n\tfor _, test := range []struct {\n\t\tname      string\n\t\ta         interface{}\n\t\tb         interface{}\n\t\tshouldErr bool\n\t}{\n\t\t{\n\t\t\tname: \"basic test\",\n\t\t\ta: TestStruct{\n\t\t\t\tS1: \"test\",\n\t\t\t},\n\t\t\tb: TestStruct{\n\t\t\t\tS1: \"test\",\n\t\t\t\tS2: \"test2\",\n\t\t\t},\n\t\t\tshouldErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"nested missing\",\n\t\t\ta: TestStruct{\n\t\t\t\tS1: \"test\",\n\t\t\t\tA:  &A{AA: \"aa\"},\n\t\t\t},\n\t\t\tb: TestStruct{\n\t\t\t\tS1: \"test\",\n\t\t\t\tS2: \"test2\",\n\t\t\t},\n\t\t\tshouldErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"nested present\",\n\t\t\ta: TestStruct{\n\t\t\t\tS1: \"test\",\n\t\t\t\tA:  &A{AA: \"aa\"},\n\t\t\t},\n\t\t\tb: TestStruct{\n\t\t\t\tS1: \"test\",\n\t\t\t\tS2: \"test2\",\n\t\t\t\tA:  &A{AA: \"aa\"},\n\t\t\t},\n\t\t\tshouldErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"nested value wrong\",\n\t\t\ta: TestStruct{\n\t\t\t\tS1: \"test\",\n\t\t\t\tA:  &A{AA: \"aa\"},\n\t\t\t},\n\t\t\tb: TestStruct{\n\t\t\t\tS1: \"test\",\n\t\t\t\tS2: \"test2\",\n\t\t\t\tI1: 5,\n\t\t\t\tA:  &A{AA: \"b\"},\n\t\t\t},\n\t\t\tshouldErr: true,\n\t\t},\n\t} {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\terr := cc.Eq(test.a, test.b)\n\t\t\tif test.shouldErr {\n\t\t\t\trequire.NotNil(t, err, \"test should error\")\n\t\t\t} else {\n\t\t\t\trequire.Nil(t, err, \"test should not error\")\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "util/cmp/doc.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package cmp provides utility functions to compare two values\npackage cmp\n"
  },
  {
    "path": "util/cmp/strings/doc.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package strings provides string related utilities for testing purposes.\npackage strings\n"
  },
  {
    "path": "util/cmp/strings/slices.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage strings\n\nimport (\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n)\n\n// SliceDiffIgnoreOrder returns a human-readable diff of two string slices.\n// Two slices are considered equal when they have the same length and same elements. The order of the elements is\n// ignored while comparing. Nil and empty slices are considered equal.\n//\n// This function is intended to be used in tests for comparing expected and actual values, and printing the diff for\n// users to debug:\n//\n//\tif diff := SliceDiffIgnoreOrder(got, want); diff != \"\" {\n//\t    t.Errorf(\"got: %v, want: %v, diff: %s\", got, want, diff)\n//\t}\nfunc SliceDiffIgnoreOrder(a, b []string) string {\n\treturn cmp.Diff(a, b, cmpopts.EquateEmpty(), cmpopts.SortSlices(func(x, y string) bool { return x < y }))\n}\n"
  },
  {
    "path": "util/cmp/strings/slices_test.go",
    "content": "// Copyright 2022 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage strings\n\nimport \"testing\"\n\nfunc TestSliceDiffIgnoreOrder(t *testing.T) {\n\ttestCases := []struct {\n\t\tdescription string\n\t\ta           []string\n\t\tb           []string\n\t\tdiffEmpty   bool\n\t}{\n\t\t{\n\t\t\t\"Non empty diff - elements different\",\n\t\t\t[]string{\"abc\", \"def\"},\n\t\t\t[]string{\"abc\", \"ghi\"},\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t\"Empty diff - same elements\",\n\t\t\t[]string{\"abc\", \"def\"},\n\t\t\t[]string{\"abc\", \"def\"},\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t\"Empty diff - same elements unordered\",\n\t\t\t[]string{\"abc\", \"def\", \"ghi\"},\n\t\t\t[]string{\"def\", \"ghi\", \"abc\"},\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t\"Empty diff - nil slices\",\n\t\t\tnil,\n\t\t\tnil,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t\"Empty diff - non nil empty slices\",\n\t\t\t[]string{},\n\t\t\t[]string{},\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t\"Empty diff - nil and non-nil slices\",\n\t\t\tnil,\n\t\t\t[]string{},\n\t\t\ttrue,\n\t\t},\n\t}\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tdiff := SliceDiffIgnoreOrder(tc.a, tc.b)\n\t\t\tif (len(diff) == 0) != tc.diffEmpty {\n\t\t\t\tt.Errorf(\"expected diffEmpty to be %t, got diff: %s\", tc.diffEmpty, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "util/go.mod",
    "content": "module github.com/vmware-tanzu/tanzu-framework/util\n\ngo 1.19\n\nrequire (\n\tgithub.com/Jeffail/gabs v1.4.0\n\tgithub.com/go-logr/logr v1.2.3\n\tgithub.com/golang/protobuf v1.5.2\n\tgithub.com/google/go-cmp v0.5.8\n\tgithub.com/jeremywohl/flatten v1.0.1\n\tgithub.com/onsi/ginkgo v1.16.5\n\tgithub.com/onsi/gomega v1.20.1\n\tgithub.com/stretchr/testify v1.8.0\n\tk8s.io/api v0.25.4\n\tk8s.io/apimachinery v0.25.4\n\tk8s.io/client-go v0.25.4\n\tk8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2\n\tknative.dev/pkg v0.0.0-20230404101938-ee73c9355c9d\n\tsigs.k8s.io/controller-runtime v0.12.3\n)\n\nrequire (\n\tgithub.com/PuerkitoBio/purell v1.1.1 // indirect\n\tgithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/blendle/zapdriver v1.3.1 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.1.2 // indirect\n\tgithub.com/davecgh/go-spew v1.1.1 // indirect\n\tgithub.com/emicklei/go-restful/v3 v3.9.0 // indirect\n\tgithub.com/evanphx/json-patch v4.12.0+incompatible // indirect\n\tgithub.com/fsnotify/fsnotify v1.5.4 // indirect\n\tgithub.com/go-logr/zapr v1.2.3 // indirect\n\tgithub.com/go-openapi/jsonpointer v0.19.5 // indirect\n\tgithub.com/go-openapi/jsonreference v0.19.5 // indirect\n\tgithub.com/go-openapi/swag v0.19.15 // indirect\n\tgithub.com/gogo/protobuf v1.3.2 // indirect\n\tgithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect\n\tgithub.com/google/gnostic v0.5.7-v3refs // indirect\n\tgithub.com/google/gofuzz v1.2.0 // indirect\n\tgithub.com/google/uuid v1.3.0 // indirect\n\tgithub.com/imdario/mergo v0.3.12 // indirect\n\tgithub.com/josharian/intern v1.0.0 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/mailru/easyjson v0.7.7 // indirect\n\tgithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect\n\tgithub.com/nxadm/tail v1.4.8 // indirect\n\tgithub.com/pkg/errors v0.9.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/prometheus/client_golang v1.12.1 // indirect\n\tgithub.com/prometheus/client_model v0.2.0 // indirect\n\tgithub.com/prometheus/common v0.32.1 // indirect\n\tgithub.com/prometheus/procfs v0.7.3 // indirect\n\tgithub.com/spf13/pflag v1.0.5 // indirect\n\tgo.uber.org/atomic v1.9.0 // indirect\n\tgo.uber.org/multierr v1.6.0 // indirect\n\tgo.uber.org/zap v1.19.1 // indirect\n\tgolang.org/x/net v0.8.0 // indirect\n\tgolang.org/x/oauth2 v0.3.0 // indirect\n\tgolang.org/x/sys v0.6.0 // indirect\n\tgolang.org/x/term v0.6.0 // indirect\n\tgolang.org/x/text v0.8.0 // indirect\n\tgolang.org/x/time v0.3.0 // indirect\n\tgomodules.xyz/jsonpatch/v2 v2.2.0 // indirect\n\tgoogle.golang.org/appengine v1.6.7 // indirect\n\tgoogle.golang.org/protobuf v1.28.0 // indirect\n\tgopkg.in/inf.v0 v0.9.1 // indirect\n\tgopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect\n\tgopkg.in/yaml.v2 v2.4.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tk8s.io/apiextensions-apiserver v0.25.4 // indirect\n\tk8s.io/component-base v0.25.4 // indirect\n\tk8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54 // indirect\n\tk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect\n\tsigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect\n\tsigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect\n\tsigs.k8s.io/yaml v1.3.0 // indirect\n)\n"
  },
  {
    "path": "util/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/Jeffail/gabs v1.4.0 h1://5fYRRTq1edjfIrQGvdkcd22pkYUrHZ5YC/H2GJVAo=\ngithub.com/Jeffail/gabs v1.4.0/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc=\ngithub.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=\ngithub.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=\ngithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=\ngithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\ngithub.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=\ngithub.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE=\ngithub.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=\ngithub.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE=\ngithub.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ=\ngithub.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84=\ngithub.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=\ngithub.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=\ngithub.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=\ngithub.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=\ngithub.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A=\ngithub.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4=\ngithub.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=\ngithub.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=\ngithub.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM=\ngithub.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg=\ngithub.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=\ngithub.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM=\ngithub.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=\ngithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=\ngithub.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=\ngithub.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=\ngithub.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=\ngithub.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=\ngithub.com/jeremywohl/flatten v1.0.1 h1:LrsxmB3hfwJuE+ptGOijix1PIfOoKLJ3Uee/mzbgtrs=\ngithub.com/jeremywohl/flatten v1.0.1/go.mod h1:4AmD/VxjWcI5SRB0n6szE2A6s2fsNHDLO0nAlMHgfLQ=\ngithub.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=\ngithub.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=\ngithub.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=\ngithub.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=\ngithub.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=\ngithub.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=\ngithub.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=\ngithub.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=\ngithub.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=\ngithub.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=\ngithub.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=\ngithub.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=\ngithub.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=\ngithub.com/onsi/ginkgo/v2 v2.1.6 h1:Fx2POJZfKRQcM1pH49qSZiYeu319wji004qX+GDovrU=\ngithub.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=\ngithub.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=\ngithub.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q=\ngithub.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\ngithub.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\ngithub.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk=\ngithub.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\ngithub.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\ngithub.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4=\ngithub.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\ngithub.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=\ngithub.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=\ngithub.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=\ngo.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=\ngo.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=\ngo.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=\ngo.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=\ngo.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=\ngo.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=\ngo.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=\ngo.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=\ngo.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=\ngo.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=\ngo.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=\ngo.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI=\ngo.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=\ngolang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8=\ngolang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw=\ngolang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=\ngolang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=\ngolang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY=\ngomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=\ngoogle.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=\ngopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=\ngopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=\ngopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nk8s.io/api v0.25.4 h1:3YO8J4RtmG7elEgaWMb4HgmpS2CfY1QlaOz9nwB+ZSs=\nk8s.io/api v0.25.4/go.mod h1:IG2+RzyPQLllQxnhzD8KQNEu4c4YvyDTpSMztf4A0OQ=\nk8s.io/apiextensions-apiserver v0.25.4 h1:7hu9pF+xikxQuQZ7/30z/qxIPZc2J1lFElPtr7f+B6U=\nk8s.io/apiextensions-apiserver v0.25.4/go.mod h1:bkSGki5YBoZWdn5pWtNIdGvDrrsRWlmnvl9a+tAw5vQ=\nk8s.io/apimachinery v0.25.4 h1:CtXsuaitMESSu339tfhVXhQrPET+EiWnIY1rcurKnAc=\nk8s.io/apimachinery v0.25.4/go.mod h1:jaF9C/iPNM1FuLl7Zuy5b9v+n35HGSh6AQ4HYRkCqwo=\nk8s.io/client-go v0.25.4 h1:3RNRDffAkNU56M/a7gUfXaEzdhZlYhoW8dgViGy5fn8=\nk8s.io/client-go v0.25.4/go.mod h1:8trHCAC83XKY0wsBIpbirZU4NTUpbuhc2JnI7OruGZw=\nk8s.io/component-base v0.25.4 h1:n1bjg9Yt+G1C0WnIDJmg2fo6wbEU1UGMRiQSjmj7hNQ=\nk8s.io/component-base v0.25.4/go.mod h1:nnZJU8OP13PJEm6/p5V2ztgX2oyteIaAGKGMYb2L2cY=\nk8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54 h1:hWRbsoRWt44OEBnYUd4ceLy4ofBoh+p9vauWp/I5Gdg=\nk8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=\nk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s=\nk8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4=\nk8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 h1:GfD9OzL11kvZN5iArC6oTS7RTj7oJOIfnislxYlqTj8=\nk8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=\nknative.dev/pkg v0.0.0-20230404101938-ee73c9355c9d h1:mubqXUjYfnwNg3IGWYEj2YffXYIxg44Qn9GS5vPAjck=\nknative.dev/pkg v0.0.0-20230404101938-ee73c9355c9d/go.mod h1:EQk8+qkZ8fMtrDYOOb9e9xMQG29N+L54iXBCfNXRm90=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\nsigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio=\nsigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0=\nsigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k=\nsigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=\nsigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=\nsigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=\nsigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=\n"
  },
  {
    "path": "util/kubeclient/doc.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package kubeclient contains code to get *rest.Config\npackage kubeclient\n"
  },
  {
    "path": "util/kubeclient/kubeclient.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage kubeclient\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\tauthenticationv1 \"k8s.io/api/authentication/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/client-go/kubernetes\"\n\t\"k8s.io/client-go/rest\"\n)\n\n// GetConfigForServiceAccount returns a *rest.Config which uses the service account for talking to a Kubernetes API server.\nfunc GetConfigForServiceAccount(ctx context.Context, clientset kubernetes.Interface, inClusterConfig *rest.Config, nsName, saName string) (*rest.Config, error) {\n\ttreq, err := clientset.CoreV1().ServiceAccounts(nsName).CreateToken(ctx, saName, &authenticationv1.TokenRequest{}, metav1.CreateOptions{})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to retrieve token from service account. %s\", err.Error())\n\t}\n\n\treturn &rest.Config{\n\t\tBearerToken:     treq.Status.Token,\n\t\tHost:            inClusterConfig.Host,\n\t\tTLSClientConfig: inClusterConfig.TLSClientConfig,\n\t}, nil\n}\n"
  },
  {
    "path": "util/test/doc.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package test provides utility functions for tests\npackage test\n"
  },
  {
    "path": "util/test/kube.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage test\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"io\"\n\n\t\"k8s.io/apimachinery/pkg/api/meta\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"k8s.io/apimachinery/pkg/runtime/serializer/yaml\"\n\tyamlutil \"k8s.io/apimachinery/pkg/util/yaml\"\n\t\"k8s.io/client-go/dynamic\"\n\t\"k8s.io/client-go/rest\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client/apiutil\"\n)\n\nfunc CreateResourcesFromManifest(manifestBytes []byte, cfg *rest.Config, dynamicClient dynamic.Interface) error {\n\tdecoder := yamlutil.NewYAMLOrJSONDecoder(bytes.NewReader(manifestBytes), 100)\n\tmapper, err := apiutil.NewDiscoveryRESTMapper(cfg)\n\tif err != nil {\n\t\treturn err\n\t}\n\tfor {\n\t\tresource, unstructuredObj, err := getResource(decoder, mapper, dynamicClient)\n\t\tif err != nil {\n\t\t\tif err == io.EOF {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\treturn err\n\t\t}\n\t\t_, err = resource.Create(context.Background(), unstructuredObj, metav1.CreateOptions{})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc getResource(decoder *yamlutil.YAMLOrJSONDecoder, mapper meta.RESTMapper, dynamicClient dynamic.Interface) (\n\tdynamic.ResourceInterface, *unstructured.Unstructured, error) { //nolint:whitespace\n\tvar rawObj runtime.RawExtension\n\tif err := decoder.Decode(&rawObj); err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tobj, gvk, err := yaml.NewDecodingSerializer(unstructured.UnstructuredJSONScheme).Decode(rawObj.Raw, nil, nil)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tunstructuredMap, err := runtime.DefaultUnstructuredConverter.ToUnstructured(obj)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tunstructuredObj := &unstructured.Unstructured{Object: unstructuredMap}\n\n\tmapping, err := mapper.RESTMapping(gvk.GroupKind(), gvk.Version)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tvar resource dynamic.ResourceInterface\n\tif mapping.Scope.Name() == meta.RESTScopeNameNamespace {\n\t\tif unstructuredObj.GetNamespace() == \"\" {\n\t\t\tunstructuredObj.SetNamespace(\"default\")\n\t\t}\n\t\tresource = dynamicClient.Resource(mapping.Resource).Namespace(unstructuredObj.GetNamespace())\n\t} else {\n\t\tresource = dynamicClient.Resource(mapping.Resource)\n\t}\n\treturn resource, unstructuredObj, nil\n}\n"
  },
  {
    "path": "util/webhook/certs/README.md",
    "content": "# Certificate Manager Lite\n\nThis package provides lightweight certificate management functionality for a controller manager's webhook server. It is\nintended for developers who want to avoid depending on [cert-manager](https://cert-manager.io) just to manage\nself-signed certificates for webhooks.\n\nCertificate Manager is designed to be invoked in your controller manager. It runs in the background as a goroutine,\nrotates certificates required by the webhook server in a secret and keeps the\n`{Mutating,Validating}WebhookConfiguration`'s `caBundle` up-to-date.\n\n## Usage\n\nCertificate Manager requires the following setup to be used by a controller manager.\n\n### Create an empty secret to hold webhook certs\n\nCertificate Manager updates the certificate data to this secret whenever a rotation occurs.\n\n```yaml\napiVersion: v1\nkind: Secret\nmetadata:\n  annotations:\n    tanzu.vmware.com/foo-webhook-rotation-interval: 6h\n  name: tanzu-foo-webhook-server-cert\n  namespace: default\ntype: Opaque\n```\n\nBy default, Certificate Manager rotates certificates every 24 hours (plus a 30m grace period). To customize the rotation\ninterval, use an annotation like `tanzu.vmware.com/foo-webhook-rotation-interval: 6h` above.\n\nThe [Start Certificate Manager in the Controller Manager](#start-certificate-manager-in-the-controller-manager) section\nshows how to configure Certificate Manager to look for this annotation.\n\n### Add a label to the WebhookConfiguration objects\n\nAdd a label of your choosing to the `{Mutating,Validating}WebhookConfiguration` objects to denote that their\ncertificates are being managed by the Certificate Manager (the example below\nuses `tanzu.vmware.com/foo-webhook-managed-certs: \"true\"` label). This label will be used by the Certificate Manager to\nselect these `{Mutating,Validating}WebhookConfiguration` objects and write `caBundle` to them.\n\nThe [Start Certificate Manager in the Controller Manager](#start-certificate-manager-in-the-controller-manager) section\nshows how to configure Certificate Manager to look for this label.\n\n```yaml\napiVersion: admissionregistration.k8s.io/v1\nkind: ValidatingWebhookConfiguration\nmetadata:\n  name: tanzu-foo-validating-webhook-core\n  labels:\n    tanzu.vmware.com/foo-webhook-managed-certs: \"true\"\nwebhooks:\n...\n```\n\n### Configure your Controller Manager deployment\n\n1. Mount the secret created above to the controller manager pod.\n1. Pass the configuration necessary for the Certificate Manager as arguments to the controller manager binary. You will\n   need to declare appropriate flags in the controller manager for passing arguments. Certificate Manager requires the\n   following configuration options:\n    * `{Mutating,Validating}WebhookConfiguration` label (added in the previous step).\n    * Namespace of the webhook `Service`.\n    * Name of the webhook `Service`.\n    * Namespace of the webhook `Secret` (created above).\n    * Name of the webhook `Secret`.\n\n```yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  labels:\n    app: tanzu-foo-manager\n  name: tanzu-foo-controller-manager\n  namespace: default\nspec:\n  ...\n  spec:\n    ...\n    containers:\n        - image: foo-controller-manager:latest\n          name: manager\n          args:\n            - \"--webhook-config-label=tanzu.vmware.com/foo-webhook-managed-certs=true\"\n            - \"--webhook-service-namespace=default\"\n            - \"--webhook-service-name=tanzu-foo-webhook-service\"\n            - \"--webhook-secret-namespace=default\"\n            - \"--webhook-secret-name=tanzu-foo-webhook-server-cert\"\n          volumeMounts:\n            - mountPath: /tmp/k8s-webhook-server/serving-certs\n              name: cert\n              readOnly: true\n          ...\n    volumes:\n      - name: cert\n        secret:\n          defaultMode: 420\n          secretName: tanzu-foo-webhook-server-cert\n```\n\n1. Add RBAC rules to your controller manager deployment to read and write `Secret`, `MutatingWebhookConfiguration` and\n   `ValidatingWebhookConfiguration` objects.\n\n```yaml\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  annotations:\n  name: tanzu-foo-manager-clusterrole\nrules:\n  - apiGroups:\n      - \"\"\n    resources:\n      - secrets\n    verbs:\n      - get\n      - list\n      - patch\n      - update\n      - watch\n  - apiGroups:\n      - \"admissionregistration.k8s.io\"\n    resources:\n      - mutatingwebhookconfigurations\n      - validatingwebhookconfigurations\n    verbs:\n      - get\n      - list\n      - patch\n      - update\n      - watch\n```\n\n### Start Certificate Manager in the Controller Manager\n\nIn the controller manager's `main.go`, initialize a `CertificateManager` object and invoke the `Start` method to start\ncertificate management.\n\n```go\npackage main\n\nimport \"github.com/vmware-tanzu/tanzu-framework/util/webhook/certs\"\n\nfunc main() {\n    // Declare flags.\n    flag.StringVar(&webhookConfigLabel, \"webhook-config-label\", defaultWebhookConfigLabel, \"The label used to select webhook configurations to update the certs for.\")\n    flag.StringVar(&webhookServiceNamespace, \"webhook-service-namespace\", defaultWebhookServiceNamespace, \"The namespace in which webhook service is installed.\")\n    flag.StringVar(&webhookServiceName, \"webhook-service-name\", defaultWebhookServiceName, \"The name of the webhook service.\")\n    flag.StringVar(&webhookSecretNamespace, \"webhook-secret-namespace\", defaultWebhookSecretNamespace, \"The namespace in which webhook secret is installed.\")\n    flag.StringVar(&webhookSecretName, \"webhook-secret-name\", defaultWebhookSecretName, \"The name of the webhook secret.\")\n\n    // Initialize CertificateManager.\n    certManagerOpts := certs.Options{\n        Logger:                        ctrl.Log.WithName(\"foo-webhook-cert-manager\"),\n        CertDir:                       webhookSecretVolumeMountPath,\n        WebhookConfigLabel:            webhookConfigLabel,\n        RotationIntervalAnnotationKey: \"tanzu.vmware.com/foo-webhook-rotation-interval\",\n        NextRotationAnnotationKey:     \"tanzu.vmware.com/foo-webhook-next-rotation\",\n        RotationCountAnnotationKey:    \"tanzu.vmware.com/featuregates-webhook-rotation-count\",\n        SecretName:                    webhookSecretName,\n        SecretNamespace:               webhookSecretNamespace,\n        ServiceName:                   webhookServiceName,\n        ServiceNamespace:              webhookServiceNamespace,\n    }\n\n    // Other setup code...\n\n    // Initialize certificate manager.\n    signalHandler := ctrl.SetupSignalHandler()\n\n    certManager, err := certs.New(certManagerOpts)\n    if err != nil {\n        log.Error(err, \"failed to create certificate manager\")\n        os.Exit(1)\n    }\n\n    // Start cert manager.\n    if err := certManager.Start(signalHandler); err != nil {\n        log.Error(err, \"failed to start certificate manager\")\n        os.Exit(1)\n    }\n\n    // Wait for cert dir to be ready.\n    if err := certManager.WaitForCertDirReady(); err != nil {\n        log.Error(err, \"certificates not ready\")\n        os.Exit(1)\n    }\n\n    // Start controller manager.\n    if err := mgr.Start(signalHandler); err != nil {\n        log.Error(err, \"problem running manager\")\n        os.Exit(1)\n    }\n}\n```\n"
  },
  {
    "path": "util/webhook/certs/certmanager.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage certs\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"path\"\n\t\"strconv\"\n\t\"time\"\n\n\tadminregv1 \"k8s.io/api/admissionregistration/v1\"\n\tcorev1 \"k8s.io/api/core/v1\"\n\tapierrors \"k8s.io/apimachinery/pkg/api/errors\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/client-go/util/retry\"\n\t\"knative.dev/pkg/webhook/certificates/resources\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n)\n\n// New returns a new instance of a CertificateManager.\nfunc New(options *Options) (*CertificateManager, error) {\n\tif options == nil {\n\t\toptions = &Options{}\n\t}\n\tif err := options.defaultOpts(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn &CertificateManager{opts: *options}, nil\n}\n\n// CertificateManager creates and rotates certificates required by a controller manager's webhook server.\ntype CertificateManager struct {\n\topts Options\n}\n\n// Start starts certificate management for a controller manager's webhooks.\n// This method calls os.Exit when an error is encountered.\nfunc (cm *CertificateManager) Start(ctx context.Context) error {\n\tgo func() {\n\t\tif err := cm.start(ctx); err != nil {\n\t\t\tcm.opts.Logger.Error(err, \"unexpected failure in starting certificate manager\")\n\t\t\tos.Exit(1)\n\t\t}\n\t}()\n\treturn nil\n}\n\n// start does the actual work of cert rotation.\nfunc (cm *CertificateManager) start(ctx context.Context) error {\n\tvar rotationTime time.Time\n\tfor {\n\t\tnextRotationTime, err := cm.rotateCerts(ctx, rotationTime)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trotationTime = nextRotationTime\n\t\tselect {\n\t\tcase <-time.After(time.Until(nextRotationTime)):\n\t\tcase <-ctx.Done():\n\t\t\treturn nil\n\t\t}\n\t}\n}\n\n// rotateCerts rotates certificates at the scheduled rotation time, writes them to the secret and returns the next\n// scheduled rotation time.\nfunc (cm *CertificateManager) rotateCerts(ctx context.Context, scheduledNextRotationTime time.Time) (time.Time, error) {\n\tnow := time.Now()\n\tcm.opts.Logger.Info(\"Rotating certificates\", \"now\", now.String(), \"scheduledNextRotationTime\", scheduledNextRotationTime.String())\n\n\t// Get the webhook server's secret. Certificate manager expects an empty secret to have been created with the\n\t// controller deployment that intends to use cert management.\n\t// Any error in getting that secret is cause for exiting this program.\n\tsecret := &corev1.Secret{}\n\tsecretKey := client.ObjectKey{Name: cm.opts.SecretName, Namespace: cm.opts.SecretNamespace}\n\tcm.opts.Logger.Info(\"Getting secret\", \"namespacedName\", secretKey.String())\n\tif err := cm.opts.Client.Get(ctx, secretKey, secret); err != nil {\n\t\treturn time.Time{}, err\n\t}\n\n\tif len(secret.Annotations) == 0 {\n\t\tsecret.Annotations = map[string]string{}\n\t}\n\n\t// If this is the first time rotate is called since starting certificate manager, then initialize the webhooks with\n\t// any CA data (if any) in the secret. This is for the case when a package is redeployed (for any reason) and the\n\t// webhook config properties are reset.\n\tif scheduledNextRotationTime.IsZero() {\n\t\tif caCertData := secret.Data[CACertName]; len(caCertData) > 0 {\n\t\t\tif err := cm.updateWebhookConfigs(ctx, caCertData); err != nil {\n\t\t\t\treturn time.Time{}, err\n\t\t\t}\n\t\t}\n\t}\n\n\t// If the webhook secret already has a scheduled next rotation time that does not occur in the past, then defer this\n\t// rotation until that time. This usually happens when another certificate manager has updated the certs (perhaps\n\t// from an earlier process that was exited).\n\tnextRotationTime, _ := cm.getNextRotationTime(secret)\n\tif !nextRotationTime.IsZero() && nextRotationTime.After(now) {\n\t\tif !scheduledNextRotationTime.Equal(nextRotationTime) {\n\t\t\tcm.opts.Logger.Info(\"Rescheduling next rotation\", \"nextRotationTime\", nextRotationTime.String())\n\t\t\treturn nextRotationTime, nil\n\t\t}\n\t}\n\n\t// Determine the rotation interval.\n\tvar rotationInterval time.Duration\n\tvalue := secret.Annotations[cm.opts.RotationIntervalAnnotationKey]\n\t// If key doesn't exist or the value is \"\", time.ParseDuration will return a zero time.\n\tif rotationInterval, _ = time.ParseDuration(value); rotationInterval == 0 {\n\t\trotationInterval = defaultRotationInterval\n\t}\n\n\t// Update next rotation time and write it to the NextRotationAnnotationKey in the secret.\n\tnextRotationTime = now.Add(rotationInterval)\n\tsecret.Annotations[cm.opts.NextRotationAnnotationKey] = strconv.FormatInt(nextRotationTime.Unix(), 10)\n\n\t// Increment the rotation count. If an error occurs just ignore it since\n\t// the rotation count is optional, primarily used for testing.\n\tvar rotationCount int64\n\tif value := secret.Annotations[cm.opts.RotationCountAnnotationKey]; value != \"\" {\n\t\trotationCount, _ = strconv.ParseInt(value, 10, 64)\n\t}\n\trotationCount++\n\tsecret.Annotations[cm.opts.RotationCountAnnotationKey] = strconv.FormatInt(rotationCount, 10)\n\n\t// Update the secret data.\n\tnotAfter := nextRotationTime.Add(certExpirtationBuffer)\n\tcm.opts.Logger.Info(\"Generating certificates\")\n\tsecretData, err := cm.generateWebhookCertSecretData(ctx, notAfter)\n\tif err != nil {\n\t\treturn time.Time{}, fmt.Errorf(\"failed to generate webhook server certificate secret data: %w\", err)\n\t}\n\tsecret.Data = secretData\n\tif err := cm.updateWebhookSecret(ctx, secret); err != nil {\n\t\treturn time.Time{}, err\n\t}\n\n\t// Update webhook configurations with new cert data.\n\tif err := cm.updateWebhookConfigs(ctx, secretData[CACertName]); err != nil {\n\t\treturn time.Time{}, err\n\t}\n\n\tcm.opts.Logger.Info(\"Rotated certificates\", \"nextRotation\", nextRotationTime.String(), \"totalRotationCount\", rotationCount)\n\treturn nextRotationTime, nil\n}\n\n// getNextRotationTime fetches the next rotation time from the webhook secret's annotation.\nfunc (cm *CertificateManager) getNextRotationTime(secret *corev1.Secret) (time.Time, error) {\n\t// Get the next-rotation annotation\n\tszValue := secret.Annotations[cm.opts.NextRotationAnnotationKey]\n\tif szValue == \"\" {\n\t\treturn time.Time{}, fmt.Errorf(\"missing next-rotation annotation\")\n\t}\n\n\t// The error is ignored since the value will always be >0.\n\tiValue, _ := strconv.ParseInt(szValue, 10, 64)\n\tif iValue <= 0 {\n\t\treturn time.Time{}, fmt.Errorf(\"next-rotation annotation value is invalid\")\n\t}\n\n\t// Return the next-rotation value.\n\treturn time.Unix(iValue, 0), nil\n}\n\n// updateWebhookConfigs updates the caBundle in the webhooks selected by the label selector.\nfunc (cm *CertificateManager) updateWebhookConfigs(ctx context.Context, caCertData []byte) error {\n\tcm.opts.Logger.Info(\"Updating webhook configs with CA bundle\")\n\n\t// Update validating webhooks with new CA data.\n\tlabelSelector, err := metav1.ParseToLabelSelector(cm.opts.WebhookConfigLabel)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to parse webhook label: %w\", err)\n\t}\n\tmatchLabels := client.MatchingLabels(labelSelector.MatchLabels)\n\tvalidatingWebhookList := &adminregv1.ValidatingWebhookConfigurationList{}\n\tif err := cm.opts.Client.List(ctx, validatingWebhookList, matchLabels); err != nil && !apierrors.IsNotFound(err) {\n\t\treturn fmt.Errorf(\"failed to list validating webhooks: %w\", err)\n\t}\n\n\tfor i := range validatingWebhookList.Items {\n\t\twebhookConfig := validatingWebhookList.Items[i]\n\t\tfor i := range webhookConfig.Webhooks {\n\t\t\twebhookConfig.Webhooks[i].ClientConfig.CABundle = caCertData\n\t\t}\n\n\t\tif err := cm.opts.Client.Update(ctx, &webhookConfig); err != nil {\n\t\t\tif !apierrors.IsConflict(err) {\n\t\t\t\treturn fmt.Errorf(\"failed to update validating webhook configuration %s/%s: %w\", webhookConfig.Namespace, webhookConfig.Name, err)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Update mutating webhooks with new CA data.\n\tmutatingWebhookList := &adminregv1.MutatingWebhookConfigurationList{}\n\tif err := cm.opts.Client.List(ctx, mutatingWebhookList, matchLabels); err != nil && !apierrors.IsNotFound(err) {\n\t\treturn fmt.Errorf(\"failed to list mutating webhooks: %w\", err)\n\t}\n\n\tfor i := range mutatingWebhookList.Items {\n\t\twebhookConfig := mutatingWebhookList.Items[i]\n\t\tfor i := range webhookConfig.Webhooks {\n\t\t\twebhookConfig.Webhooks[i].ClientConfig.CABundle = caCertData\n\t\t}\n\n\t\tif err := cm.opts.Client.Update(ctx, &webhookConfig); err != nil {\n\t\t\tif !apierrors.IsConflict(err) {\n\t\t\t\treturn fmt.Errorf(\"failed to update mutating webhook configuration %s/%s: %w\", webhookConfig.Namespace, webhookConfig.Name, err)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// generateWebhookCertSecretData generates the cert data to be written to the secret.\nfunc (cm *CertificateManager) generateWebhookCertSecretData(ctx context.Context, notAfter time.Time) (map[string][]byte, error) {\n\tserverKey, serverCert, caCert, err := resources.CreateCerts(ctx, cm.opts.ServiceName, cm.opts.ServiceNamespace, notAfter)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create certs: %w\", err)\n\t}\n\tdata := map[string][]byte{\n\t\tCACertName:     caCert,\n\t\tServerCertName: serverCert,\n\t\tServerKeyName:  serverKey,\n\t}\n\treturn data, nil\n}\n\n// updateWebhookSecret updates the webhook secret with the cert data.\nfunc (cm *CertificateManager) updateWebhookSecret(ctx context.Context, secret *corev1.Secret) error {\n\tnamespacedName := fmt.Sprintf(\"%s/%s\", secret.Namespace, secret.Name)\n\tcm.opts.Logger.Info(\"Updating secret with certificate data\", \"namespacedName\", namespacedName)\n\terr := retry.RetryOnConflict(retry.DefaultRetry, func() error {\n\t\treturn cm.opts.Client.Update(ctx, secret)\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to update webhook secret %s: %w\", namespacedName, err)\n\t}\n\treturn nil\n}\n\n// WaitForCertDirReady blocks until certs are written to the cert directory or until a timeout occurs.\nfunc (cm *CertificateManager) WaitForCertDirReady() error {\n\ttimeout := time.Minute * 5\n\tselect {\n\tcase <-cm.certDirReady():\n\t\treturn nil\n\tcase <-time.After(timeout):\n\t\treturn fmt.Errorf(\"timed out after %s\", timeout.String())\n\t}\n}\n\n// certDirReady returns a channel that is closed when certs are found in the directory.\nfunc (cm *CertificateManager) certDirReady() <-chan struct{} {\n\tdone := make(chan struct{})\n\tgo func() {\n\t\tcrtPath := path.Join(cm.opts.CertDir, ServerCertName)\n\t\tkeyPath := path.Join(cm.opts.CertDir, ServerKeyName)\n\t\tfor {\n\t\t\tcertPathFound, keyPathFound := false, false\n\t\t\tif file, err := os.Stat(crtPath); err == nil && file.Size() > 0 {\n\t\t\t\tcertPathFound = true\n\t\t\t}\n\t\t\tif file, err := os.Stat(keyPath); err == nil && file.Size() > 0 {\n\t\t\t\tkeyPathFound = true\n\t\t\t}\n\t\t\tif certPathFound && keyPathFound {\n\t\t\t\tclose(done)\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttime.Sleep(time.Second * 1)\n\t\t}\n\t}()\n\treturn done\n}\n"
  },
  {
    "path": "util/webhook/certs/certmanager_suite_test.go",
    "content": "//go:build envtest\n\n// Copyright (c) 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage certs\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t. \"github.com/onsi/ginkgo\"\n\t. \"github.com/onsi/gomega\"\n\t\"k8s.io/client-go/kubernetes/scheme\"\n\t\"k8s.io/client-go/rest\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\t\"sigs.k8s.io/controller-runtime/pkg/envtest\"\n\tlogf \"sigs.k8s.io/controller-runtime/pkg/log\"\n\t\"sigs.k8s.io/controller-runtime/pkg/log/zap\"\n)\n\nvar (\n\tcfg       *rest.Config\n\tk8sClient client.Client\n\ttestEnv   *envtest.Environment\n\n\tctx = context.Background()\n)\n\nfunc init() {\n}\n\nfunc TestCertificateManager(t *testing.T) {\n\tRegisterFailHandler(Fail)\n\tRunSpecs(t, \"Certificate Manager suite\")\n}\n\nvar _ = BeforeSuite(func(done Done) {\n\tBy(\"bootstrapping test environment\")\n\tlogf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true)))\n\ttestEnv = &envtest.Environment{}\n\n\tvar err error\n\tcfg, err = testEnv.Start()\n\tExpect(err).ToNot(HaveOccurred())\n\tExpect(cfg).ToNot(BeNil())\n\n\t// +kubebuilder:scaffold:scheme\n\n\tk8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme})\n\tExpect(err).ToNot(HaveOccurred())\n\tExpect(k8sClient).ToNot(BeNil())\n\n\tclose(done)\n}, 60)\n\nvar _ = AfterSuite(func() {\n\tBy(\"tearing down the test environment\")\n\tExpect(testEnv.Stop()).To(Succeed())\n})\n"
  },
  {
    "path": "util/webhook/certs/certmanager_test.go",
    "content": "//go:build envtest\n\n// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage certs\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"sync\"\n\t\"time\"\n\n\t. \"github.com/onsi/ginkgo\"\n\t. \"github.com/onsi/gomega\"\n\tadmissionregv1 \"k8s.io/api/admissionregistration/v1\"\n\tcorev1 \"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\tctrl \"sigs.k8s.io/controller-runtime\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n)\n\nvar _ = Describe(\"Rotating certificates\", func() {\n\tvar (\n\t\toptions                  *Options\n\t\trotationInterval         time.Duration\n\t\tsecretKey                client.ObjectKey\n\t\twebhookConfigKey         client.ObjectKey\n\t\ttotalRotationDuration    time.Duration\n\t\twaitForCertManagerToStop sync.WaitGroup\n\t)\n\n\tBeforeEach(func() {\n\t\trotationInterval = time.Second * 5\n\t\ttotalRotationDuration = time.Second * 20\n\t\twaitForCertManagerToStop = sync.WaitGroup{}\n\t})\n\n\tJustBeforeEach(func() {\n\t\tBy(\"installing the secret\", func() {\n\t\t\tsecret := &corev1.Secret{\n\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\tNamespace:    \"default\",\n\t\t\t\t\tGenerateName: \"test-\",\n\t\t\t\t\tAnnotations: map[string]string{\n\t\t\t\t\t\t\"certs.tanzu.vmware.com/rotation-interval\": rotationInterval.String(),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\t\t\tExpect(k8sClient.Create(ctx, secret)).To(Succeed())\n\t\t\tsecretKey = client.ObjectKey{Namespace: secret.Namespace, Name: secret.Name}\n\t\t})\n\n\t\tBy(\"installing the webhook\", func() {\n\t\t\tfailurePolicy := admissionregv1.Ignore\n\t\t\tsideEffectNone := admissionregv1.SideEffectClassNone\n\t\t\twebhookURL := \"https://k8s.svc.local:9443/validate\"\n\t\t\twebhookConfig := &admissionregv1.ValidatingWebhookConfiguration{\n\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\tNamespace:    \"default\",\n\t\t\t\t\tGenerateName: \"test-\",\n\t\t\t\t\tLabels: map[string]string{\n\t\t\t\t\t\t\"certs.tanzu.vmware.com/managed-certs\": \"true\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tWebhooks: []admissionregv1.ValidatingWebhook{\n\t\t\t\t\t{\n\t\t\t\t\t\tAdmissionReviewVersions: []string{\"v1beta1\"},\n\t\t\t\t\t\tName:                    \"certs.tanzu.vmware.com\",\n\t\t\t\t\t\tClientConfig: admissionregv1.WebhookClientConfig{\n\t\t\t\t\t\t\tCABundle: []byte{'\\n'},\n\t\t\t\t\t\t\tURL:      &webhookURL,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tFailurePolicy: &failurePolicy,\n\t\t\t\t\t\tRules:         []admissionregv1.RuleWithOperations{},\n\t\t\t\t\t\tSideEffects:   &sideEffectNone,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\t\t\tExpect(k8sClient.Create(ctx, webhookConfig)).To(Succeed())\n\t\t\twebhookConfigKey = client.ObjectKey{Namespace: webhookConfig.Namespace, Name: webhookConfig.Name}\n\t\t})\n\n\t\t// Define the certificate manager options.\n\t\toptions = &Options{\n\t\t\tClient:                        k8sClient,\n\t\t\tLogger:                        ctrl.Log.WithName(\"certmanager-test\"),\n\t\t\tWebhookConfigLabel:            \"certs.tanzu.vmware.com/managed-certs=true\",\n\t\t\tNextRotationAnnotationKey:     \"certs.tanzu.vmware.com/next-rotation\",\n\t\t\tRotationCountAnnotationKey:    \"certs.tanzu.vmware.com/rotation-count\",\n\t\t\tRotationIntervalAnnotationKey: \"certs.tanzu.vmware.com/rotation-interval\",\n\t\t\tSecretNamespace:               secretKey.Namespace,\n\t\t\tSecretName:                    secretKey.Name,\n\t\t\tServiceNamespace:              \"default\",\n\t\t\tServiceName:                   \"webhook-service\",\n\t\t}\n\n\t\t// Start cert manager.\n\t\twaitForCertManagerToStop.Add(1)\n\t\t// Certificate Manager needs a separate context than the other k8s operations here.\n\t\tcmCtx, cancel := context.WithCancel(context.Background())\n\t\tcm, err := New(options)\n\t\tExpect(err).ShouldNot(HaveOccurred())\n\t\tgo func() {\n\t\t\tdefer GinkgoRecover()\n\t\t\tdefer waitForCertManagerToStop.Done()\n\t\t\tExpect(cm.start(cmCtx)).To(Succeed())\n\t\t}()\n\n\t\t// Background cancel the context after some time.\n\t\ttime.AfterFunc(totalRotationDuration, func() { cancel() })\n\t})\n\n\tJustAfterEach(func() {\n\t\t// Wait for the certificate manager to stop.\n\t\twaitForCertManagerToStop.Wait()\n\n\t\t// Get the secret.\n\t\tsecret := &corev1.Secret{}\n\t\tExpect(k8sClient.Get(ctx, secretKey, secret)).To(Succeed())\n\n\t\t// ASSERT that the number of rotations is non-zero.\n\t\t// We can't really assert for the exact number of rotation in a given period as it depends on multiple things\n\t\t// such as cancellations, errors, load etc. So we just check for a non-zero count.\n\t\tExpect(secret.Annotations).ToNot(BeNil())\n\t\tExpect(secret.Annotations[options.RotationCountAnnotationKey]).ToNot(BeEmpty())\n\t\tactualRotationCount, err := strconv.Atoi(secret.Annotations[options.RotationCountAnnotationKey])\n\t\tExpect(err).ShouldNot(HaveOccurred())\n\t\tExpect(actualRotationCount).To(BeNumerically(\">\", 0))\n\n\t\t// Get the webhook config.\n\t\twebhookConfig := &admissionregv1.ValidatingWebhookConfiguration{}\n\t\tExpect(k8sClient.Get(ctx, webhookConfigKey, webhookConfig)).To(Succeed())\n\n\t\t// ASSERT that the webhook config was updated.\n\t\tExpect(webhookConfig.Webhooks).To(HaveLen(1))\n\t\tExpect(webhookConfig.Webhooks[0].ClientConfig.CABundle).ToNot(BeNil())\n\t\tExpect(webhookConfig.Webhooks[0].ClientConfig.CABundle).To(Equal(secret.Data[CACertName]))\n\t})\n\n\tAfterEach(func() {\n\t\trotationInterval = 0\n\t\ttotalRotationDuration = 0\n\t\toptions = &Options{}\n\t\tsecretKey = client.ObjectKey{}\n\t\twebhookConfigKey = client.ObjectKey{}\n\t\twaitForCertManagerToStop = sync.WaitGroup{}\n\t})\n\n\tWhen(\"a certificate manager is started\", func() {\n\t\tIt(fmt.Sprintf(\"should rotate the certificates non-zero times in %s\", totalRotationDuration.String()), func() {\n\t\t\t// ASSERT happens in JustAfterEach above.\n\t\t})\n\t})\n\n\tWhen(\"the webhook YAML is reapplied and a new certificate manager starts\", func() {\n\t\tIt(\"should update the webhook configurations outside the normal interval when webhook properties are reset\", func() {\n\t\t\t// Wait for the secret's initial rotation.\n\t\t\tEventually(func() (bool, error) {\n\t\t\t\tsecret := &corev1.Secret{}\n\t\t\t\tif err := k8sClient.Get(ctx, secretKey, secret); err != nil {\n\t\t\t\t\treturn false, err\n\t\t\t\t}\n\t\t\t\tif len(secret.Data[CACertName]) == 0 {\n\t\t\t\t\treturn false, nil\n\t\t\t\t}\n\t\t\t\twebhookConfig := &admissionregv1.ValidatingWebhookConfiguration{}\n\t\t\t\tif err := k8sClient.Get(ctx, webhookConfigKey, webhookConfig); err != nil {\n\t\t\t\t\treturn false, err\n\t\t\t\t}\n\t\t\t\tif len(webhookConfig.Webhooks) == 0 {\n\t\t\t\t\treturn false, nil\n\t\t\t\t}\n\t\t\t\tfmt.Println(\"Bytes equal\", bytes.Equal(webhookConfig.Webhooks[0].ClientConfig.CABundle, secret.Data[CACertName]))\n\t\t\t\treturn bytes.Equal(webhookConfig.Webhooks[0].ClientConfig.CABundle, secret.Data[CACertName]), nil\n\t\t\t}, time.Second*15, time.Second*1).Should(BeTrue(), \"webhook config CABundle should be set to CA from secret\")\n\n\t\t\t// GET the webhook config.\n\t\t\twebhookConfig := &admissionregv1.ValidatingWebhookConfiguration{}\n\t\t\tExpect(k8sClient.Get(ctx, webhookConfigKey, webhookConfig)).To(Succeed())\n\n\t\t\t// UPDATE the webhook config's CABundle to a newline char '\\n'.\n\t\t\twebhookConfig.Webhooks[0].ClientConfig.CABundle = []byte{'\\n'}\n\t\t\tExpect(k8sClient.Update(ctx, webhookConfig)).To(Succeed())\n\n\t\t\t// ASSERT the webhook config is eventually changed back to CA bundle in the secret.\n\t\t\t// This check happens in JustAfterEach above.\n\t\t})\n\t})\n})\n"
  },
  {
    "path": "util/webhook/certs/constants.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage certs\n\nimport \"time\"\n\nconst (\n\t// CACertName is the name of the CA certificate.\n\tCACertName = \"ca.crt\"\n\t// ServerCertName is the name of the serving certificate.\n\tServerCertName = \"tls.crt\"\n\t// ServerKeyName is the name of the server private key.\n\tServerKeyName = \"tls.key\"\n\n\t// certExpirtationBuffer specifies the amount of time in addition to the\n\t// rotation interval that generated certificates expire.\n\tcertExpirtationBuffer = time.Minute * 30\n\n\t// defaultRotationInterval is the default interval at which certificates\n\t// are rotated. This value is used if the webhook server secret is missing\n\t// the annotation that specifies the rotation interval.\n\tdefaultRotationInterval = time.Hour * 24\n)\n"
  },
  {
    "path": "util/webhook/certs/doc.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package certs contains APIs to manage certificates for a controller manager's webhooks.\npackage certs\n"
  },
  {
    "path": "util/webhook/certs/options.go",
    "content": "// Copyright 2023 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\npackage certs\n\nimport (\n\t\"github.com/go-logr/logr\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client/config\"\n)\n\n// Options defines the configuration used to create a new CertificateManager.\ntype Options struct {\n\t// Client is used by the certificate manager to read and write secrets and webhook configurations.\n\tClient client.Client\n\n\t// Logger is used to emit log events.\n\tLogger logr.Logger\n\n\t// CertDir is the path on the local filesystem where the certificates should be created once the secret is\n\t// mounted to the controller manager pod. This value is only required if WaitForCertDirReady() method is used.\n\tCertDir string\n\n\t// WebhookConfigLabel is the label used to select the mutating and validating webhook configurations to\n\t// which the certificate authority data is written.\n\tWebhookConfigLabel string\n\n\t// SecretName is the name of the secret that contains the webhook server's certificate data.\n\tSecretName string\n\n\t// SecretNamespace is the namespace of the secret that contains the webhook server's certificate data\n\tSecretNamespace string\n\n\t// ServiceName is the name of the webhook service.\n\tServiceName string\n\n\t// ServiceNamespace is the namespace of the webhook service.\n\tServiceNamespace string\n\n\t// RotationIntervalAnnotationKey specifies the annotation on the webhook server secret parseable by\n\t// time.ParseDuration and controls how often the certificates are rotated. If this annotation is not present on the\n\t// webhook secret specified by SecretName and SecretNamespace, rotation interval is defaulted to 24 hours.\n\t//\n\t// The generated certificates have their NotAfter property assigned to a value of 30 minutes greater than rotation\n\t// interval. This is to ensure a buffer between the generation of new certificates and expiration of old ones in\n\t// case of unexpected failures.\n\tRotationIntervalAnnotationKey string\n\n\t// NextRotationAnnotationKey specifies the annotation on the webhook server secret and is the UNIX epoch which\n\t// indicates when the next rotation will occur. This annotation is managed by the certificate manager.\n\tNextRotationAnnotationKey string\n\n\t// RotatationCountAnnotationKey specifies an annotation on the webhook server\n\t// secret. The annotation's value is the number of times the certificates\n\t// have been rotated. This is primarily used for testing and the count may not always be accurate.\n\tRotationCountAnnotationKey string\n}\n\nfunc (o *Options) defaultOpts() error {\n\tif o.Client == nil {\n\t\tcfg, err := config.GetConfig()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tc, err := client.New(cfg, client.Options{})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\to.Client = c\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "util/ytt/ytt.go",
    "content": "// Copyright 2021 VMware, Inc. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Package ytt provides library for calling out to ytt the binary.\npackage ytt\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"os/exec\"\n\n\tuexec \"k8s.io/utils/exec\"\n)\n\n// Command struct holds ytt command related information.\ntype Command struct {\n\toptions CommandOptions\n\tpath    string\n}\n\n// CommandOptions specifies ytt command options.\ntype CommandOptions struct {\n\tFailOnUnknownComments  bool\n\tStrict                 bool\n\tDangerousAllowSymlinks bool\n}\n\n// NewYttCommand returns a new instance of YTTCommand.\nfunc NewYttCommand(options CommandOptions) *Command {\n\treturn &Command{\n\t\toptions: options,\n\t\tpath:    \"ytt\",\n\t}\n}\n\n// RenderTemplate renders template given a set of file/directory Paths or standard input or both.\nfunc (ytt *Command) RenderTemplate(filePaths []string, input io.Reader) (string, error) {\n\tvar (\n\t\tstdout, stderr bytes.Buffer\n\t)\n\n\targs := ytt.buildArgs(filePaths, input)\n\n\tcmd := exec.Command(ytt.path, args...) //nolint:gosec\n\tcmd.Stdin = input\n\tcmd.Stdout = &stdout\n\tcmd.Stderr = &stderr\n\n\terr := cmd.Run()\n\tif err != nil {\n\t\trc := -1\n\n\t\tif ee, ok := err.(*exec.ExitError); ok {\n\t\t\trc = ee.ExitCode()\n\t\t}\n\n\t\treturn stdout.String(), uexec.CodeExitError{\n\t\t\tErr:  fmt.Errorf(\"error running %v:\\nCommand stdout:\\n%v\\nstderr:\\n%v\\nerror:\\n%v\", cmd, cmd.Stdout, cmd.Stderr, err),\n\t\t\tCode: rc,\n\t\t}\n\t}\n\n\treturn stdout.String(), nil\n}\n\nfunc (ytt *Command) buildArgs(filePaths []string, input io.Reader) []string {\n\targs := []string{}\n\n\tif !ytt.options.FailOnUnknownComments {\n\t\targs = append(args, \"--ignore-unknown-comments\")\n\t}\n\n\tif ytt.options.Strict {\n\t\targs = append(args, \"--strict\")\n\t}\n\n\tif ytt.options.DangerousAllowSymlinks {\n\t\targs = append(args, \"--dangerous-allow-all-symlink-destinations\")\n\t}\n\n\tfor _, filePath := range filePaths {\n\t\targs = append(args, \"-f\", filePath)\n\t}\n\n\tif input != nil {\n\t\targs = append(args, \"-f\", \"-\")\n\t}\n\n\treturn args\n}\n\n// RenderYTTTemplate is a convenience function to render YTT template.\nfunc RenderYTTTemplate(options CommandOptions, filePaths []string, input io.Reader) (string, error) {\n\treturn NewYttCommand(options).RenderTemplate(filePaths, input)\n}\n"
  }
]