diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e08a6b35b9..e272c72a2e 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -25,6 +25,10 @@ updates: directory: "docs" schedule: interval: "daily" + groups: + docusaurus: + patterns: + - "*docusaurus*" ignore: # facebook/docusaurus#4029 suggests MDX v2 will only be in the v3 release. # facebook/docusaurus#9053 has some more details on the migration. diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 093f25fe70..f64416a6a6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,7 +11,7 @@ jobs: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Extract version of Go to use run: echo "GOVERSION=$(sed -n 's/^go \([0-9.]*\)/\1/p' go.mod)" >> $GITHUB_ENV - - uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0 + - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 with: go-version-file: 'go.mod' - name: build diff --git a/.github/workflows/chart-publish.yml b/.github/workflows/chart-publish.yml index fe59552c4d..129127140c 100644 --- a/.github/workflows/chart-publish.yml +++ b/.github/workflows/chart-publish.yml @@ -29,7 +29,7 @@ jobs: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup Go - uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0 + uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 with: go-version-file: 'go.mod' - uses: ko-build/setup-ko@3aebd0597dc1e9d1a26bcfdb7cbeb19c131d3037 # v0.7 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 6c07a583ec..f02f806dc6 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -46,12 +46,12 @@ jobs: - name: Checkout repository uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup Go - uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0 + uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 with: go-version-file: ./go.mod # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@662472033e021d55d94146f66f6058822b0b39fd # v3 + uses: github/codeql-action/init@48ab28a6f5dbc2a99bf1e0131198dd8f1df78169 # v3 with: languages: ${{ matrix.language }} build-mode: manual @@ -69,6 +69,6 @@ jobs: # echo "Run, Build Application using script" # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@662472033e021d55d94146f66f6058822b0b39fd # v3 + uses: github/codeql-action/analyze@48ab28a6f5dbc2a99bf1e0131198dd8f1df78169 # v3 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/compose-migrate.yml b/.github/workflows/compose-migrate.yml index 065ea24917..2cd169bf1f 100644 --- a/.github/workflows/compose-migrate.yml +++ b/.github/workflows/compose-migrate.yml @@ -14,7 +14,7 @@ jobs: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup Go - uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0 + uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 with: go-version-file: 'go.mod' - name: Install ko diff --git a/.github/workflows/generation.yml b/.github/workflows/generation.yml index 4a0fe6e4cf..41d73a87dc 100644 --- a/.github/workflows/generation.yml +++ b/.github/workflows/generation.yml @@ -58,7 +58,7 @@ jobs: - name: Check out code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Set up Go - uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0 + uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 with: go-version-file: "go.mod" - name: Make bootstrap diff --git a/.github/workflows/image-build.yml b/.github/workflows/image-build.yml index 6b7f861304..c805566205 100644 --- a/.github/workflows/image-build.yml +++ b/.github/workflows/image-build.yml @@ -11,7 +11,7 @@ jobs: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup Go - uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0 + uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 with: go-version-file: 'go.mod' - uses: ko-build/setup-ko@3aebd0597dc1e9d1a26bcfdb7cbeb19c131d3037 # v0.7 @@ -33,7 +33,7 @@ jobs: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup Go - uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0 + uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 with: go-version-file: 'go.mod' - uses: ko-build/setup-ko@3aebd0597dc1e9d1a26bcfdb7cbeb19c131d3037 # v0.7 @@ -54,10 +54,10 @@ jobs: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@c47758b77c9736f4b2ef4073d4d51994fabfe349 # v3.7.1 + uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0 - name: Test build on x86 id: docker_build - uses: docker/build-push-action@4f58ea79222b3b9dc2c8bbdd6debcef730109a75 # v6.9.0 + uses: docker/build-push-action@48aba3b46d1b1fec4febb7c5d0c644b249a11355 # v6.10.0 with: context: . file: ./docker/minder/Dockerfile diff --git a/.github/workflows/license-check.yml b/.github/workflows/license-check.yml index 1851159bd5..ca74156a22 100644 --- a/.github/workflows/license-check.yml +++ b/.github/workflows/license-check.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.1 - - uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0 + - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 with: go-version-file: "go.mod" - name: Install addlicense diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index b544dfdca4..9c0f23e631 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -21,7 +21,7 @@ jobs: checks: write steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0 + - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 with: go-version-file: 'go.mod' cache: false @@ -33,7 +33,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0 + - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 with: go-version-file: 'go.mod' cache: false diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml index 12091a2551..b750cf358e 100644 --- a/.github/workflows/pr-check.yml +++ b/.github/workflows/pr-check.yml @@ -4,7 +4,7 @@ name: Pull Request Validation on: pull_request: - types: [opened, edited, reopened] + types: [opened, edited, reopened, synchronize] jobs: check-pr-content: runs-on: ubuntu-latest diff --git a/.github/workflows/releaser.yml b/.github/workflows/releaser.yml index 6343b7676b..fccbfd08a2 100644 --- a/.github/workflows/releaser.yml +++ b/.github/workflows/releaser.yml @@ -50,17 +50,17 @@ jobs: with: fetch-depth: 0 - name: Setup Go - uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0 + uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 with: go-version-file: 'go.mod' cache: true - name: Install Syft - uses: anchore/sbom-action/download-syft@1ca97d9028b51809cf6d3c934c3e160716e1b605 # v0.17.5 + uses: anchore/sbom-action/download-syft@df80a981bc6edbc4e220a492d3cbe9f5547a6e75 # v0.17.9 - name: Install Cosign uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0 - name: Run GoReleaser id: run-goreleaser - uses: goreleaser/goreleaser-action@286f3b13b1b49da4ac219696163fb8c1c93e1200 # v6.0.0 + uses: goreleaser/goreleaser-action@9ed2f89a662bf1735a48bc8557fd212fa902bebf # v6.1.0 with: distribution: goreleaser version: "~> v2" diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index cb73ab9a21..04458a487a 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -12,7 +12,7 @@ jobs: uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Code Security Scan - uses: aquasecurity/trivy-action@915b19bbe73b92a6cf82a1bc12b087c9a19a5fe2 # v0.28.0 + uses: aquasecurity/trivy-action@18f2510ee396bbf400402947b394f2dd8c87dbb0 # v0.29.0 with: scan-type: 'fs' scanners: vuln,secret @@ -25,7 +25,7 @@ jobs: TRIVY_PASSWORD: ${{ secrets.GITHUB_TOKEN }} - name: Helm Security Scan - uses: aquasecurity/trivy-action@915b19bbe73b92a6cf82a1bc12b087c9a19a5fe2 # 0.28.0 + uses: aquasecurity/trivy-action@18f2510ee396bbf400402947b394f2dd8c87dbb0 # 0.29.0 if: always() with: scan-type: 'config' diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9f3ec8148f..182b807a14 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,7 +14,7 @@ jobs: uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 # Install Go on the VM running the action. - name: Set up Go - uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0 + uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 with: go-version-file: 'go.mod' - name: Set up helm (test dependency) @@ -53,7 +53,7 @@ jobs: uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 # Install Go on the VM running the action. - name: Set up Go - uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0 + uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 with: go-version-file: 'go.mod' - name: Run `make bootstrap` diff --git a/.github/workflows/update-docs-cli.yml b/.github/workflows/update-docs-cli.yml index d8036e85c7..978a31a318 100644 --- a/.github/workflows/update-docs-cli.yml +++ b/.github/workflows/update-docs-cli.yml @@ -16,7 +16,7 @@ jobs: - name: Checkout repository uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Set up Go - uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0 + uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 with: go-version-file: "go.mod" - name: Update documentation @@ -34,7 +34,7 @@ jobs: echo "commit_date=$COMMIT_DATE" >> $GITHUB_OUTPUT echo "commit_author=$COMMIT_AUTHOR" >> $GITHUB_OUTPUT - name: Commit and push changes - uses: peter-evans/create-pull-request@5e914681df9dc83aa4e4905692ca88beb2f9e91f # v7.0.5 + uses: peter-evans/create-pull-request@67ccf781d68cd99b580ae25a5c18a1cc84ffff1f # v7.0.6 with: commit-message: Update documentation committer: GitHub diff --git a/.github/workflows/update-docs-dbschema.yml b/.github/workflows/update-docs-dbschema.yml index c4824f3898..45f1a317db 100644 --- a/.github/workflows/update-docs-dbschema.yml +++ b/.github/workflows/update-docs-dbschema.yml @@ -30,7 +30,7 @@ jobs: echo "commit_date=$COMMIT_DATE" >> $GITHUB_OUTPUT echo "commit_author=$COMMIT_AUTHOR" >> $GITHUB_OUTPUT - name: Commit and push changes - uses: peter-evans/create-pull-request@5e914681df9dc83aa4e4905692ca88beb2f9e91f # v7.0.5 + uses: peter-evans/create-pull-request@67ccf781d68cd99b580ae25a5c18a1cc84ffff1f # v7.0.6 with: commit-message: Update DB schema committer: GitHub diff --git a/.github/workflows/update-docs-helm.yml b/.github/workflows/update-docs-helm.yml index 5e943c82ac..c596d21629 100644 --- a/.github/workflows/update-docs-helm.yml +++ b/.github/workflows/update-docs-helm.yml @@ -20,7 +20,7 @@ jobs: - name: Checkout repository uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Set up Go - uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0 + uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 with: go-version-file: "go.mod" - name: install helm-docs @@ -42,7 +42,7 @@ jobs: echo "commit_date=$COMMIT_DATE" >> $GITHUB_OUTPUT echo "commit_author=$COMMIT_AUTHOR" >> $GITHUB_OUTPUT - name: Commit and push changes - uses: peter-evans/create-pull-request@5e914681df9dc83aa4e4905692ca88beb2f9e91f # v7.0.5 + uses: peter-evans/create-pull-request@67ccf781d68cd99b580ae25a5c18a1cc84ffff1f # v7.0.6 with: commit-message: Update helm documentation committer: GitHub diff --git a/.gitignore b/.gitignore index 9b23a66018..618c80c254 100644 --- a/.gitignore +++ b/.gitignore @@ -44,7 +44,6 @@ Thumbs.db .tool-versions # Minder-specific files -.ssh/ cmd/server/__debug_bin .resolved-compose.yaml .github_client_id/ diff --git a/.goreleaser.yaml b/.goreleaser.yaml index c38974095d..52eaeaf405 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -47,14 +47,14 @@ archives: # This section defines how to release to winget. winget: - name: minder - publisher: stacklok + publisher: mindersec license: Apache-2.0 license_url: "https://github.com/mindersec/minder/blob/main/LICENSE" - copyright: Stacklok, Inc. - homepage: https://stacklok.com - short_description: 'minder is the client CLI for interacting with Minder by Stacklok.' + copyright: Minder + homepage: https://mindersec.github.io/ + short_description: 'minder is the client CLI for interacting with Minder' publisher_support_url: "https://github.com/mindersec/minder/issues/new/choose" - package_identifier: "stacklok.minder" + package_identifier: "mindersec.minder" url_template: "https://github.com/mindersec/minder/releases/download/{{ .Tag }}/{{ .ArtifactName }}" skip_upload: auto release_notes: "{{.Changelog}}" @@ -66,7 +66,7 @@ winget: email: info@stacklok.com goamd64: v1 repository: - owner: stacklok + owner: mindersec name: winget-pkgs branch: "minder-{{.Version}}" token: "{{ .Env.WINGET_GITHUB_TOKEN }}" diff --git a/.mk/develop.mk b/.mk/develop.mk index f5ee4f3020..5a68cd824d 100644 --- a/.mk/develop.mk +++ b/.mk/develop.mk @@ -21,8 +21,8 @@ run-server: ## run the app .PHONY: run-docker-teardown run-docker-teardown: ## teardown the docker compose environment ifeq ($(RUN_DOCKER_NO_TEARDOWN),false) - @echo "Running docker compose down" - @$(COMPOSE) down + @echo "Running docker compose down $(services)..." + @$(COMPOSE) down $(services) else @echo "Skipping docker compose down" endif @@ -42,7 +42,7 @@ run-docker: run-docker-teardown ## run the app under docker compose .PHONY: stop-docker stop-docker: ## stop the app under docker compose @echo "Running docker compose down $(services)..." - @$(COMPOSE) down + @$(COMPOSE) down $(services) .PHONY: pre-commit pre-commit: ## run pre-commit hooks diff --git a/.mk/test.mk b/.mk/test.mk index f5b8cd96a8..0de0425aa1 100644 --- a/.mk/test.mk +++ b/.mk/test.mk @@ -4,8 +4,8 @@ # exclude auto-generated DB code as well as mocks # in future, we may want to parse these from a file instead of hardcoding them # in the Makefile -COVERAGE_EXCLUSIONS="internal/db\|/mock/\|internal/auth/keycloak/client\|internal/proto" -COVERAGE_PACKAGES=./internal/... +COVERAGE_EXCLUSIONS="internal/db\|/mock/\|internal/auth/keycloak/client\|internal/proto\|pkg/api\|pkg/testkit" +COVERAGE_PACKAGES=./internal/...,./pkg/... .PHONY: clean clean:: ## clean up environment diff --git a/.trivy.yml b/.trivy.yml index 52a67fbd92..004dd491fa 100644 --- a/.trivy.yml +++ b/.trivy.yml @@ -13,3 +13,5 @@ scan: # Default is empty skip-dirs: - docs/ + - ".cache/trivy/" + - internal/engine/ingester/deps/testdata/ diff --git a/.trivyignore b/.trivyignore deleted file mode 100644 index 5dc4f55610..0000000000 --- a/.trivyignore +++ /dev/null @@ -1,5 +0,0 @@ -# We don't use the affected constructs and thus are not vulnerable. -CVE-2024-42473 -# We actually use go-tuf v2. v0.7.0 (which is vulnerable) is merely -# a transitive dependency and we're not affected by the CVE. -CVE-2024-47534 diff --git a/.trivyignore.yaml b/.trivyignore.yaml new file mode 100644 index 0000000000..c1bef9a652 --- /dev/null +++ b/.trivyignore.yaml @@ -0,0 +1,5 @@ +vulnerabilities: + - id: CVE-2024-42473 + # We actually use go-tuf v2. v0.7.0 (which is vulnerable) is merely + # a transitive dependency and we're not affected by the CVE. + - id: CVE-2024-47534 diff --git a/README.md b/README.md index fc976f014d..b732ccf917 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Continuous integration](https://github.com/mindersec/minder/actions/workflows/main.yml/badge.svg)](https://github.com/mindersec/minder/actions/workflows/main.yml) | [![Coverage Status](https://coveralls.io/repos/github/mindersec/minder/badge.svg?branch=main)](https://coveralls.io/github/mindersec/minder?branch=main) | [![License: Apache 2.0](https://img.shields.io/badge/License-Apache2.0-brightgreen.svg)](https://opensource.org/licenses/Apache-2.0) | [![SLSA 3](https://slsa.dev/images/gh-badge-level3.svg)](https://slsa.dev) | [![](https://dcbadge.vercel.app/api/server/RkzVuTp3WK?logo=discord&label=Discord&color=5865&style=flat)](https://discord.gg/RkzVuTp3WK) --- -[Installation](https://minder-docs.stacklok.dev/getting_started/install_cli) | [Documentation](https://minder-docs.stacklok.dev) | [Releases](https://github.com/mindersec/minder/releases) +[Installation](https://minder-docs.stacklok.dev/getting_started/install_cli) | [Documentation](https://mindersec.github.io/) | [Releases](https://github.com/mindersec/minder/releases) --- # What is Minder? @@ -26,7 +26,7 @@ allowing users to integrate with their existing tooling and processes. * **Repo configuration and security:** Simplify configuration and management of security settings and policies across repos. * **Proactive security enforcement:** Continuously enforce best practice security configurations by setting granular policies to alert only or auto-remediate. * **Artifact attestation:** Continuously verify that packages are signed to ensure they’re tamper-proof, using the open source project Sigstore. -* **Dependency management:** Manage dependency security posture by helping developers make better choices and enforcing controls. Minder is integrated with [OSV](https://osv.dev/) and [Trusty](https://trustypkg.dev) to enable policy-driven dependency management based on the risk level of dependencies. +* **Dependency management:** Manage dependency security posture by helping developers make better choices and enforcing controls. Minder is integrated with [OSV](https://osv.dev/) and [Stacklok Insight](https://insight.stacklok.com) to enable policy-driven dependency management based on the risk level of dependencies. ## Public Instance @@ -62,7 +62,7 @@ brew install minder Make sure you have [Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/) installed. ```bash -winget install stacklok.minder +winget install mindersec.minder ``` ### Download a release @@ -129,16 +129,16 @@ where you can manage your registered repositories, create profiles, rules and mu configured consistently and securely. For more information about `minder`, see: -* `minder` CLI commands - [Docs](https://minder-docs.stacklok.dev/ref/cli/minder). -* `minder` REST API Documentation - [Docs](https://minder-docs.stacklok.dev/ref/api). +* `minder` CLI commands - [Docs](https://mindersec.github.io/ref/cli/minder). +* `minder` REST API Documentation - [Docs](https://mindersec.github.io/ref/api). * `minder` rules and profiles maintained by Minder's team - [GitHub](https://github.com/mindersec/minder-rules-and-profiles). -* Minder documentation - [Docs](https://minder-docs.stacklok.dev). +* Minder documentation - [Docs](https://mindersec.github.io/). # Roadmap The Minder community are actively working on new features and improvements for Minder. -You can find our roadmap [here](https://minder-docs.stacklok.dev/about/roadmap). +You can find our roadmap [here](https://mindersec.github.io/about/roadmap). Should you wish to request or contribute a feature or improvement, please use the following [issue template](https://github.com/mindersec/minder/issues/new?template=enhancement.yml) @@ -199,7 +199,7 @@ cp config/server-config.yaml.example server-config.yaml You'd also have to set up an OAuth2 application for `minder-server` to use. Once completed, update the configuration file with the appropriate values. -See the documentation on how to do that - [Docs](https://minder-docs.stacklok.dev/run_minder_server/config_oauth). +See the documentation on how to do that - [Docs](https://mindersec.github.io/run_minder_server/config_oauth). #### Run `minder-server` @@ -240,13 +240,13 @@ By default, the `minder` CLI will point to the production Stacklok environment i ### Development guidelines -You can find more detailed information about the development process in the [Developer Guide](https://minder-docs.stacklok.dev/developer_guide/get-hacking). +You can find more detailed information about the development process in the [Developer Guide](https://mindersec.github.io/developer_guide/get-hacking). ## Minder API -* REST API documentation - [Link](https://minder-docs.stacklok.dev/ref/api). +* REST API documentation - [Link](https://mindersec.github.io/ref/api). -* Proto API documentation - [Link](https://minder-docs.stacklok.dev/ref/proto). +* Proto API documentation - [Link](https://mindersec.github.io/ref/proto). * Protobuf - [Link](https://github.com/mindersec/minder/blob/main/proto/minder/v1/minder.proto). diff --git a/cmd/cli/app/auth/auth_delete.go b/cmd/cli/app/auth/auth_delete.go index 55bbb251a8..feb1f847a3 100644 --- a/cmd/cli/app/auth/auth_delete.go +++ b/cmd/cli/app/auth/auth_delete.go @@ -82,7 +82,7 @@ func deleteCommand(ctx context.Context, cmd *cobra.Command, _ []string, conn *gr if err != nil { cmd.Println(cli.WarningBanner.Render("Failed to remove locally stored credentials.")) } - cmd.Println(cli.SuccessBanner.Render("Successfully deleted account. It may take up to 48 hours for " + + cmd.Println(cli.SuccessBanner.Render("Successfully deleted account. It may take up to 10 minutes for " + "all data to be removed.")) return nil } diff --git a/cmd/cli/app/auth/auth_login.go b/cmd/cli/app/auth/auth_login.go index 84220f5a0b..c5e6ab8464 100644 --- a/cmd/cli/app/auth/auth_login.go +++ b/cmd/cli/app/auth/auth_login.go @@ -26,7 +26,7 @@ $XDG_CONFIG_HOME/minder/credentials.json`, } // LoginCommand is the login subcommand -func LoginCommand(ctx context.Context, cmd *cobra.Command, _ []string, conn *grpc.ClientConn) error { +func LoginCommand(ctx context.Context, cmd *cobra.Command, _ []string, _ *grpc.ClientConn) error { clientConfig, err := config.ReadConfigFromViper[clientconfig.Config](viper.GetViper()) if err != nil { return cli.MessageAndError("Unable to read config", err) @@ -40,6 +40,13 @@ func LoginCommand(ctx context.Context, cmd *cobra.Command, _ []string, conn *grp return cli.MessageAndError("Error ensuring credentials", err) } + // Get a connection to the GRPC server after we have the credentials + conn, err := cli.GrpcForCommand(cmd, viper.GetViper()) + if err != nil { + return err + } + defer conn.Close() + client := minderv1.NewUserServiceClient(conn) // check if the user already exists in the local database diff --git a/cmd/cli/app/datasource/apply.go b/cmd/cli/app/datasource/apply.go new file mode 100644 index 0000000000..7c33ba677c --- /dev/null +++ b/cmd/cli/app/datasource/apply.go @@ -0,0 +1,117 @@ +// SPDX-FileCopyrightText: Copyright 2023 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package datasource provides functionalities to manage and apply data sources. +package datasource + +import ( + "context" + "fmt" + "os" + + "github.com/spf13/cobra" + "github.com/spf13/viper" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "github.com/mindersec/minder/internal/util" + "github.com/mindersec/minder/internal/util/cli" + minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" +) + +// applyCmd represents the datasource apply command +var applyCmd = &cobra.Command{ + Use: "apply", + Short: "Apply a data source", + Long: `The datasource apply subcommand lets you create or update data sources for a project within Minder.`, + RunE: cli.GRPCClientWrapRunE(applyCommand), +} + +func init() { + DataSourceCmd.AddCommand(applyCmd) + // Flags + applyCmd.Flags().StringArrayP("file", "f", []string{}, + "Path to the YAML defining the data source (or - for stdin). Can be specified multiple times. Can be a directory.") + // Required + if err := applyCmd.MarkFlagRequired("file"); err != nil { + applyCmd.Printf("Error marking flag required: %s", err) + os.Exit(1) + } +} + +// applyCommand is the datasource apply subcommand +func applyCommand(_ context.Context, cmd *cobra.Command, _ []string, conn *grpc.ClientConn) error { + client := minderv1.NewDataSourceServiceClient(conn) + + project := viper.GetString("project") + + fileFlag, err := cmd.Flags().GetStringArray("file") + if err != nil { + return cli.MessageAndError("Error parsing file flag", err) + } + + if err = validateFilesArg(fileFlag); err != nil { + return cli.MessageAndError("Error validating file flag", err) + } + + files, err := util.ExpandFileArgs(fileFlag...) + if err != nil { + return cli.MessageAndError("Error expanding file args", err) + } + + // No longer print usage on returned error, since we've parsed our inputs + // See https://github.com/spf13/cobra/issues/340#issuecomment-374617413 + cmd.SilenceUsage = true + + table := initializeTableForList() + + applyFunc := func(ctx context.Context, fileName string, ds *minderv1.DataSource) (*minderv1.DataSource, error) { + createResp, err := client.CreateDataSource(ctx, &minderv1.CreateDataSourceRequest{ + DataSource: ds, + }) + + if err == nil { + return createResp.DataSource, nil + } + + st, ok := status.FromError(err) + if !ok { + // We can't parse the error, so just return it + return nil, fmt.Errorf("error creating data source from %s: %w", fileName, err) + } + + if st.Code() != codes.AlreadyExists { + return nil, fmt.Errorf("error creating data source from %s: %w", fileName, err) + } + + updateResp, err := client.UpdateDataSource(ctx, &minderv1.UpdateDataSourceRequest{ + DataSource: ds, + }) + + if err != nil { + return nil, fmt.Errorf("error updating data source from %s: %w", fileName, err) + } + + return updateResp.DataSource, nil + } + + for _, f := range files { + if f.Path != "-" && shouldSkipFile(f.Path) { + continue + } + // cmd.Context() is the root context. We need to create a new context for each file + // so we can avoid the timeout. + if err = executeOnOneDataSource(cmd.Context(), table, f.Path, os.Stdin, project, applyFunc); err != nil { + if f.Expanded && minderv1.YouMayHaveTheWrongResource(err) { + cmd.PrintErrf("Skipping file %s: not a data source\n", f.Path) + // We'll skip the file if it's not a data source + continue + } + return cli.MessageAndError(fmt.Sprintf("error applying data source from %s", f.Path), err) + } + } + // Render the table + table.Render() + return nil +} diff --git a/cmd/cli/app/datasource/common.go b/cmd/cli/app/datasource/common.go new file mode 100644 index 0000000000..2a137c8934 --- /dev/null +++ b/cmd/cli/app/datasource/common.go @@ -0,0 +1,144 @@ +// SPDX-FileCopyrightText: Copyright 2023 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package datasource + +import ( + "context" + "fmt" + "io" + "os" + "path/filepath" + "strings" + + "github.com/spf13/viper" + + "github.com/mindersec/minder/internal/util" + "github.com/mindersec/minder/internal/util/cli" + "github.com/mindersec/minder/internal/util/cli/table" + "github.com/mindersec/minder/internal/util/cli/table/layouts" + minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" +) + +// executeOnOneDataSource executes a function on a single data source +func executeOnOneDataSource( + ctx context.Context, + t table.Table, + f string, + dashOpen io.Reader, + proj string, + exec func(context.Context, string, *minderv1.DataSource) (*minderv1.DataSource, error), +) error { + ctx, cancel := cli.GetAppContext(ctx, viper.GetViper()) + defer cancel() + + reader, closer, err := util.OpenFileArg(f, dashOpen) + if err != nil { + return fmt.Errorf("error opening file arg: %w", err) + } + defer closer() + + ds := &minderv1.DataSource{} + if err := minderv1.ParseResourceProto(reader, ds); err != nil { + return fmt.Errorf("error parsing data source: %w", err) + } + + // Override the YAML specified project with the command line argument + if proj != "" { + if ds.Context == nil { + ds.Context = &minderv1.ContextV2{} + } + + ds.Context.ProjectId = proj + } + + if err := ds.Validate(); err != nil { + return fmt.Errorf("error validating data source: %w", err) + } + + // create or update the data source + createdDS, err := exec(ctx, f, ds) + if err != nil { + return err + } + + // add the data source to the table rows + name := appendDataSourcePropertiesToName(createdDS) + t.AddRow( + createdDS.Context.ProjectId, + createdDS.Id, + name, + cli.ConcatenateAndWrap(createdDS.Name, 20), + ) + + return nil +} + +// validateFilesArg validates the file arguments +func validateFilesArg(files []string) error { + if files == nil { + return fmt.Errorf("error: file must be set") + } + + if contains(files, "") { + return fmt.Errorf("error: file must be set") + } + + if contains(files, "-") && len(files) > 1 { + return fmt.Errorf("error: cannot use stdin with other files") + } + + return nil +} + +// contains checks if a slice contains a specific string +func contains(slice []string, item string) bool { + for _, s := range slice { + if s == item { + return true + } + } + return false +} + +// shouldSkipFile determines if a file should be skipped based on its extension +func shouldSkipFile(f string) bool { + // if the file is not json or yaml, skip it + // Get file extension + ext := filepath.Ext(f) + switch ext { + case ".yaml", ".yml", ".json": + return false + default: + fmt.Fprintf(os.Stderr, "Skipping file %s: not a yaml or json file\n", f) + return true + } +} + +// appendDataSourcePropertiesToName appends the data source properties to the name. The format is: +// () +// where is a comma separated list of properties. +func appendDataSourcePropertiesToName(ds *minderv1.DataSource) string { + name := ds.Name + properties := []string{} + // add the type property if it is present + dType := ds.GetDriverType() + if dType != "" { + properties = append(properties, fmt.Sprintf("type: %s", dType)) + } + + // add other properties as needed + + // return the name with the properties if any + if len(properties) != 0 { + return fmt.Sprintf("%s (%s)", name, strings.Join(properties, ", ")) + } + + // return only name otherwise + return name +} + +// initializeTableForList initializes the table for listing data sources +func initializeTableForList() table.Table { + return table.New(table.Simple, layouts.DataSourceList, nil) +} diff --git a/cmd/cli/app/datasource/create.go b/cmd/cli/app/datasource/create.go new file mode 100644 index 0000000000..1042a527a6 --- /dev/null +++ b/cmd/cli/app/datasource/create.go @@ -0,0 +1,98 @@ +// SPDX-FileCopyrightText: Copyright 2023 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package datasource + +import ( + "context" + "fmt" + "os" + + "github.com/spf13/cobra" + "github.com/spf13/viper" + "google.golang.org/grpc" + + "github.com/mindersec/minder/internal/util" + "github.com/mindersec/minder/internal/util/cli" + minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" +) + +// createCmd represents the datasource create command +var createCmd = &cobra.Command{ + Use: "create", + Short: "Create a data source", + Long: `The datasource create subcommand lets you create new data sources for a project within Minder.`, + RunE: cli.GRPCClientWrapRunE(createCommand), +} + +func init() { + DataSourceCmd.AddCommand(createCmd) + // Flags + createCmd.Flags().StringArrayP("file", "f", []string{}, + "Path to the YAML defining the data source (or - for stdin). Can be specified multiple times. Can be a directory.") + // Required + if err := createCmd.MarkFlagRequired("file"); err != nil { + createCmd.Printf("Error marking flag required: %s", err) + os.Exit(1) + } +} + +// createCommand is the datasource create subcommand +func createCommand(_ context.Context, cmd *cobra.Command, _ []string, conn *grpc.ClientConn) error { + client := minderv1.NewDataSourceServiceClient(conn) + + project := viper.GetString("project") + + fileFlag, err := cmd.Flags().GetStringArray("file") + if err != nil { + return cli.MessageAndError("Error parsing file flag", err) + } + + if err = validateFilesArg(fileFlag); err != nil { + return cli.MessageAndError("Error validating file flag", err) + } + + files, err := util.ExpandFileArgs(fileFlag...) + if err != nil { + return cli.MessageAndError("Error expanding file args", err) + } + + // No longer print usage on returned error, since we've parsed our inputs + // See https://github.com/spf13/cobra/issues/340#issuecomment-374617413 + cmd.SilenceUsage = true + + table := initializeTableForList() + + createFunc := func(ctx context.Context, _ string, ds *minderv1.DataSource) (*minderv1.DataSource, error) { + resp, err := client.CreateDataSource(ctx, &minderv1.CreateDataSourceRequest{ + DataSource: ds, + }) + if err != nil { + return nil, err + } + + return resp.DataSource, nil + } + + for _, f := range files { + if f.Path != "-" && shouldSkipFile(f.Path) { + continue + } + // cmd.Context() is the root context. We need to create a new context for each file + // so we can avoid the timeout. + if err = executeOnOneDataSource(cmd.Context(), table, f.Path, os.Stdin, project, createFunc); err != nil { + // We swallow errors if you're loading a directory to avoid failing + // on test files. + if f.Expanded && minderv1.YouMayHaveTheWrongResource(err) { + cmd.PrintErrf("Skipping file %s: not a data source\n", f.Path) + // We'll skip the file if it's not a data source + continue + } + return cli.MessageAndError(fmt.Sprintf("Error creating data source from %s", f.Path), err) + } + } + + // Render the table + table.Render() + return nil +} diff --git a/cmd/cli/app/datasource/datasource.go b/cmd/cli/app/datasource/datasource.go new file mode 100644 index 0000000000..060975023d --- /dev/null +++ b/cmd/cli/app/datasource/datasource.go @@ -0,0 +1,26 @@ +// SPDX-FileCopyrightText: Copyright 2023 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package datasource + +import ( + "github.com/spf13/cobra" + + "github.com/mindersec/minder/cmd/cli/app" +) + +// DataSourceCmd is the root command for the data source subcommands +var DataSourceCmd = &cobra.Command{ + Use: "datasource", + Short: "Manage data sources within a minder control plane", + Long: "The data source subcommand allows the management of data sources within Minder.", + RunE: func(cmd *cobra.Command, _ []string) error { + return cmd.Usage() + }, +} + +func init() { + app.RootCmd.AddCommand(DataSourceCmd) + // Flags for all subcommands + DataSourceCmd.PersistentFlags().StringP("project", "j", "", "ID of the project") +} diff --git a/cmd/cli/app/datasource/delete.go b/cmd/cli/app/datasource/delete.go new file mode 100644 index 0000000000..2e273561a2 --- /dev/null +++ b/cmd/cli/app/datasource/delete.go @@ -0,0 +1,94 @@ +// SPDX-FileCopyrightText: Copyright 2023 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package datasource + +import ( + "context" + "fmt" + "strings" + + "github.com/spf13/cobra" + "github.com/spf13/viper" + "google.golang.org/grpc" + + "github.com/mindersec/minder/cmd/cli/app" + "github.com/mindersec/minder/internal/util/cli" + minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" +) + +var deleteCmd = &cobra.Command{ + Use: "delete", + Short: "Delete a data source", + Long: `The datasource delete subcommand lets you delete a data source within Minder.`, + RunE: cli.GRPCClientWrapRunE(deleteCommand), +} + +// deleteCommand is the datasource delete subcommand +func deleteCommand(ctx context.Context, cmd *cobra.Command, _ []string, conn *grpc.ClientConn) error { + client := minderv1.NewDataSourceServiceClient(conn) + + project := viper.GetString("project") + format := viper.GetString("output") + id := viper.GetString("id") + name := viper.GetString("name") + + // No longer print usage on returned error, since we've parsed our inputs + cmd.SilenceUsage = true + + if id == "" && name == "" { + return fmt.Errorf("either id or name must be specified") + } + + var err error + + if id != "" { + _, err = client.DeleteDataSourceById(ctx, &minderv1.DeleteDataSourceByIdRequest{ + Context: &minderv1.ContextV2{ + ProjectId: project, + }, + Id: id, + }) + } else { + _, err = client.DeleteDataSourceByName(ctx, &minderv1.DeleteDataSourceByNameRequest{ + Context: &minderv1.ContextV2{ + ProjectId: project, + }, + Name: name, + }) + } + + if err != nil { + return cli.MessageAndError("Failed to delete data source", err) + } + + return outputDeleteResult(cmd, format, id, name) +} + +func outputDeleteResult(cmd *cobra.Command, format, id, name string) error { + switch format { + case app.JSON: + cmd.Println(`{"status": "success"}`) + case app.YAML: + cmd.Println("status: success") + default: + if id != "" { + cmd.Printf("Successfully deleted data source with ID: %s\n", id) + } else { + cmd.Printf("Successfully deleted data source with Name: %s\n", name) + } + } + return nil +} + +func init() { + DataSourceCmd.AddCommand(deleteCmd) + + deleteCmd.Flags().StringP("output", "o", app.Table, + fmt.Sprintf("Output format (one of %s)", strings.Join(app.SupportedOutputFormats(), ","))) + deleteCmd.Flags().StringP("id", "i", "", "ID of the data source to delete") + deleteCmd.Flags().StringP("name", "n", "", "Name of the data source to delete") + + // Ensure at least one of id or name is required + deleteCmd.MarkFlagsOneRequired("id", "name") +} diff --git a/cmd/cli/app/datasource/get.go b/cmd/cli/app/datasource/get.go new file mode 100644 index 0000000000..bc37c8e48f --- /dev/null +++ b/cmd/cli/app/datasource/get.go @@ -0,0 +1,111 @@ +// SPDX-FileCopyrightText: Copyright 2023 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package datasource + +import ( + "context" + "fmt" + "strings" + + "github.com/spf13/cobra" + "github.com/spf13/viper" + "google.golang.org/grpc" + + "github.com/mindersec/minder/cmd/cli/app" + "github.com/mindersec/minder/internal/util" + "github.com/mindersec/minder/internal/util/cli" + "github.com/mindersec/minder/internal/util/cli/table" + "github.com/mindersec/minder/internal/util/cli/table/layouts" + minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" +) + +var getCmd = &cobra.Command{ + Use: "get", + Short: "Get data source details", + Long: `The datasource get subcommand lets you retrieve details for a data source within Minder.`, + RunE: cli.GRPCClientWrapRunE(getCommand), +} + +// getCommand is the datasource get subcommand +func getCommand(ctx context.Context, cmd *cobra.Command, _ []string, conn *grpc.ClientConn) error { + client := minderv1.NewDataSourceServiceClient(conn) + + project := viper.GetString("project") + format := viper.GetString("output") + id := viper.GetString("id") + name := viper.GetString("name") + + // No longer print usage on returned error, since we've parsed our inputs + cmd.SilenceUsage = true + + var err error + var ds *minderv1.DataSource + + if id == "" && name == "" { + return fmt.Errorf("either id or name must be specified") + } + + var resp interface { + GetDataSource() *minderv1.DataSource + } + + if id != "" { + resp, err = client.GetDataSourceById(ctx, &minderv1.GetDataSourceByIdRequest{ + Context: &minderv1.ContextV2{ + ProjectId: project, + }, + Id: id, + }) + } else { + resp, err = client.GetDataSourceByName(ctx, &minderv1.GetDataSourceByNameRequest{ + Context: &minderv1.ContextV2{ + ProjectId: project, + }, + Name: name, + }) + } + + if err != nil { + return cli.MessageAndError("Failed to get data source", err) + } + + ds = resp.GetDataSource() + return outputDataSource(cmd, format, ds) +} + +func outputDataSource(cmd *cobra.Command, format string, ds *minderv1.DataSource) error { + switch format { + case app.JSON: + out, err := util.GetJsonFromProto(ds) + if err != nil { + return cli.MessageAndError("Error getting json from proto", err) + } + cmd.Println(out) + case app.YAML: + out, err := util.GetYamlFromProto(ds) + if err != nil { + return cli.MessageAndError("Error getting yaml from proto", err) + } + cmd.Println(out) + case app.Table: + t := table.New(table.Simple, layouts.Default, []string{"ID", "Name", "Type"}) + t.AddRow(ds.Id, ds.Name, ds.GetDriverType()) + t.Render() + default: + return fmt.Errorf("unsupported output format: %s", format) + } + return nil +} + +func init() { + DataSourceCmd.AddCommand(getCmd) + + getCmd.Flags().StringP("output", "o", app.Table, + fmt.Sprintf("Output format (one of %s)", strings.Join(app.SupportedOutputFormats(), ","))) + getCmd.Flags().StringP("id", "i", "", "ID of the data source to get info from") + getCmd.Flags().StringP("name", "n", "", "Name of the data source to get info from") + + // Ensure at least one of id or name is required + getCmd.MarkFlagsOneRequired("id", "name") +} diff --git a/cmd/cli/app/datasource/list.go b/cmd/cli/app/datasource/list.go new file mode 100644 index 0000000000..3dd7db10af --- /dev/null +++ b/cmd/cli/app/datasource/list.go @@ -0,0 +1,81 @@ +// SPDX-FileCopyrightText: Copyright 2023 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package datasource + +import ( + "context" + "fmt" + "strings" + + "github.com/spf13/cobra" + "github.com/spf13/viper" + "google.golang.org/grpc" + + "github.com/mindersec/minder/cmd/cli/app" + "github.com/mindersec/minder/internal/util" + "github.com/mindersec/minder/internal/util/cli" + "github.com/mindersec/minder/internal/util/cli/table" + "github.com/mindersec/minder/internal/util/cli/table/layouts" + minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" +) + +var listCmd = &cobra.Command{ + Use: "list", + Short: "List data sources", + Long: `The datasource list subcommand lets you list all data sources within Minder.`, + RunE: cli.GRPCClientWrapRunE(listCommand), +} + +// listCommand is the datasource list subcommand +func listCommand(ctx context.Context, cmd *cobra.Command, _ []string, conn *grpc.ClientConn) error { + client := minderv1.NewDataSourceServiceClient(conn) + + project := viper.GetString("project") + format := viper.GetString("output") + + // No longer print usage on returned error, since we've parsed our inputs + // See https://github.com/spf13/cobra/issues/340#issuecomment-374617413 + cmd.SilenceUsage = true + + resp, err := client.ListDataSources(ctx, &minderv1.ListDataSourcesRequest{ + Context: &minderv1.ContextV2{ + ProjectId: project, + }, + }) + if err != nil { + return cli.MessageAndError("Failed to list data sources", err) + } + + switch format { + case app.JSON: + out, err := util.GetJsonFromProto(resp) + if err != nil { + return cli.MessageAndError("Error getting json from proto", err) + } + cmd.Println(out) + case app.YAML: + out, err := util.GetYamlFromProto(resp) + if err != nil { + return cli.MessageAndError("Error getting yaml from proto", err) + } + cmd.Println(out) + case app.Table: + t := table.New(table.Simple, layouts.Default, []string{"ID", "Name", "Type"}) + for _, ds := range resp.GetDataSources() { + t.AddRow(ds.Id, ds.Name, ds.GetDriverType()) + } + t.Render() + default: + return fmt.Errorf("unsupported output format: %s", format) + } + + return nil +} + +func init() { + DataSourceCmd.AddCommand(listCmd) + + listCmd.Flags().StringP("output", "o", app.Table, + fmt.Sprintf("Output format (one of %s)", strings.Join(app.SupportedOutputFormats(), ","))) +} diff --git a/cmd/cli/app/history/history_list.go b/cmd/cli/app/history/history_list.go index b62afef1be..e86f3fad30 100644 --- a/cmd/cli/app/history/history_list.go +++ b/cmd/cli/app/history/history_list.go @@ -7,6 +7,7 @@ import ( "context" "fmt" "io" + "os" "slices" "strings" "time" @@ -48,6 +49,7 @@ func listCommand(ctx context.Context, cmd *cobra.Command, _ []string, conn *grpc evalStatus := viper.GetStringSlice("eval-status") remediationStatus := viper.GetStringSlice("remediation-status") alertStatus := viper.GetStringSlice("alert-status") + labels := viper.GetStringSlice("label") // time range from := viper.GetTime("from") @@ -90,6 +92,7 @@ func listCommand(ctx context.Context, cmd *cobra.Command, _ []string, conn *grpc Status: evalStatus, Remediation: remediationStatus, Alert: alertStatus, + LabelFilter: labels, From: nil, To: nil, Cursor: cursorFromOptions(cursorStr, size), @@ -223,6 +226,11 @@ func init() { listCmd.Flags().StringSlice("eval-status", nil, evalFilterMsg) listCmd.Flags().StringSlice("remediation-status", nil, remediationFilterMsg) listCmd.Flags().StringSlice("alert-status", nil, alertFilterMsg) + listCmd.Flags().StringSliceP("label", "l", nil, "Filter evaluation history list by label") + if err := listCmd.Flags().MarkHidden("label"); err != nil { + listCmd.Printf("Error hiding flag: %s", err) + os.Exit(1) + } listCmd.Flags().String("from", "", "Filter evaluation history list by time") listCmd.Flags().String("to", "", "Filter evaluation history list by time") listCmd.Flags().StringP("cursor", "c", "", "Fetch previous or next page from the list") diff --git a/cmd/cli/app/profile/get.go b/cmd/cli/app/profile/get.go index 7cc01bb628..1417f80e15 100644 --- a/cmd/cli/app/profile/get.go +++ b/cmd/cli/app/profile/get.go @@ -72,7 +72,7 @@ func getCommand(ctx context.Context, cmd *cobra.Command, _ []string, conn *grpc. switch format { case app.YAML: - out, err := util.GetYamlFromProto(resp) + out, err := util.GetYamlFromProto(prof) if err != nil { return cli.MessageAndError("Error getting yaml from proto", err) } diff --git a/cmd/cli/app/profile/list.go b/cmd/cli/app/profile/list.go index ae62e01b45..52603027bc 100644 --- a/cmd/cli/app/profile/list.go +++ b/cmd/cli/app/profile/list.go @@ -59,11 +59,14 @@ func listCommand(ctx context.Context, cmd *cobra.Command, _ []string, conn *grpc } cmd.Println(out) case app.YAML: - out, err := util.GetYamlFromProto(resp) - if err != nil { - return fmt.Errorf("error getting yaml from proto: %w", err) + for _, prof := range resp.GetProfiles() { + out, err := util.GetYamlFromProto(prof) + if err != nil { + return fmt.Errorf("error getting yaml from proto: %w", err) + } + cmd.Println("---") + cmd.Println(out) } - cmd.Println(out) case app.Table: settable := NewProfileSettingsTable() for _, v := range resp.Profiles { diff --git a/cmd/cli/app/profile/table_render.go b/cmd/cli/app/profile/table_render.go index 8ea52e7594..95d0739628 100644 --- a/cmd/cli/app/profile/table_render.go +++ b/cmd/cli/app/profile/table_render.go @@ -4,6 +4,9 @@ package profile import ( + "fmt" + "slices" + "strings" "time" "google.golang.org/protobuf/types/known/structpb" @@ -104,11 +107,15 @@ func RenderRuleEvaluationStatusTable( statuses []*minderv1.RuleEvaluationStatus, t table.Table, ) { + // sort by entity + slices.SortFunc(statuses, func(a *minderv1.RuleEvaluationStatus, b *minderv1.RuleEvaluationStatus) int { + return strings.Compare(a.EntityInfo["name"], b.EntityInfo["name"]) + }) + for _, eval := range statuses { t.AddRowWithColor( - layouts.NoColor(eval.RuleDescriptionName), - layouts.NoColor(eval.RuleTypeName), - layouts.NoColor(eval.Entity), + layouts.NoColor(fmt.Sprintf("%s\n[%s]", eval.RuleDescriptionName, eval.RuleTypeName)), + layouts.NoColor(fmt.Sprintf("%s\n[%s]", eval.EntityInfo["name"], eval.Entity)), common.GetEvalStatusColor(eval.Status), common.GetRemediateStatusColor(eval.RemediationStatus), layouts.NoColor(mapToYAMLOrEmpty(eval.EntityInfo)), diff --git a/cmd/cli/app/provider/provider_enroll.go b/cmd/cli/app/provider/provider_enroll.go index cd37a3a863..3b2a42107f 100644 --- a/cmd/cli/app/provider/provider_enroll.go +++ b/cmd/cli/app/provider/provider_enroll.go @@ -203,7 +203,6 @@ func enrollUsingOAuth2Flow( resp, err := oauthClient.GetAuthorizationURL(ctx, &minderv1.GetAuthorizationURLRequest{ Context: &minderv1.Context{Provider: &providerName, Project: &project}, Cli: true, - Port: port, Owner: &owner, Config: providerConfig, ProviderClass: providerClass, diff --git a/cmd/cli/app/provider/provider_get.go b/cmd/cli/app/provider/provider_get.go index eeee1af425..a350577942 100644 --- a/cmd/cli/app/provider/provider_get.go +++ b/cmd/cli/app/provider/provider_get.go @@ -81,6 +81,7 @@ func GetProviderCommand(ctx context.Context, cmd *cobra.Command, _ []string, con impls := getImplementsAsStrings(p) afs := getAuthFlowsAsStrings(p) + t.AddRow("ID", p.GetId()) t.AddRow("Name", p.GetName()) t.AddRow("Project", p.GetProject()) t.AddRow("Version", p.GetVersion()) diff --git a/cmd/cli/app/quickstart/embed/secret_scanning.yaml b/cmd/cli/app/quickstart/embed/secret_scanning.yaml index 173622458b..00d8dc17c8 100644 --- a/cmd/cli/app/quickstart/embed/secret_scanning.yaml +++ b/cmd/cli/app/quickstart/embed/secret_scanning.yaml @@ -3,18 +3,30 @@ --- version: v1 +release_phase: beta type: rule-type name: secret_scanning +display_name: Enable secret scanning to detect hardcoded secrets +short_failure_message: Secret scanning is not enabled +severity: + value: high context: provider: github -description: Verifies that secret scanning is enabled for a given repository. +description: | + Verifies that secret scanning is enabled for a given repository. + Note that this will will not work as expected for private repositories + unless you have GitHub Advanced Security enabled. If you still want to use + this rule because you have a mixture of private and public repositories, + enable the `skip_private_repos` flag. guidance: | - Secret scanning is a feature that scans repositories for secrets and alerts - the repository owner when a secret is found. To enable this feature in GitHub, - you must enable it in the repository settings. + Ensure that secret scanning is enabled for the repository. - For more information, see - https://docs.github.com/en/github/administering-a-repository/about-secret-scanning + Secret scanning is a feature that scans repositories for secrets and + alerts the repository owner when a secret is found. To enable this + feature in GitHub, you must enable it in the repository settings. + + For more information, see [GitHub's + documentation](https://docs.github.com/en/github/administering-a-repository/about-secret-scanning). def: # Defines the section of the pipeline the rule will appear in. # This will affect the template used to render multiple parts @@ -23,9 +35,11 @@ def: # Defines the schema for writing a rule with this rule being checked rule_schema: properties: - enabled: + skip_private_repos: type: boolean default: true + description: | + If true, this rule will be marked as skipped for private repositories # Defines the configuration for ingesting data relevant for the rule ingest: type: rest @@ -39,14 +53,26 @@ def: parse: json # Defines the configuration for evaluating data ingested against the given profile eval: - type: jq - jq: - # Ingested points to the data retrieved in the `ingest` section - - ingested: - def: '.security_and_analysis.secret_scanning.status == "enabled"' - # profile points to the profile itself. - profile: - def: ".enabled" + type: rego + rego: + type: deny-by-default + def: | + package minder + + import future.keywords.if + + default allow := false + default skip := false + default message := "Secret scanning is disabled" + + allow if { + input.ingested.security_and_analysis.secret_scanning.status == "enabled" + } + + skip if { + input.profile.skip_private_repos == true + input.ingested.private == true + } remediate: type: rest rest: @@ -57,5 +83,4 @@ def: # Defines the configuration for alerting on the rule alert: type: security_advisory - security_advisory: - severity: "medium" + security_advisory: {} diff --git a/cmd/cli/app/repo/repo_register.go b/cmd/cli/app/repo/repo_register.go index 909909ed08..be341017d8 100644 --- a/cmd/cli/app/repo/repo_register.go +++ b/cmd/cli/app/repo/repo_register.go @@ -5,6 +5,7 @@ package repo import ( "context" + "errors" "fmt" "slices" @@ -50,13 +51,22 @@ func RegisterCmd(ctx context.Context, cmd *cobra.Command, _ []string, conn *grpc providerClient := minderv1.NewProvidersServiceClient(conn) - err := enableAutoRegistration(ctx, cmd, providerClient, project, provider) + ret, err := enableAutoRegistration(ctx, providerClient, project, provider) if err != nil { - return cli.MessageAndError("Error enabling auto registration", err) + cmd.Println("Enabling auto registration failed for one or more providers.") + } else { + cmd.Println("Enabling auto registration succeeded.") + } + if len(ret.alreadyEnabled) > 0 { + cmd.Println(fmt.Sprintf("Auto registration is already enabled for: %v", ret.alreadyEnabled)) + } + if len(ret.failedProviders) > 0 { + cmd.Println(fmt.Sprintf("Failed to enable: %v", ret.failedProviders)) + } + if len(ret.updatedProviders) > 0 { + cmd.Println(fmt.Sprintf("Successfully enabled: %v", ret.updatedProviders)) + cmd.Println("Use `minder repo list` to check the list of registered repositories.") } - cmd.Println("Enabled auto registration for future repositories") - cmd.Println("Issued task to register all currently available repositories") - cmd.Println("Use `minder repo list` to check the list registered repositories") return nil } @@ -244,26 +254,39 @@ func printRepoRegistrationStatus(cmd *cobra.Command, results []*minderv1.Registe t.Render() } +var errAutoRegistrationAlreadyEnabled = errors.New("auto registration is already enabled") + +type autoRegisterResult struct { + updatedProviders []string + failedProviders []string + alreadyEnabled []string +} + func enableAutoRegistration( ctx context.Context, - cmd *cobra.Command, provCli minderv1.ProvidersServiceClient, project, provName string, -) error { +) (autoRegisterResult, error) { if provName != "" { - return enableAutoRegistrationForProvider(ctx, cmd, provCli, project, provName) + err := enableAutoRegistrationForProvider(ctx, provCli, project, provName) + if err != nil { + if errors.Is(err, errAutoRegistrationAlreadyEnabled) { + return autoRegisterResult{alreadyEnabled: []string{provName}}, nil + } + return autoRegisterResult{failedProviders: []string{provName}}, err + } + return autoRegisterResult{updatedProviders: []string{provName}}, nil } - - return enableAutoRegistrationAllProviders(ctx, cmd, provCli, project) + return enableAutoRegistrationAllProviders(ctx, provCli, project) } func enableAutoRegistrationAllProviders( ctx context.Context, - cmd *cobra.Command, provCli minderv1.ProvidersServiceClient, project string, -) error { +) (autoRegisterResult, error) { var cursor string + ret := autoRegisterResult{} for { allProviders, err := provCli.ListProviders(ctx, &minderv1.ListProvidersRequest{ @@ -274,7 +297,7 @@ func enableAutoRegistrationAllProviders( }) if err != nil { - return cli.MessageAndError("failed to get providers", err) + return ret, cli.MessageAndError("failed to get providers", err) } cursor = allProviders.Cursor @@ -284,12 +307,21 @@ func enableAutoRegistrationAllProviders( continue } - err := enableAutoRegistrationForProvider(ctx, cmd, provCli, project, provider.Name) + err := enableAutoRegistrationForProvider(ctx, provCli, project, provider.Name) if err != nil { - // we could print a diagnostical message here, but since the legacy github provider doesn't support + if errors.Is(err, errAutoRegistrationAlreadyEnabled) { + // Store the provider name that was already enabled + ret.alreadyEnabled = append(ret.alreadyEnabled, provider.Name) + continue + } + // Store the provider name that failed to update + ret.failedProviders = append(ret.failedProviders, provider.Name) + // we could print a diagnostic message here, but since the legacy github provider doesn't support // auto-enrollment and we still pre-create it, the user would see the message all the time. continue } + // Store the provider name that was successfully updated + ret.updatedProviders = append(ret.updatedProviders, provider.Name) } if allProviders.Cursor == "" { @@ -297,12 +329,15 @@ func enableAutoRegistrationAllProviders( } } - return nil + // If there are failed providers, return an error + if len(ret.failedProviders) > 0 { + return ret, fmt.Errorf("failed to enable auto registration for some providers") + } + return ret, nil } func enableAutoRegistrationForProvider( ctx context.Context, - cmd *cobra.Command, provCli minderv1.ProvidersServiceClient, project, providerName string, ) error { @@ -333,7 +368,7 @@ func enableAutoRegistrationForProvider( } if repoReg.GetEnabled() { - cmd.Printf("Auto registration is already enabled for %s\n", providerName) + return errAutoRegistrationAlreadyEnabled } repoReg.Enabled = proto.Bool(true) diff --git a/cmd/cli/app/ruletype/ruletype_apply.go b/cmd/cli/app/ruletype/ruletype_apply.go index 6b9ad4f316..4e0a5e2979 100644 --- a/cmd/cli/app/ruletype/ruletype_apply.go +++ b/cmd/cli/app/ruletype/ruletype_apply.go @@ -83,7 +83,7 @@ func applyCommand(_ context.Context, cmd *cobra.Command, _ []string, conn *grpc. } for _, f := range files { - if shouldSkipFile(f.Path) { + if f.Path != "-" && shouldSkipFile(f.Path) { continue } // cmd.Context() is the root context. We need to create a new context for each file diff --git a/cmd/cli/app/ruletype/ruletype_create.go b/cmd/cli/app/ruletype/ruletype_create.go index 4325aabe90..5e24bc39b7 100644 --- a/cmd/cli/app/ruletype/ruletype_create.go +++ b/cmd/cli/app/ruletype/ruletype_create.go @@ -63,7 +63,7 @@ func createCommand(_ context.Context, cmd *cobra.Command, _ []string, conn *grpc } for _, f := range files { - if shouldSkipFile(f.Path) { + if f.Path != "-" && shouldSkipFile(f.Path) { continue } // cmd.Context() is the root context. We need to create a new context for each file diff --git a/cmd/cli/app/ruletype/ruletype_get.go b/cmd/cli/app/ruletype/ruletype_get.go index b032e56f02..b02a43e053 100644 --- a/cmd/cli/app/ruletype/ruletype_get.go +++ b/cmd/cli/app/ruletype/ruletype_get.go @@ -69,7 +69,7 @@ func getCommand(ctx context.Context, cmd *cobra.Command, _ []string, conn *grpc. switch format { case app.YAML: - out, err := util.GetYamlFromProto(rtype) + out, err := util.GetYamlFromProto(rtype.GetRuleType()) if err != nil { return cli.MessageAndError("Error getting yaml from proto", err) } diff --git a/cmd/cli/app/ruletype/ruletype_list.go b/cmd/cli/app/ruletype/ruletype_list.go index b9e1a74b10..3347002108 100644 --- a/cmd/cli/app/ruletype/ruletype_list.go +++ b/cmd/cli/app/ruletype/ruletype_list.go @@ -56,11 +56,15 @@ func listCommand(ctx context.Context, cmd *cobra.Command, _ []string, conn *grpc } cmd.Println(out) case app.YAML: - out, err := util.GetYamlFromProto(resp) - if err != nil { - return cli.MessageAndError("Error getting yaml from proto", err) + for _, rt := range resp.GetRuleTypes() { + out, err := util.GetYamlFromProto(rt) + if err != nil { + return cli.MessageAndError("Error getting yaml from proto", err) + } + // Print YAML separator between each rule type + cmd.Println("---") + cmd.Println(out) } - cmd.Println(out) case app.Table: table := initializeTableForList() for _, rt := range resp.RuleTypes { diff --git a/cmd/cli/main.go b/cmd/cli/main.go index a279260c01..86b0479817 100644 --- a/cmd/cli/main.go +++ b/cmd/cli/main.go @@ -10,6 +10,7 @@ import ( _ "github.com/mindersec/minder/cmd/cli/app/auth" _ "github.com/mindersec/minder/cmd/cli/app/auth/invite" _ "github.com/mindersec/minder/cmd/cli/app/auth/offline_token" + _ "github.com/mindersec/minder/cmd/cli/app/datasource" _ "github.com/mindersec/minder/cmd/cli/app/docs" _ "github.com/mindersec/minder/cmd/cli/app/history" _ "github.com/mindersec/minder/cmd/cli/app/profile" diff --git a/cmd/dev/app/rule_type/rttst.go b/cmd/dev/app/rule_type/rttst.go index 794ab2347a..7c263bb956 100644 --- a/cmd/dev/app/rule_type/rttst.go +++ b/cmd/dev/app/rule_type/rttst.go @@ -17,12 +17,14 @@ import ( "github.com/spf13/viper" "google.golang.org/protobuf/reflect/protoreflect" + internalds "github.com/mindersec/minder/internal/datasources" "github.com/mindersec/minder/internal/db" "github.com/mindersec/minder/internal/engine/actions" "github.com/mindersec/minder/internal/engine/entities" "github.com/mindersec/minder/internal/engine/errors" "github.com/mindersec/minder/internal/engine/eval/rego" engif "github.com/mindersec/minder/internal/engine/interfaces" + "github.com/mindersec/minder/internal/engine/options" entModels "github.com/mindersec/minder/internal/entities/models" entProps "github.com/mindersec/minder/internal/entities/properties" "github.com/mindersec/minder/internal/providers/credentials" @@ -36,6 +38,7 @@ import ( "github.com/mindersec/minder/internal/util/jsonyaml" minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" serverconfig "github.com/mindersec/minder/pkg/config/server" + v1datasources "github.com/mindersec/minder/pkg/datasources/v1" "github.com/mindersec/minder/pkg/engine/selectors" "github.com/mindersec/minder/pkg/engine/v1/rtengine" "github.com/mindersec/minder/pkg/profiles" @@ -63,6 +66,7 @@ func CmdTest() *cobra.Command { testCmd.Flags().StringP("remediate-metadata", "", "", "YAML file containing the remediate metadata (optional)") testCmd.Flags().StringP("token", "t", "", "token to authenticate to the provider."+ "Can also be set via the TEST_AUTH_TOKEN environment variable.") + testCmd.Flags().StringArrayP("data-source", "d", []string{}, "YAML file containing the data source to test the rule with") if err := testCmd.MarkFlagRequired("rule-type"); err != nil { fmt.Fprintf(os.Stderr, "Error marking flag as required: %s\n", err) @@ -84,6 +88,7 @@ func CmdTest() *cobra.Command { return testCmd } +//nolint:gocyclo // this function is a cobra command and is expected to be complex func testCmdRun(cmd *cobra.Command, _ []string) error { rtpath := cmd.Flag("rule-type") epath := cmd.Flag("entity") @@ -94,6 +99,24 @@ func testCmdRun(cmd *cobra.Command, _ []string) error { providerclass := cmd.Flag("provider") providerconfig := cmd.Flag("provider-config") + dataSourceFileStrings, err := cmd.Flags().GetStringArray("data-source") + if err != nil { + return fmt.Errorf("error getting data source files: %w", err) + } + + dataSourcefiles, err := getDataSourceFiles(dataSourceFileStrings) + if err != nil { + return fmt.Errorf("error getting data source files: %w", err) + } + + // close the files when done + defer func() { + for _, f := range dataSourcefiles { + //nolint:gosec // we are closing the file + f.Close() + } + }() + // set rego env variable for debugging if err := os.Setenv(rego.EnablePrintEnvVar, "true"); err != nil { cmd.Printf("Unable to set %s environment variable: %s\n", rego.EnablePrintEnvVar, err) @@ -167,9 +190,14 @@ func testCmdRun(cmd *cobra.Command, _ []string) error { Alert: actionOptFromString(profile.Alert, models.ActionOptOff), } + dsRegistry, err := getDataSources(dataSourcefiles) + if err != nil { + return fmt.Errorf("error getting data sources: %w", err) + } + // TODO: use cobra context here ctx := context.Background() - eng, err := rtengine.NewRuleTypeEngine(ctx, ruletype, prov) + eng, err := rtengine.NewRuleTypeEngine(ctx, ruletype, prov, nil /*experiments*/, options.WithDataSources(dsRegistry)) if err != nil { return fmt.Errorf("cannot create rule type engine: %w", err) } @@ -299,7 +327,7 @@ func selectAndEval( var evalErr error if selected { - evalErr = eng.Eval(ctx, inf.Entity, evalStatus.GetRule().Def, evalStatus.GetRule().Params, evalStatus) + _, evalErr = eng.Eval(ctx, inf.Entity, evalStatus.GetRule().Def, evalStatus.GetRule().Params, evalStatus) } else { evalErr = errors.NewErrEvaluationSkipped("entity not selected by selector %s", matchedSelector) } @@ -475,3 +503,41 @@ func actionOptFromString(s *string, defAction models.ActionOpt) models.ActionOpt return models.ActionOptUnknown } + +func getDataSources(readers []*os.File) (*v1datasources.DataSourceRegistry, error) { + reg := v1datasources.NewDataSourceRegistry() + for _, r := range readers { + fname := r.Name() + ds := &minderv1.DataSource{} + if err := minderv1.ParseResourceProto(r, ds); err != nil { + return nil, fmt.Errorf("error parsing data source %s: %w", fname, err) + } + + if err := ds.Validate(); err != nil { + return nil, fmt.Errorf("error validating data source %s: %w", fname, err) + } + + intds, err := internalds.BuildFromProtobuf(ds) + if err != nil { + return nil, fmt.Errorf("error building data source %s: %w", fname, err) + } + + if err := reg.RegisterDataSource(ds.GetName(), intds); err != nil { + return nil, fmt.Errorf("error registering data source %s: %w", fname, err) + } + } + + return reg, nil +} + +func getDataSourceFiles(files []string) ([]*os.File, error) { + dataSourceFiles := make([]*os.File, 0, len(files)) + for _, f := range files { + file, err := os.Open(filepath.Clean(f)) + if err != nil { + return nil, fmt.Errorf("error opening file: %w", err) + } + dataSourceFiles = append(dataSourceFiles, file) + } + return dataSourceFiles, nil +} diff --git a/cmd/server/app/history_purge.go b/cmd/server/app/history_purge.go index 8e13d10091..e17b0aaad4 100644 --- a/cmd/server/app/history_purge.go +++ b/cmd/server/app/history_purge.go @@ -169,6 +169,6 @@ func deleteEvaluationHistory( func init() { historyCmd.AddCommand(historyPurgeCmd) - historyPurgeCmd.Flags().UintP("batch-size", "s", 1000, "Size of the deletion batch") + historyPurgeCmd.Flags().UintP("batch-size", "", 1000, "Size of the deletion batch") historyPurgeCmd.Flags().Bool("dry-run", false, "Avoids deleting, printing out details about the operation") } diff --git a/database/migrations/000108_data_sources.down.sql b/database/migrations/000108_data_sources.down.sql new file mode 100644 index 0000000000..ef0e2c4e2f --- /dev/null +++ b/database/migrations/000108_data_sources.down.sql @@ -0,0 +1,10 @@ +-- SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +-- SPDX-License-Identifier: Apache-2.0 + +BEGIN; + +DROP TABLE rule_type_data_sources; +DROP TABLE data_sources_functions; +DROP TABLE data_sources; + +COMMIT; diff --git a/database/migrations/000108_data_sources.up.sql b/database/migrations/000108_data_sources.up.sql new file mode 100644 index 0000000000..2bbac07f8c --- /dev/null +++ b/database/migrations/000108_data_sources.up.sql @@ -0,0 +1,60 @@ +-- SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +-- SPDX-License-Identifier: Apache-2.0 + +BEGIN; + +-- This migration adds storage support for data sources. The only +-- constraints we enforce at the database layer are +-- +-- * functions can only reference one data source, and must be deleted +-- if the data source is deleted +-- * data sources are tied to a project, and must be deleted if the +-- project is deleted +-- * rule types can reference one or more data source, and we want to +-- prevent deletion of a data source if there's a rule type +-- referencing it +-- +-- The first two are simple foreign keys, while the third one is +-- enforced by the lack of `ON DELETE ...` clause in the +-- `rule_type_data_sources` table. +-- +-- We also want to prevent the creation of a data source with a given +-- name if another data source with the same name exists in the +-- project hierarchy. I'm not sure how to express this as a database +-- constraint, nor I believe this would be efficient, so we decided to +-- let the application layer enforce that as we do with profiles. + +CREATE TABLE data_sources( + id UUID NOT NULL DEFAULT gen_random_uuid() PRIMARY KEY, + name TEXT NOT NULL, + display_name TEXT NOT NULL, + project_id UUID NOT NULL, + created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), + updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), + FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE +); + +CREATE UNIQUE INDEX data_sources_name_lower_idx ON data_sources (project_id, lower(name)); + +CREATE TABLE data_sources_functions( + id UUID NOT NULL DEFAULT gen_random_uuid() PRIMARY KEY, + name TEXT NOT NULL, + type TEXT NOT NULL, + data_source_id UUID NOT NULL, + definition JSONB NOT NULL, + created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), + updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), + FOREIGN KEY (data_source_id) REFERENCES data_sources(id) ON DELETE CASCADE +); + +CREATE UNIQUE INDEX data_sources_functions_name_lower_idx ON data_sources_functions (data_source_id, lower(name)); + +CREATE TABLE rule_type_data_sources( + rule_type_id UUID NOT NULL, + data_sources_id UUID NOT NULL, + FOREIGN KEY (rule_type_id) REFERENCES rule_type(id), + FOREIGN KEY (data_sources_id) REFERENCES data_sources(id), + UNIQUE (rule_type_id, data_sources_id) +); + +COMMIT; diff --git a/database/migrations/000109_data_sources_project_id.down.sql b/database/migrations/000109_data_sources_project_id.down.sql new file mode 100644 index 0000000000..6354f3ca23 --- /dev/null +++ b/database/migrations/000109_data_sources_project_id.down.sql @@ -0,0 +1,17 @@ +-- SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +-- SPDX-License-Identifier: Apache-2.0 + +BEGIN; + +DROP INDEX data_sources_functions_name_lower_idx; + +ALTER TABLE data_sources_functions + DROP COLUMN project_id; + +CREATE UNIQUE INDEX data_sources_functions_name_lower_idx + ON data_sources_functions (data_source_id, lower(name)); + +ALTER TABLE rule_type_data_sources + DROP COLUMN project_id; + +COMMIT; diff --git a/database/migrations/000109_data_sources_project_id.up.sql b/database/migrations/000109_data_sources_project_id.up.sql new file mode 100644 index 0000000000..8025de93b5 --- /dev/null +++ b/database/migrations/000109_data_sources_project_id.up.sql @@ -0,0 +1,69 @@ +-- SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +-- SPDX-License-Identifier: Apache-2.0 + +BEGIN; + +-- In the previous migration we forgot to add `project_id` foreign key +-- to both `data_sources_functions` and `rule_type_data_sources` +-- tables. +-- +-- While having that foreign key is not terribly important from the +-- data model perspective, since a function is indirectly connected to +-- a project id anyway, from the security perspective we want to +-- ensure that all database objects are tied to a single project and +-- all statements operating on them explicitly filter by project id, +-- since project is the entity by which we enforce permissions. + +-- fix data_sources_functions + +ALTER TABLE data_sources_functions + ADD COLUMN project_id UUID; + +DO $$ +DECLARE + ds_id UUID; + pj_id UUID; +BEGIN + FOR ds_id, pj_id IN SELECT id, project_id FROM data_sources + LOOP + UPDATE data_sources_functions + SET project_id = pj_id + WHERE data_source_id = ds_id; + END LOOP; +END $$; + +ALTER TABLE data_sources_functions + ALTER COLUMN project_id SET NOT NULL; +ALTER TABLE data_sources_functions + ADD CONSTRAINT data_sources_functions_project_id_fkey + FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE; + +DROP INDEX data_sources_functions_name_lower_idx; +CREATE UNIQUE INDEX data_sources_functions_name_lower_idx + ON data_sources_functions (data_source_id, project_id, lower(name)); + +-- fix rule_type_data_sources + +ALTER TABLE rule_type_data_sources + ADD COLUMN project_id UUID; + +DO $$ +DECLARE + ds_id UUID; + pj_id UUID; +BEGIN + FOR ds_id, pj_id IN SELECT id, project_id FROM data_sources + LOOP + UPDATE rule_type_data_sources + SET project_id = pj_id + WHERE data_sources_id = ds_id; + END LOOP; +END $$; + +ALTER TABLE rule_type_data_sources + ALTER COLUMN project_id SET NOT NULL; +ALTER TABLE rule_type_data_sources + ADD CONSTRAINT rule_type_data_sources_project_id_fkey + FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE; + +COMMIT; diff --git a/database/migrations/000110_rule_rtype_data_sources_cascading_delete.down.sql b/database/migrations/000110_rule_rtype_data_sources_cascading_delete.down.sql new file mode 100644 index 0000000000..b4e6aee6a2 --- /dev/null +++ b/database/migrations/000110_rule_rtype_data_sources_cascading_delete.down.sql @@ -0,0 +1,13 @@ +-- SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +-- SPDX-License-Identifier: Apache-2.0 + +BEGIN; + +ALTER TABLE rule_type_data_sources + DROP CONSTRAINT rule_type_data_sources_rule_type_id_fkey; + +ALTER TABLE rule_type_data_sources + ADD CONSTRAINT rule_type_data_sources_rule_type_id_fkey + FOREIGN KEY (rule_type_id) REFERENCES rule_type(id); + +COMMIT; diff --git a/database/migrations/000110_rule_rtype_data_sources_cascading_delete.up.sql b/database/migrations/000110_rule_rtype_data_sources_cascading_delete.up.sql new file mode 100644 index 0000000000..6c009bf188 --- /dev/null +++ b/database/migrations/000110_rule_rtype_data_sources_cascading_delete.up.sql @@ -0,0 +1,30 @@ +-- SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +-- SPDX-License-Identifier: Apache-2.0 + +BEGIN; + +-- Generally speaking, given two projects R (root) and A within the +-- same hierarchy, a rule type defined in project A can reference a +-- data source defined in project R, and in such cases we want to +-- prevent admins of project R from deleting the data source without +-- fixing said rule type in project A (or having someone else fix it +-- for them), but we still want admins from project A to be able to +-- delete their rule types without hindrance. +-- +-- This migration recreates the foreign key constraint to delete rows +-- from `rule_type_data_sources` when a record is deleted from +-- `rule_type`. +-- +-- Note that it is safe to just drop and recreate the constraint as +-- the previous version prevented the deletion of rule types if they +-- referenced a data source, so it was not possible to have dangling +-- records. + +ALTER TABLE rule_type_data_sources + DROP CONSTRAINT rule_type_data_sources_rule_type_id_fkey; + +ALTER TABLE rule_type_data_sources + ADD CONSTRAINT rule_type_data_sources_rule_type_id_fkey + FOREIGN KEY (rule_type_id) REFERENCES rule_type(id) ON DELETE CASCADE; + +COMMIT; diff --git a/database/mock/store.go b/database/mock/store.go index 994ccc9ae6..2549133859 100644 --- a/database/mock/store.go +++ b/database/mock/store.go @@ -44,6 +44,36 @@ func (m *MockStore) EXPECT() *MockStoreMockRecorder { return m.recorder } +// AddDataSourceFunction mocks base method. +func (m *MockStore) AddDataSourceFunction(ctx context.Context, arg db.AddDataSourceFunctionParams) (db.DataSourcesFunction, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddDataSourceFunction", ctx, arg) + ret0, _ := ret[0].(db.DataSourcesFunction) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AddDataSourceFunction indicates an expected call of AddDataSourceFunction. +func (mr *MockStoreMockRecorder) AddDataSourceFunction(ctx, arg any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddDataSourceFunction", reflect.TypeOf((*MockStore)(nil).AddDataSourceFunction), ctx, arg) +} + +// AddRuleTypeDataSourceReference mocks base method. +func (m *MockStore) AddRuleTypeDataSourceReference(ctx context.Context, arg db.AddRuleTypeDataSourceReferenceParams) (db.RuleTypeDataSource, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddRuleTypeDataSourceReference", ctx, arg) + ret0, _ := ret[0].(db.RuleTypeDataSource) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AddRuleTypeDataSourceReference indicates an expected call of AddRuleTypeDataSourceReference. +func (mr *MockStoreMockRecorder) AddRuleTypeDataSourceReference(ctx, arg any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRuleTypeDataSourceReference", reflect.TypeOf((*MockStore)(nil).AddRuleTypeDataSourceReference), ctx, arg) +} + // BeginTransaction mocks base method. func (m *MockStore) BeginTransaction() (*sql.Tx, error) { m.ctrl.T.Helper() @@ -192,6 +222,35 @@ func (mr *MockStoreMockRecorder) CountUsers(ctx any) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CountUsers", reflect.TypeOf((*MockStore)(nil).CountUsers), ctx) } +// CreateDataSource mocks base method. +func (m *MockStore) CreateDataSource(ctx context.Context, arg db.CreateDataSourceParams) (db.DataSource, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateDataSource", ctx, arg) + ret0, _ := ret[0].(db.DataSource) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateDataSource indicates an expected call of CreateDataSource. +func (mr *MockStoreMockRecorder) CreateDataSource(ctx, arg any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateDataSource", reflect.TypeOf((*MockStore)(nil).CreateDataSource), ctx, arg) +} + +// CreateEntitlements mocks base method. +func (m *MockStore) CreateEntitlements(ctx context.Context, arg db.CreateEntitlementsParams) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateEntitlements", ctx, arg) + ret0, _ := ret[0].(error) + return ret0 +} + +// CreateEntitlements indicates an expected call of CreateEntitlements. +func (mr *MockStoreMockRecorder) CreateEntitlements(ctx, arg any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateEntitlements", reflect.TypeOf((*MockStore)(nil).CreateEntitlements), ctx, arg) +} + // CreateEntity mocks base method. func (m *MockStore) CreateEntity(ctx context.Context, arg db.CreateEntityParams) (db.EntityInstance, error) { m.ctrl.T.Helper() @@ -445,6 +504,51 @@ func (mr *MockStoreMockRecorder) DeleteArtifact(ctx, id any) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteArtifact", reflect.TypeOf((*MockStore)(nil).DeleteArtifact), ctx, id) } +// DeleteDataSource mocks base method. +func (m *MockStore) DeleteDataSource(ctx context.Context, arg db.DeleteDataSourceParams) (db.DataSource, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteDataSource", ctx, arg) + ret0, _ := ret[0].(db.DataSource) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteDataSource indicates an expected call of DeleteDataSource. +func (mr *MockStoreMockRecorder) DeleteDataSource(ctx, arg any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteDataSource", reflect.TypeOf((*MockStore)(nil).DeleteDataSource), ctx, arg) +} + +// DeleteDataSourceFunction mocks base method. +func (m *MockStore) DeleteDataSourceFunction(ctx context.Context, arg db.DeleteDataSourceFunctionParams) (db.DataSourcesFunction, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteDataSourceFunction", ctx, arg) + ret0, _ := ret[0].(db.DataSourcesFunction) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteDataSourceFunction indicates an expected call of DeleteDataSourceFunction. +func (mr *MockStoreMockRecorder) DeleteDataSourceFunction(ctx, arg any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteDataSourceFunction", reflect.TypeOf((*MockStore)(nil).DeleteDataSourceFunction), ctx, arg) +} + +// DeleteDataSourceFunctions mocks base method. +func (m *MockStore) DeleteDataSourceFunctions(ctx context.Context, arg db.DeleteDataSourceFunctionsParams) ([]db.DataSourcesFunction, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteDataSourceFunctions", ctx, arg) + ret0, _ := ret[0].([]db.DataSourcesFunction) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteDataSourceFunctions indicates an expected call of DeleteDataSourceFunctions. +func (mr *MockStoreMockRecorder) DeleteDataSourceFunctions(ctx, arg any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteDataSourceFunctions", reflect.TypeOf((*MockStore)(nil).DeleteDataSourceFunctions), ctx, arg) +} + // DeleteEntity mocks base method. func (m *MockStore) DeleteEntity(ctx context.Context, arg db.DeleteEntityParams) error { m.ctrl.T.Helper() @@ -617,6 +721,20 @@ func (mr *MockStoreMockRecorder) DeleteRepository(ctx, id any) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteRepository", reflect.TypeOf((*MockStore)(nil).DeleteRepository), ctx, id) } +// DeleteRuleInstanceOfProfileInProject mocks base method. +func (m *MockStore) DeleteRuleInstanceOfProfileInProject(ctx context.Context, arg db.DeleteRuleInstanceOfProfileInProjectParams) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteRuleInstanceOfProfileInProject", ctx, arg) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeleteRuleInstanceOfProfileInProject indicates an expected call of DeleteRuleInstanceOfProfileInProject. +func (mr *MockStoreMockRecorder) DeleteRuleInstanceOfProfileInProject(ctx, arg any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteRuleInstanceOfProfileInProject", reflect.TypeOf((*MockStore)(nil).DeleteRuleInstanceOfProfileInProject), ctx, arg) +} + // DeleteRuleType mocks base method. func (m *MockStore) DeleteRuleType(ctx context.Context, id uuid.UUID) error { m.ctrl.T.Helper() @@ -631,6 +749,20 @@ func (mr *MockStoreMockRecorder) DeleteRuleType(ctx, id any) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteRuleType", reflect.TypeOf((*MockStore)(nil).DeleteRuleType), ctx, id) } +// DeleteRuleTypeDataSource mocks base method. +func (m *MockStore) DeleteRuleTypeDataSource(ctx context.Context, arg db.DeleteRuleTypeDataSourceParams) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteRuleTypeDataSource", ctx, arg) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeleteRuleTypeDataSource indicates an expected call of DeleteRuleTypeDataSource. +func (mr *MockStoreMockRecorder) DeleteRuleTypeDataSource(ctx, arg any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteRuleTypeDataSource", reflect.TypeOf((*MockStore)(nil).DeleteRuleTypeDataSource), ctx, arg) +} + // DeleteSelector mocks base method. func (m *MockStore) DeleteSelector(ctx context.Context, id uuid.UUID) error { m.ctrl.T.Helper() @@ -882,6 +1014,36 @@ func (mr *MockStoreMockRecorder) GetChildrenProjects(ctx, id any) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetChildrenProjects", reflect.TypeOf((*MockStore)(nil).GetChildrenProjects), ctx, id) } +// GetDataSource mocks base method. +func (m *MockStore) GetDataSource(ctx context.Context, arg db.GetDataSourceParams) (db.DataSource, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetDataSource", ctx, arg) + ret0, _ := ret[0].(db.DataSource) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetDataSource indicates an expected call of GetDataSource. +func (mr *MockStoreMockRecorder) GetDataSource(ctx, arg any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDataSource", reflect.TypeOf((*MockStore)(nil).GetDataSource), ctx, arg) +} + +// GetDataSourceByName mocks base method. +func (m *MockStore) GetDataSourceByName(ctx context.Context, arg db.GetDataSourceByNameParams) (db.DataSource, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetDataSourceByName", ctx, arg) + ret0, _ := ret[0].(db.DataSource) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetDataSourceByName indicates an expected call of GetDataSourceByName. +func (mr *MockStoreMockRecorder) GetDataSourceByName(ctx, arg any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDataSourceByName", reflect.TypeOf((*MockStore)(nil).GetDataSourceByName), ctx, arg) +} + // GetEntitiesByProjectHierarchy mocks base method. func (m *MockStore) GetEntitiesByProjectHierarchy(ctx context.Context, projects []uuid.UUID) ([]db.EntityInstance, error) { m.ctrl.T.Helper() @@ -1466,6 +1628,21 @@ func (mr *MockStoreMockRecorder) GetRepositoryByRepoName(ctx, arg any) *gomock.C return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetRepositoryByRepoName", reflect.TypeOf((*MockStore)(nil).GetRepositoryByRepoName), ctx, arg) } +// GetRootProjectByID mocks base method. +func (m *MockStore) GetRootProjectByID(ctx context.Context, id uuid.UUID) (db.Project, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetRootProjectByID", ctx, id) + ret0, _ := ret[0].(db.Project) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetRootProjectByID indicates an expected call of GetRootProjectByID. +func (mr *MockStoreMockRecorder) GetRootProjectByID(ctx, id any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetRootProjectByID", reflect.TypeOf((*MockStore)(nil).GetRootProjectByID), ctx, id) +} + // GetRuleEvaluationByProfileIdAndRuleType mocks base method. func (m *MockStore) GetRuleEvaluationByProfileIdAndRuleType(ctx context.Context, profileID uuid.UUID, ruleName sql.NullString, entityID uuid.UUID, ruleTypeName sql.NullString) (*db.ListRuleEvaluationsByProfileIdRow, error) { m.ctrl.T.Helper() @@ -1794,6 +1971,21 @@ func (mr *MockStoreMockRecorder) InsertRemediationEvent(ctx, arg any) *gomock.Ca return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InsertRemediationEvent", reflect.TypeOf((*MockStore)(nil).InsertRemediationEvent), ctx, arg) } +// ListAllRootProjects mocks base method. +func (m *MockStore) ListAllRootProjects(ctx context.Context) ([]db.Project, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListAllRootProjects", ctx) + ret0, _ := ret[0].([]db.Project) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListAllRootProjects indicates an expected call of ListAllRootProjects. +func (mr *MockStoreMockRecorder) ListAllRootProjects(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAllRootProjects", reflect.TypeOf((*MockStore)(nil).ListAllRootProjects), ctx) +} + // ListArtifactsByRepoID mocks base method. func (m *MockStore) ListArtifactsByRepoID(ctx context.Context, repositoryID uuid.NullUUID) ([]db.Artifact, error) { m.ctrl.T.Helper() @@ -1809,6 +2001,36 @@ func (mr *MockStoreMockRecorder) ListArtifactsByRepoID(ctx, repositoryID any) *g return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListArtifactsByRepoID", reflect.TypeOf((*MockStore)(nil).ListArtifactsByRepoID), ctx, repositoryID) } +// ListDataSourceFunctions mocks base method. +func (m *MockStore) ListDataSourceFunctions(ctx context.Context, arg db.ListDataSourceFunctionsParams) ([]db.DataSourcesFunction, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListDataSourceFunctions", ctx, arg) + ret0, _ := ret[0].([]db.DataSourcesFunction) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListDataSourceFunctions indicates an expected call of ListDataSourceFunctions. +func (mr *MockStoreMockRecorder) ListDataSourceFunctions(ctx, arg any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListDataSourceFunctions", reflect.TypeOf((*MockStore)(nil).ListDataSourceFunctions), ctx, arg) +} + +// ListDataSources mocks base method. +func (m *MockStore) ListDataSources(ctx context.Context, projects []uuid.UUID) ([]db.DataSource, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListDataSources", ctx, projects) + ret0, _ := ret[0].([]db.DataSource) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListDataSources indicates an expected call of ListDataSources. +func (mr *MockStoreMockRecorder) ListDataSources(ctx, projects any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListDataSources", reflect.TypeOf((*MockStore)(nil).ListDataSources), ctx, projects) +} + // ListEvaluationHistory mocks base method. func (m *MockStore) ListEvaluationHistory(ctx context.Context, arg db.ListEvaluationHistoryParams) ([]db.ListEvaluationHistoryRow, error) { m.ctrl.T.Helper() @@ -2019,6 +2241,21 @@ func (mr *MockStoreMockRecorder) ListRuleTypesByProject(ctx, projectID any) *gom return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListRuleTypesByProject", reflect.TypeOf((*MockStore)(nil).ListRuleTypesByProject), ctx, projectID) } +// ListRuleTypesReferencesByDataSource mocks base method. +func (m *MockStore) ListRuleTypesReferencesByDataSource(ctx context.Context, dataSourcesID uuid.UUID) ([]db.RuleTypeDataSource, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListRuleTypesReferencesByDataSource", ctx, dataSourcesID) + ret0, _ := ret[0].([]db.RuleTypeDataSource) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListRuleTypesReferencesByDataSource indicates an expected call of ListRuleTypesReferencesByDataSource. +func (mr *MockStoreMockRecorder) ListRuleTypesReferencesByDataSource(ctx, dataSourcesID any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListRuleTypesReferencesByDataSource", reflect.TypeOf((*MockStore)(nil).ListRuleTypesReferencesByDataSource), ctx, dataSourcesID) +} + // ListTokensToMigrate mocks base method. func (m *MockStore) ListTokensToMigrate(ctx context.Context, arg db.ListTokensToMigrateParams) ([]db.ProviderAccessToken, error) { m.ctrl.T.Helper() @@ -2122,18 +2359,48 @@ func (mr *MockStoreMockRecorder) Rollback(tx any) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Rollback", reflect.TypeOf((*MockStore)(nil).Rollback), tx) } -// SetCurrentVersion mocks base method. -func (m *MockStore) SetCurrentVersion(ctx context.Context, arg db.SetCurrentVersionParams) error { +// SetSubscriptionBundleVersion mocks base method. +func (m *MockStore) SetSubscriptionBundleVersion(ctx context.Context, arg db.SetSubscriptionBundleVersionParams) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SetCurrentVersion", ctx, arg) + ret := m.ctrl.Call(m, "SetSubscriptionBundleVersion", ctx, arg) ret0, _ := ret[0].(error) return ret0 } -// SetCurrentVersion indicates an expected call of SetCurrentVersion. -func (mr *MockStoreMockRecorder) SetCurrentVersion(ctx, arg any) *gomock.Call { +// SetSubscriptionBundleVersion indicates an expected call of SetSubscriptionBundleVersion. +func (mr *MockStoreMockRecorder) SetSubscriptionBundleVersion(ctx, arg any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetSubscriptionBundleVersion", reflect.TypeOf((*MockStore)(nil).SetSubscriptionBundleVersion), ctx, arg) +} + +// UpdateDataSource mocks base method. +func (m *MockStore) UpdateDataSource(ctx context.Context, arg db.UpdateDataSourceParams) (db.DataSource, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateDataSource", ctx, arg) + ret0, _ := ret[0].(db.DataSource) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateDataSource indicates an expected call of UpdateDataSource. +func (mr *MockStoreMockRecorder) UpdateDataSource(ctx, arg any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDataSource", reflect.TypeOf((*MockStore)(nil).UpdateDataSource), ctx, arg) +} + +// UpdateDataSourceFunction mocks base method. +func (m *MockStore) UpdateDataSourceFunction(ctx context.Context, arg db.UpdateDataSourceFunctionParams) (db.DataSourcesFunction, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateDataSourceFunction", ctx, arg) + ret0, _ := ret[0].(db.DataSourcesFunction) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateDataSourceFunction indicates an expected call of UpdateDataSourceFunction. +func (mr *MockStoreMockRecorder) UpdateDataSourceFunction(ctx, arg any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetCurrentVersion", reflect.TypeOf((*MockStore)(nil).SetCurrentVersion), ctx, arg) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDataSourceFunction", reflect.TypeOf((*MockStore)(nil).UpdateDataSourceFunction), ctx, arg) } // UpdateEncryptedSecret mocks base method. diff --git a/database/query/datasources.sql b/database/query/datasources.sql new file mode 100644 index 0000000000..c03c85dfbc --- /dev/null +++ b/database/query/datasources.sql @@ -0,0 +1,100 @@ +-- CreateDataSource creates a new datasource in a given project. + +-- name: CreateDataSource :one +INSERT INTO data_sources (project_id, name, display_name) +VALUES ($1, $2, $3) RETURNING *; + +-- AddDataSourceFunction adds a function to a datasource. + +-- name: AddDataSourceFunction :one +INSERT INTO data_sources_functions (data_source_id, project_id, name, type, definition) +VALUES ($1, $2, $3, $4, $5) RETURNING *; + +-- UpdateDataSource updates a datasource in a given project. + +-- name: UpdateDataSource :one +UPDATE data_sources +SET display_name = $3 +WHERE id = $1 AND project_id = $2 +RETURNING *; + +-- UpdateDataSourceFunction updates a function in a datasource. We're +-- only able to update the type and definition of the function. + +-- name: UpdateDataSourceFunction :one +UPDATE data_sources_functions +SET type = $3, definition = $4, updated_at = NOW() +WHERE data_source_id = $1 AND project_id = $5 AND name = $2 +RETURNING *; + +-- name: DeleteDataSource :one +DELETE FROM data_sources +WHERE id = $1 AND project_id = $2 +RETURNING *; + +-- name: DeleteDataSourceFunction :one +DELETE FROM data_sources_functions +WHERE data_source_id = $1 AND name = $2 AND project_id = $3 +RETURNING *; + +-- DeleteDataSourceFunctions deletes all functions associated with a given datasource +-- in a specific project. + +-- name: DeleteDataSourceFunctions :many +DELETE FROM data_sources_functions +WHERE data_source_id = $1 AND project_id = $2 +RETURNING *; + +-- GetDataSource retrieves a datasource by its id and a project hierarchy. +-- +-- Note that to get a datasource for a given project, one can simply +-- pass one project id in the project_id array. + +-- name: GetDataSource :one +SELECT * FROM data_sources +WHERE id = $1 AND project_id = ANY(sqlc.arg(projects)::uuid[]); + +-- GetDataSourceByName retrieves a datasource by its name and +-- a project hierarchy. +-- +-- Note that to get a datasource for a given project, one can simply +-- pass one project id in the project_id array. + +-- name: GetDataSourceByName :one +SELECT * FROM data_sources +WHERE name = $1 AND project_id = ANY(sqlc.arg(projects)::uuid[]); + +-- ListDataSources retrieves all datasources for project hierarchy. +-- +-- Note that to get a datasource for a given project, one can simply +-- pass one project id in the project_id array. + +-- name: ListDataSources :many +SELECT * FROM data_sources +WHERE project_id = ANY(sqlc.arg(projects)::uuid[]); + +-- ListDataSourceFunctions retrieves all functions for a datasource. + +-- name: ListDataSourceFunctions :many +SELECT * FROM data_sources_functions +WHERE data_source_id = $1 AND project_id = $2; + +-- ListRuleTypesReferencesByDataSource retrieves all rule types +-- referencing a given data source in a given project. +-- +-- name: ListRuleTypesReferencesByDataSource :many +SELECT * FROM rule_type_data_sources +WHERE data_sources_id = $1; + +-- AddRuleTypeDataSourceReference adds a link between one rule type +-- and one data source it uses. +-- +-- name: AddRuleTypeDataSourceReference :one +INSERT INTO rule_type_data_sources (rule_type_id, data_sources_id, project_id) +VALUES (sqlc.arg(ruleTypeID)::uuid, sqlc.arg(dataSourceID)::uuid, sqlc.arg(projectID)::uuid) +RETURNING rule_type_id, data_sources_id, project_id; + +-- name: DeleteRuleTypeDataSource :exec +DELETE FROM rule_type_data_sources + WHERE rule_type_id = sqlc.arg(ruleid) + AND project_id = sqlc.arg(projectid); diff --git a/database/query/entitlements.sql b/database/query/entitlements.sql index dc14569541..6e1104b04c 100644 --- a/database/query/entitlements.sql +++ b/database/query/entitlements.sql @@ -9,4 +9,9 @@ WHERE e.project_id = sqlc.arg(project_id)::UUID AND e.feature = sqlc.arg(feature -- name: GetEntitlementFeaturesByProjectID :many SELECT feature FROM entitlements -WHERE project_id = sqlc.arg(project_id)::UUID; \ No newline at end of file +WHERE project_id = sqlc.arg(project_id)::UUID; + +-- name: CreateEntitlements :exec +INSERT INTO entitlements (feature, project_id) +SELECT unnest(sqlc.arg(features)::text[]), sqlc.arg(project_id)::UUID +ON CONFLICT DO NOTHING; diff --git a/database/query/eval_history.sql b/database/query/eval_history.sql index 287f943111..25637b3f65 100644 --- a/database/query/eval_history.sql +++ b/database/query/eval_history.sql @@ -119,6 +119,7 @@ SELECT s.id::uuid AS evaluation_id, ri.name AS rule_name, rt.severity_value as rule_severity, p.name AS profile_name, + p.labels as profile_labels, -- evaluation status and details s.status AS evaluation_status, s.details AS evaluation_details, @@ -158,6 +159,13 @@ SELECT s.id::uuid AS evaluation_id, AND (sqlc.narg(tots)::timestamp without time zone IS NULL OR s.evaluation_time < sqlc.narg(tots)) -- implicit filter by project id AND j.id = sqlc.arg(projectId) + -- implicit filter by profile labels + AND ((sqlc.slice(labels)::text[] IS NULL AND p.labels = array[]::text[]) -- include only unlabelled records + OR ((sqlc.slice(labels)::text[] IS NOT NULL AND sqlc.slice(labels)::text[] = array['*']::text[]) -- include all labels + OR (sqlc.slice(labels)::text[] IS NOT NULL AND p.labels && sqlc.slice(labels)::text[]) -- include only specified labels + ) + ) + AND (sqlc.slice(notLabels)::text[] IS NULL OR NOT p.labels && sqlc.slice(notLabels)::text[]) -- exclude only specified labels ORDER BY CASE WHEN sqlc.narg(next)::timestamp without time zone IS NULL THEN s.evaluation_time END ASC, CASE WHEN sqlc.narg(prev)::timestamp without time zone IS NULL THEN s.evaluation_time END DESC diff --git a/database/query/projects.sql b/database/query/projects.sql index 04ece54c3b..0b2defdcb1 100644 --- a/database/query/projects.sql +++ b/database/query/projects.sql @@ -101,4 +101,13 @@ WHERE id = $1 RETURNING *; -- name: UpdateProjectMeta :one UPDATE projects SET metadata = $2 -WHERE id = $1 RETURNING *; \ No newline at end of file +WHERE id = $1 RETURNING *; + +-- name: ListAllRootProjects :many +SELECT * FROM projects +WHERE parent_id IS NULL AND is_organization = FALSE; + +-- name: GetRootProjectByID :one +SELECT * FROM projects +WHERE id = $1 +AND parent_id IS NULL AND is_organization = FALSE LIMIT 1; diff --git a/database/query/rule_instances.sql b/database/query/rule_instances.sql index 8c2a1d272c..efa481d4be 100644 --- a/database/query/rule_instances.sql +++ b/database/query/rule_instances.sql @@ -51,3 +51,6 @@ SELECT rule_type_id FROM rule_instances WHERE name = $1 AND entity_type = $2 AND profile_id = $3; + +-- name: DeleteRuleInstanceOfProfileInProject :exec +DELETE FROM rule_instances WHERE project_id = $1 AND profile_id = $2 AND rule_type_id = $3; diff --git a/database/query/subscriptions.sql b/database/query/subscriptions.sql index 7f81c9cab0..8530eeaba1 100644 --- a/database/query/subscriptions.sql +++ b/database/query/subscriptions.sql @@ -22,9 +22,5 @@ SELECT su.* FROM subscriptions AS su JOIN bundles AS bu ON bu.id = su.bundle_id WHERE bu.namespace = $1 AND bu.name = $2 AND su.project_id = $3; --- name: SetCurrentVersion :exec -UPDATE subscriptions -SET current_version = $1 -FROM subscriptions AS su -JOIN bundles as bu ON su.bundle_id = bu.id -WHERE su.project_id = $2 AND bu.namespace = $1 AND bu.name = $2; +-- name: SetSubscriptionBundleVersion :exec +UPDATE subscriptions SET current_version = $2 WHERE project_id = $1; diff --git a/deployment/helm/README.md b/deployment/helm/README.md index f2d6da49d4..8432b2361a 100644 --- a/deployment/helm/README.md +++ b/deployment/helm/README.md @@ -114,4 +114,4 @@ installed in the namespace specified by your current Kubernetes context. | sessionExpirationPurgeJobSettings.restartPolicy | string | `"OnFailure"` | | | sessionExpirationPurgeJobSettings.schedule | string | `"0 0 * * *"` | | | sessionExpirationPurgeJobSettings.sidecarContainers | list | `[]` | | -| trusty.endpoint | string | `"https://api.trustypkg.dev"` | Trusty host to use | \ No newline at end of file +| trusty.endpoint | string | `"https://api.trustypkg.dev"` | Stacklok Insight host to use | \ No newline at end of file diff --git a/deployment/helm/templates/ingress.yaml b/deployment/helm/templates/ingress.yaml index eaecd86deb..c8c2066e3c 100644 --- a/deployment/helm/templates/ingress.yaml +++ b/deployment/helm/templates/ingress.yaml @@ -104,6 +104,13 @@ spec: name: minder-grpc port: name: grpc + - path: /minder.v1.DataSourceService + pathType: Prefix + backend: + service: + name: minder-grpc + port: + name: grpc - path: / pathType: Prefix backend: diff --git a/deployment/helm/values.yaml b/deployment/helm/values.yaml index 6cd6e38a04..944a9da234 100644 --- a/deployment/helm/values.yaml +++ b/deployment/helm/values.yaml @@ -23,7 +23,7 @@ db: # trusty settings trusty: - # -- (string) Trusty host to use + # -- (string) Stacklok Insight host to use endpoint: "https://api.trustypkg.dev" # AWS-specific configuration diff --git a/docker-compose.yaml b/docker-compose.yaml index cb51afa398..859db464d3 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -52,6 +52,8 @@ services: - MINDER_PROVIDER_GITHUB_APP_PRIVATE_KEY=/app/.secrets/github-app.pem - MINDER_FLAGS_GO_FEATURE_FILE_PATH=/app/flags-config.yaml - MINDER_LOG_GITHUB_REQUESTS=1 + - MINDER_AUTHZ_API_URL=http://openfga:8080 + - MINDER_IDENTITY_SERVER_ISSUER_URL=http://keycloak:8080 working_dir: /app networks: - app_net @@ -88,6 +90,7 @@ services: - ./database/migrations:/app/database/migrations:z environment: - KO_DATA_PATH=/app/ + - MINDER_AUTHZ_API_URL=http://openfga:8080 networks: - app_net deploy: @@ -103,7 +106,7 @@ services: condition: service_healthy postgres: container_name: postgres_container - image: postgres:16.2-alpine + image: postgres:17.2-alpine restart: always user: postgres environment: @@ -162,7 +165,7 @@ services: openfga: container_name: openfga - image: openfga/openfga:v1.5.0 + image: openfga/openfga:v1.8.1 command: [ "run", "--playground-port=8085" @@ -181,7 +184,7 @@ services: nats: container_name: nats - image: nats:2.10.18 + image: nats:2.10.22 entrypoint: ["./nats-server"] command: ["--http_port", "8222", "-js"] healthcheck: @@ -195,4 +198,3 @@ services: networks: app_net: driver: bridge - diff --git a/docker/minder/Dockerfile b/docker/minder/Dockerfile index 76f5296cfd..f43fc63aa0 100644 --- a/docker/minder/Dockerfile +++ b/docker/minder/Dockerfile @@ -1,7 +1,7 @@ # SPDX-FileCopyrightText: Copyright 2023 The Minder Authors # SPDX-License-Identifier: Apache-2.0 -FROM index.docker.io/library/golang@sha256:4a3c2bcd243d3dbb7b15237eecb0792db3614900037998c2cd6a579c46888c1e AS builder +FROM index.docker.io/library/golang:1.23.4@sha256:574185e5c6b9d09873f455a7c205ea0514bfd99738c5dc7750196403a44ed4b7 AS builder ENV APP_ROOT=/opt/app-root ENV GOPATH=$APP_ROOT diff --git a/docker/reminder/Dockerfile b/docker/reminder/Dockerfile index 7ad1efc8cf..4ac3a62617 100644 --- a/docker/reminder/Dockerfile +++ b/docker/reminder/Dockerfile @@ -1,7 +1,7 @@ # SPDX-FileCopyrightText: Copyright 2024 The Minder Authors # SPDX-License-Identifier: Apache-2.0 -FROM index.docker.io/library/golang@sha256:4a3c2bcd243d3dbb7b15237eecb0792db3614900037998c2cd6a579c46888c1e AS builder +FROM index.docker.io/library/golang:1.23.4@sha256:574185e5c6b9d09873f455a7c205ea0514bfd99738c5dc7750196403a44ed4b7 AS builder ENV APP_ROOT=/opt/app-root ENV GOPATH=$APP_ROOT diff --git a/docs/docs/about/roadmap.md b/docs/docs/about/roadmap.md index 918306f4cd..4ab326cdd5 100644 --- a/docs/docs/about/roadmap.md +++ b/docs/docs/about/roadmap.md @@ -23,8 +23,8 @@ _Last updated: June 2024_ ## Next -* **Report CVEs, Trusty scores, and license info for ingested SBOMs:** Ingest SBOMS and identify dependencies; show CVEs, Trusty scores, and license information including any changes over time. -* **Block PRs based on Trusty scores:** In addition to adding comments to pull requests (as is currently available), add the option to block pull requests as a policy remediation. +* **Report CVEs, Stacklok Insight scores, and license info for ingested SBOMs:** Ingest SBOMS and identify dependencies; show CVEs, Stacklok Insight scores, and license information including any changes over time. +* **Block PRs based on Stacklok Insight scores:** In addition to adding comments to pull requests (as is currently available), add the option to block pull requests as a policy remediation. * **Policy events:** Provide information about rule evaluation as it changes, and historical rule evaluation. * **Generate SBOMs:** Enable users to automatically create and sign SBOMs. @@ -35,7 +35,7 @@ _Last updated: June 2024_ * **Register GitLab and Bitbucket repositories:** In addition to managing GitHub repositories, enable users to manage configuration and policy for other source control providers. * **Export a Minder 'badge/certification' that shows what practices a project followed:** Create a badge that OSS maintainers and enterprise developers can create and share with others that asserts the Minder practices and policies their projects follow. * **Temporary permissions to providers vs. long-running:** Policy remediation currently requires long-running permissions to providers such as GitHub; provide the option to enable temporary permissions. -* **Create PRs for dependency updates:** As a policy autoremediation option, enable Minder to automatically create pull requests to update dependencies based on vulnerabilities, Trusty scores, or license changes. +* **Create PRs for dependency updates:** As a policy autoremediation option, enable Minder to automatically create pull requests to update dependencies based on vulnerabilities, Stacklok Insight scores, or license changes. * **Drive policy through git (config management):** Enable users to dynamically create and maintain policies from other sources, e.g. Git, allowing for easier policy maintenance and the ability to manage policies through GitOps workflows. * **Integrations with additional OSS and commercial tools:** Integrate with tools that run code and secrets scanning (eg Snyk), and behavior analysis (eg [OSSF Package Analysis tool](https://github.com/ossf/package-analysis)). -* **Help package authors improve Trusty Scores:** Provide guidance and/or policy to improve key Trusty Store metrics (open issues, active contributors). +* **Help package authors improve Stacklok Insight Scores:** Provide guidance and/or policy to improve key Stacklok Insight Store metrics (open issues, active contributors). diff --git a/docs/docs/developer_guide/get-hacking.md b/docs/docs/developer_guide/get-hacking.md index 4a685176a3..8151c66b4e 100644 --- a/docs/docs/developer_guide/get-hacking.md +++ b/docs/docs/developer_guide/get-hacking.md @@ -10,6 +10,11 @@ Follow the steps in the [Installing a Development version](./../run_minder_serve The application will be available on `https://localhost:8080` and gRPC on `https://localhost:8090`. +When iterating, it can be helpful to only rebuild and reload the `minder` container. You can do this with: +```bash +make run-docker services=minder +``` + ## Run the tests ```bash make test diff --git a/docs/docs/how-to/mindev.md b/docs/docs/how-to/mindev.md index 05c9f5ce68..fbad6fc788 100644 --- a/docs/docs/how-to/mindev.md +++ b/docs/docs/how-to/mindev.md @@ -38,7 +38,7 @@ external resources. This will allow you to identify syntax errors quickly. To lint your rule type, run: ```bash -mindev ruletype lint -f path/to/rule-type.yaml +mindev ruletype lint -r path/to/rule-type.yaml ``` This will give you basic validations on the rule type file. diff --git a/docs/docs/how-to/writing-rules-in-rego.md b/docs/docs/how-to/writing-rules-in-rego.md index fabdd8c8b3..1eef183758 100644 --- a/docs/docs/how-to/writing-rules-in-rego.md +++ b/docs/docs/how-to/writing-rules-in-rego.md @@ -12,7 +12,7 @@ Minder organizes policies into Rule Types, each with specific sections defining * Ingesting Data: Fetching relevant data, often from external sources like GitHub API. -* Evaluation: Applying policy logic to the ingested data. Minder offers a set of engines to evaluate data: jq and rego being general-purpose engines, while trusty and vulncheck are more use case-specific ones. +* Evaluation: Applying policy logic to the ingested data. Minder offers a set of engines to evaluate data: jq and rego being general-purpose engines, while Stacklok Insight and vulncheck are more use case-specific ones. * Remediation and Alerting: Taking actions or providing notifications based on evaluation results. E.g. creating a pull request or generating a GitHub security advisory. @@ -30,19 +30,29 @@ Note that these are known patterns in the OPA community, so we’re not doing an Given the context in which Minder operates, we did need to add some custom functionality that OPA doesn’t provide out of the box. Namely, we added the following custom functions: -* **file.exists**: Verifies that the given file exists in the Git repository. +* **file.exists(filepath)**: Verifies that the given filepath exists in the Git repository, returns a boolean. -* **file.read**: Reads the contents of the given file in the Git repository. +* **file.read(filepath)**: Reads the contents of the given file in the Git repository and returns the contents as a string. -* **file.ls**: Lists files in the given directory in the Git repository. +* **file.ls(directory)**: Lists files in the given directory in the Git repository, returning the filenames as an array of strings. -* **file.ls_glob**: Lists files in the given directory in the Git repository that match the given glob pattern. +* **file.ls_glob(pattern)**: Lists files in the given directory in the Git repository that match the given glob pattern, returning matched filenames as an array of strings. -* **file.http_type**: Returns the HTTP content type of the given file. +* **file.http_type(filepath)**: Determines the HTTP (MIME) content type of the given file by [examining the first 512 bytes of the file](https://mimesniff.spec.whatwg.org/). It returns the content type as a string. -* **file.walk**: Walks the given directory in the Git repository and lists all files. +* **file.walk(path)**: Walks the given path (directory or file) in the Git repository and returns a list of paths to all regular files (not directories) as an array of strings. -* **github_workflow.ls_actions**: Lists all actions in the given GitHub workflow directory. +* **github_workflow.ls_actions(directory)**: Lists all actions in the given GitHub workflow directory, returning the filenames as an array of strings. + +* **parse_yaml**: Parses a YAML string into a JSON object. This implementation uses https://gopkg.in/yaml.v3, which avoids bugs when parsing `"on"` as an object _key_ (for example, in GitHub workflows). + +* **jq.is_true(object, query)**: Evaluates a jq query against the specified object, returning `true` if the query result is a true boolean value, andh `false` otherwise. + +* **file.archive(paths)**: _(experimental)_ Builds a `.tar.gz` format archive containing all files under the given paths. Returns the archive contents as a (binary) string. + +_(experimental)_ In addition, when operating in a pull request context, `base_file` versions of the `file` operations are available for accessing the files in the base branch of the pull request. The `file` versions of the operations operate on the head (proposed changes) versions of the files in a pull request context. + +In addition, most of the [standard OPA functions are available in the Minder runtime](https://www.openpolicyagent.org/docs/latest/policy-reference/#built-in-functions). ## Example: CodeQL-Enabled Check diff --git a/docs/docs/index.md b/docs/docs/index.mdx similarity index 57% rename from docs/docs/index.md rename to docs/docs/index.mdx index b62a9600fc..3585a4f63a 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.mdx @@ -3,7 +3,16 @@ title: Minder sidebar_position: 1 --- -![minder logo](./images/Minder_darkMode.png) +import useBaseUrl from '@docusaurus/useBaseUrl'; +import ThemedImage from '@theme/ThemedImage'; + + # What is Minder? @@ -11,14 +20,14 @@ Minder is an open source platform that helps development teams and open source c Minder allows users to enroll repositories and define policy to ensure repositories and artifacts are configured consistently and securely. Policies can be set to alert only or autoremediate. Minder provides a predefined set of rules and can also be configured to apply custom rules. -Minder can be deployed as a Helm chart and provides a CLI tool ‘minder’. Minder is designed to be extensible, allowing users to integrate with their existing tooling and processes. +Minder can be deployed as a Helm chart and provides a CLI tool 'minder'. Minder is designed to be extensible, allowing users to integrate with their existing tooling and processes. ## Features -* **Repo configuration and security:** Simplify configuration and management of security settings and policies across repos. -* **Proactive security enforcement:** Continuously enforce best practice security configurations by setting granular policies to alert only or auto-remediate. -* **Artifact attestation:** Continuously verify that packages are signed to ensure they’re tamper-proof, using the open source project Sigstore. -* **Dependency management:** Manage dependency security posture by helping developers make better choices and enforcing controls. Minder is integrated with [OSV](https://osv.dev/) and [Trusty](https://trustypkg.dev) to enable policy-driven dependency management based on the risk level of dependencies. +- **Repo configuration and security:** Simplify configuration and management of security settings and policies across repos. +- **Proactive security enforcement:** Continuously enforce best practice security configurations by setting granular policies to alert only or auto-remediate. +- **Artifact attestation:** Continuously verify that packages are signed to ensure they're tamper-proof, using the open source project Sigstore. +- **Dependency management:** Manage dependency security posture by helping developers make better choices and enforcing controls. Minder is integrated with [OSV](https://osv.dev/) and [Stacklok Insight](https://insight.stacklok.com) to enable policy-driven dependency management based on the risk level of dependencies. ## Minder Public Instance @@ -26,6 +35,4 @@ Stacklok, a company supporting Minder, provides a free-to-use public instance of ## Status -Minder is currently in _Alpha_, meaning that it is not ready for production use: features and functionality is likely to change. - The public roadmap for Minder is available here: [link](./about/roadmap.md) diff --git a/docs/docs/integrations/overview.md b/docs/docs/integrations/overview.md index c5837a18ca..de93c35735 100644 --- a/docs/docs/integrations/overview.md +++ b/docs/docs/integrations/overview.md @@ -29,12 +29,11 @@ Examples of integrations include: For more information, see the [OSS Integrations](community_integrations.md) documentation. -## Trusty +## Stacklok Insight -Trusty is a tool that helps you make better decisions about your dependencies. It provides a set -of heuristics to help you decide if a dependency is trustworthy or not. It's also developed by -your friends at Stacklok! +Stacklok Insight is a tool that helps you make better decisions about your dependencies. It provides a set +of heuristics to help you decide if a dependency is trustworthy or not. -Trusty is integrated into Minder via a dedicated rule type. +Stacklok Insight is integrated into Minder via a dedicated rule type. -For more information, see the [Trusty](trusty.md) documentation. +For more information, see the [Stacklok Insight](stacklok-insight.md) documentation. diff --git a/docs/docs/integrations/trusty.md b/docs/docs/integrations/stacklok-insight.md similarity index 55% rename from docs/docs/integrations/trusty.md rename to docs/docs/integrations/stacklok-insight.md index 0fa9034743..4c6b95ae39 100644 --- a/docs/docs/integrations/trusty.md +++ b/docs/docs/integrations/stacklok-insight.md @@ -1,21 +1,21 @@ --- -title: Trusty +title: Stacklok Insight sidebar_position: 40 --- -# Trusty Integration +# Stacklok Insight Integration -Minder integrates directly with [Trusty by Stacklok](http://trustypkg.dev) to enable policy-driven dependency management based on the risk level of dependencies. +Minder integrates directly with [Stacklok Insight](http://insight.stacklok.com) to enable policy-driven dependency management based on the risk level of dependencies. -Minder provides a [Trusty rule type](../ref/rules/pr_trusty_check.md) which allows you to monitor new pull requests for newly added dependencies with low [Trusty](https://www.trustypkg.dev/) scores. +Minder provides a [Stacklok Insight rule type](../ref/rules/pr_trusty_check.md) which allows you to monitor new pull requests for newly added dependencies with risk indicators from [Stacklok Insight](https://insight.stacklok.com/). For every pull request submitted to a repository, this rule will check if the pull request adds a new dependency with -a Trusty score below a threshold that you define. If a dependency with a low score is added, Minder will notify you and +risk indicators from Stacklok Insight that exceed thresholds that you define. If a risky dependency is added, Minder will notify you and suggest an alternative package, if one is available. -Here we see Minder in action, commenting on a pull request that adds a package with a low Trusty score: +Here we see Minder in action, commenting on a pull request that adds a package with risk indicators from Stacklok Insight: -![Minder commenting on PR with low Trusty score](./low-trusty-score-pr.png) +![Minder commenting on PR with Stacklok Insight risk signals](./low-trusty-score-pr.png) ## Create the rule type @@ -45,15 +45,15 @@ minder ruletype create -f rule-types/github/pr_trusty_check.yaml Next, create a profile that applies the rule to all registered repositories. -Create a new file called `low-trusty-score-profile.yaml`. In this profile the following options are configured: -- `action` is set to `summary` allowing Minder to comment on pull requests with a low Trusty score, providing an explanation of the issue and possible alternatives. -- `ecosystem_config` is set to check the `pypi` ecosystem for new dependencies whose Trusty score is below the threshold of 5. +Create a new file called `stacklok-insight-risk-profile.yaml`. In this profile the following options are configured: +- `action` is set to `summary` allowing Minder to comment on pull requests with risk indicators from Stacklok Insight, providing an explanation of the issue and possible alternatives. +- `ecosystem_config` is set to check the `pypi` ecosystem for new dependencies whose Stacklok Insight activity score is below the threshold of 5.the threshold of 5. ```yaml --- version: v1 type: profile -name: low-trusty-score-profile +name: stacklok-insight-risk-profile context: provider: github remediate: "on" @@ -63,13 +63,13 @@ pull_request: action: summary ecosystem_config: - name: pypi - score: 5 + activity: 5 ``` Create the profile in Minder: ```bash -minder profile create -f low-trusty-score-profile.yaml +minder profile create -f stacklok-insight-risk-profile.yaml ``` -That's it! Any registered repos will now be monitored for new dependencies with low Trusty scores. +That's it! Any registered repos will now be monitored for new dependencies with risk indicators from Stacklok Insight. diff --git a/docs/docs/ref/cli/minder.md b/docs/docs/ref/cli/minder.md index 1a0695dfdb..800499d897 100644 --- a/docs/docs/ref/cli/minder.md +++ b/docs/docs/ref/cli/minder.md @@ -28,6 +28,7 @@ https://docs.stacklok.com/minder * [minder artifact](minder_artifact.md) - Manage artifacts within a minder control plane * [minder auth](minder_auth.md) - Authorize and manage accounts within a minder control plane * [minder completion](minder_completion.md) - Generate the autocompletion script for the specified shell +* [minder datasource](minder_datasource.md) - Manage data sources within a minder control plane * [minder docs](minder_docs.md) - Generates documentation for the client * [minder history](minder_history.md) - View evaluation history * [minder profile](minder_profile.md) - Manage profiles diff --git a/docs/docs/ref/cli/minder_datasource.md b/docs/docs/ref/cli/minder_datasource.md new file mode 100644 index 0000000000..577c71e466 --- /dev/null +++ b/docs/docs/ref/cli/minder_datasource.md @@ -0,0 +1,43 @@ +--- +title: minder datasource +--- +## minder datasource + +Manage data sources within a minder control plane + +### Synopsis + +The data source subcommand allows the management of data sources within Minder. + +``` +minder datasource [flags] +``` + +### Options + +``` + -h, --help help for datasource + -j, --project string ID of the project +``` + +### Options inherited from parent commands + +``` + --config string Config file (default is $PWD/config.yaml) + --grpc-host string Server host (default "api.stacklok.com") + --grpc-insecure Allow establishing insecure connections + --grpc-port int Server port (default 443) + --identity-client string Identity server client ID (default "minder-cli") + --identity-url string Identity server issuer URL (default "https://auth.stacklok.com") + -v, --verbose Output additional messages to STDERR +``` + +### SEE ALSO + +* [minder](minder.md) - Minder controls the hosted minder service +* [minder datasource apply](minder_datasource_apply.md) - Apply a data source +* [minder datasource create](minder_datasource_create.md) - Create a data source +* [minder datasource delete](minder_datasource_delete.md) - Delete a data source +* [minder datasource get](minder_datasource_get.md) - Get data source details +* [minder datasource list](minder_datasource_list.md) - List data sources + diff --git a/docs/docs/ref/cli/minder_datasource_apply.md b/docs/docs/ref/cli/minder_datasource_apply.md new file mode 100644 index 0000000000..546090e23d --- /dev/null +++ b/docs/docs/ref/cli/minder_datasource_apply.md @@ -0,0 +1,39 @@ +--- +title: minder datasource apply +--- +## minder datasource apply + +Apply a data source + +### Synopsis + +The datasource apply subcommand lets you create or update data sources for a project within Minder. + +``` +minder datasource apply [flags] +``` + +### Options + +``` + -f, --file stringArray Path to the YAML defining the data source (or - for stdin). Can be specified multiple times. Can be a directory. + -h, --help help for apply +``` + +### Options inherited from parent commands + +``` + --config string Config file (default is $PWD/config.yaml) + --grpc-host string Server host (default "api.stacklok.com") + --grpc-insecure Allow establishing insecure connections + --grpc-port int Server port (default 443) + --identity-client string Identity server client ID (default "minder-cli") + --identity-url string Identity server issuer URL (default "https://auth.stacklok.com") + -j, --project string ID of the project + -v, --verbose Output additional messages to STDERR +``` + +### SEE ALSO + +* [minder datasource](minder_datasource.md) - Manage data sources within a minder control plane + diff --git a/docs/docs/ref/cli/minder_datasource_create.md b/docs/docs/ref/cli/minder_datasource_create.md new file mode 100644 index 0000000000..8c8689f4a4 --- /dev/null +++ b/docs/docs/ref/cli/minder_datasource_create.md @@ -0,0 +1,39 @@ +--- +title: minder datasource create +--- +## minder datasource create + +Create a data source + +### Synopsis + +The datasource create subcommand lets you create new data sources for a project within Minder. + +``` +minder datasource create [flags] +``` + +### Options + +``` + -f, --file stringArray Path to the YAML defining the data source (or - for stdin). Can be specified multiple times. Can be a directory. + -h, --help help for create +``` + +### Options inherited from parent commands + +``` + --config string Config file (default is $PWD/config.yaml) + --grpc-host string Server host (default "api.stacklok.com") + --grpc-insecure Allow establishing insecure connections + --grpc-port int Server port (default 443) + --identity-client string Identity server client ID (default "minder-cli") + --identity-url string Identity server issuer URL (default "https://auth.stacklok.com") + -j, --project string ID of the project + -v, --verbose Output additional messages to STDERR +``` + +### SEE ALSO + +* [minder datasource](minder_datasource.md) - Manage data sources within a minder control plane + diff --git a/docs/docs/ref/cli/minder_datasource_delete.md b/docs/docs/ref/cli/minder_datasource_delete.md new file mode 100644 index 0000000000..ee170af023 --- /dev/null +++ b/docs/docs/ref/cli/minder_datasource_delete.md @@ -0,0 +1,41 @@ +--- +title: minder datasource delete +--- +## minder datasource delete + +Delete a data source + +### Synopsis + +The datasource delete subcommand lets you delete a data source within Minder. + +``` +minder datasource delete [flags] +``` + +### Options + +``` + -h, --help help for delete + -i, --id string ID of the data source to delete + -n, --name string Name of the data source to delete + -o, --output string Output format (one of json,yaml,table) (default "table") +``` + +### Options inherited from parent commands + +``` + --config string Config file (default is $PWD/config.yaml) + --grpc-host string Server host (default "api.stacklok.com") + --grpc-insecure Allow establishing insecure connections + --grpc-port int Server port (default 443) + --identity-client string Identity server client ID (default "minder-cli") + --identity-url string Identity server issuer URL (default "https://auth.stacklok.com") + -j, --project string ID of the project + -v, --verbose Output additional messages to STDERR +``` + +### SEE ALSO + +* [minder datasource](minder_datasource.md) - Manage data sources within a minder control plane + diff --git a/docs/docs/ref/cli/minder_datasource_get.md b/docs/docs/ref/cli/minder_datasource_get.md new file mode 100644 index 0000000000..3e215563fa --- /dev/null +++ b/docs/docs/ref/cli/minder_datasource_get.md @@ -0,0 +1,41 @@ +--- +title: minder datasource get +--- +## minder datasource get + +Get data source details + +### Synopsis + +The datasource get subcommand lets you retrieve details for a data source within Minder. + +``` +minder datasource get [flags] +``` + +### Options + +``` + -h, --help help for get + -i, --id string ID of the data source to get info from + -n, --name string Name of the data source to get info from + -o, --output string Output format (one of json,yaml,table) (default "table") +``` + +### Options inherited from parent commands + +``` + --config string Config file (default is $PWD/config.yaml) + --grpc-host string Server host (default "api.stacklok.com") + --grpc-insecure Allow establishing insecure connections + --grpc-port int Server port (default 443) + --identity-client string Identity server client ID (default "minder-cli") + --identity-url string Identity server issuer URL (default "https://auth.stacklok.com") + -j, --project string ID of the project + -v, --verbose Output additional messages to STDERR +``` + +### SEE ALSO + +* [minder datasource](minder_datasource.md) - Manage data sources within a minder control plane + diff --git a/docs/docs/ref/cli/minder_datasource_list.md b/docs/docs/ref/cli/minder_datasource_list.md new file mode 100644 index 0000000000..1148222028 --- /dev/null +++ b/docs/docs/ref/cli/minder_datasource_list.md @@ -0,0 +1,39 @@ +--- +title: minder datasource list +--- +## minder datasource list + +List data sources + +### Synopsis + +The datasource list subcommand lets you list all data sources within Minder. + +``` +minder datasource list [flags] +``` + +### Options + +``` + -h, --help help for list + -o, --output string Output format (one of json,yaml,table) (default "table") +``` + +### Options inherited from parent commands + +``` + --config string Config file (default is $PWD/config.yaml) + --grpc-host string Server host (default "api.stacklok.com") + --grpc-insecure Allow establishing insecure connections + --grpc-port int Server port (default 443) + --identity-client string Identity server client ID (default "minder-cli") + --identity-url string Identity server issuer URL (default "https://auth.stacklok.com") + -j, --project string ID of the project + -v, --verbose Output additional messages to STDERR +``` + +### SEE ALSO + +* [minder datasource](minder_datasource.md) - Manage data sources within a minder control plane + diff --git a/docs/docs/ref/proto.md b/docs/docs/ref/proto.md index beceb7eac4..df4dac507d 100644 --- a/docs/docs/ref/proto.md +++ b/docs/docs/ref/proto.md @@ -62,6 +62,22 @@ export const TypeLink = ({ children, type }) => { +DataSourceService + + + +| Method Name | Request Type | Response Type | Description | +| ----------- | ------------ | ------------- | ------------| +| CreateDataSource | [CreateDataSourceRequest](#minder-v1-CreateDataSourceRequest) | [CreateDataSourceResponse](#minder-v1-CreateDataSourceResponse) | | +| GetDataSourceById | [GetDataSourceByIdRequest](#minder-v1-GetDataSourceByIdRequest) | [GetDataSourceByIdResponse](#minder-v1-GetDataSourceByIdResponse) | | +| GetDataSourceByName | [GetDataSourceByNameRequest](#minder-v1-GetDataSourceByNameRequest) | [GetDataSourceByNameResponse](#minder-v1-GetDataSourceByNameResponse) | | +| ListDataSources | [ListDataSourcesRequest](#minder-v1-ListDataSourcesRequest) | [ListDataSourcesResponse](#minder-v1-ListDataSourcesResponse) | | +| UpdateDataSource | [UpdateDataSourceRequest](#minder-v1-UpdateDataSourceRequest) | [UpdateDataSourceResponse](#minder-v1-UpdateDataSourceResponse) | | +| DeleteDataSourceById | [DeleteDataSourceByIdRequest](#minder-v1-DeleteDataSourceByIdRequest) | [DeleteDataSourceByIdResponse](#minder-v1-DeleteDataSourceByIdResponse) | | +| DeleteDataSourceByName | [DeleteDataSourceByNameRequest](#minder-v1-DeleteDataSourceByNameRequest) | [DeleteDataSourceByNameResponse](#minder-v1-DeleteDataSourceByNameResponse) | | + + + EvalResultsService @@ -168,7 +184,6 @@ replies with OK | CreateProvider | [CreateProviderRequest](#minder-v1-CreateProviderRequest) | [CreateProviderResponse](#minder-v1-CreateProviderResponse) | | | DeleteProvider | [DeleteProviderRequest](#minder-v1-DeleteProviderRequest) | [DeleteProviderResponse](#minder-v1-DeleteProviderResponse) | | | DeleteProviderByID | [DeleteProviderByIDRequest](#minder-v1-DeleteProviderByIDRequest) | [DeleteProviderByIDResponse](#minder-v1-DeleteProviderByIDResponse) | | -| GetUnclaimedProviders | [GetUnclaimedProvidersRequest](#minder-v1-GetUnclaimedProvidersRequest) | [GetUnclaimedProvidersResponse](#minder-v1-GetUnclaimedProvidersResponse) | GetUnclaimedProviders returns a list of known provider configurations that this user could claim based on their identity. This is a read-only operation for use by clients which wish to present a menu of options. | | ListProviderClasses | [ListProviderClassesRequest](#minder-v1-ListProviderClassesRequest) | [ListProviderClassesResponse](#minder-v1-ListProviderClassesResponse) | | | ReconcileEntityRegistration | [ReconcileEntityRegistrationRequest](#minder-v1-ReconcileEntityRegistrationRequest) | [ReconcileEntityRegistrationResponse](#minder-v1-ReconcileEntityRegistrationResponse) | | @@ -229,11 +244,11 @@ manage Users CRUD | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | artifact_pk | string | | | -| owner | string | | | +| owner | string | | owner is the artifact owner. This is optional. | | name | string | | | | type | string | | | | visibility | string | | | -| repository | string | | | +| repository | string | | repository is the repository the artifact originated from. This is optional. | | versions | ArtifactVersion | repeated | | | created_at | google.protobuf.Timestamp | | | | context | Context | | | @@ -248,7 +263,8 @@ ArtifactType defines the artifact data evaluation. ArtifactVersion - +ArtifactVersion is a version of an artifact. +This is currently not populated in any requests or responses. | Field | Type | Label | Description | @@ -279,8 +295,8 @@ ArtifactType defines the artifact data evaluation. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| role_assignment | RoleAssignment | | role_assignment is the role assignment that was created. | -| invitation | Invitation | | invitation contains the details of the invitation for the assigned user to join the project if the user is not already a member. | +| role_assignment | RoleAssignment | | role_assignment is the role assignment that was created. This is optional. | +| invitation | Invitation | | invitation contains the details of the invitation for the assigned user to join the project if the user is not already a member. This is optional. | @@ -320,18 +336,6 @@ and undefined so for the "let's not auto-register anything" case we'd just let t -BranchProtection - - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| branch | string | | | -| is_protected | bool | | Add other relevant fields | - - - Build @@ -378,7 +382,7 @@ buf compatibility checks. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | provider | string | optional | name of the provider | -| project | string | optional | ID of the project | +| project | string | optional | ID of the project. If empty or unset, will select the user's default project if they only have one project. | | retired_organization | string | optional | | @@ -390,11 +394,33 @@ ContextV2 defines the context in which a rule is evaluated. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| project_id | string | | project is the project ID | +| project_id | string | | project is the project ID. If empty or unset, will select the user's default project if they only have one project. | | provider | string | | name of the provider. Set to empty string when not applicable. | +CreateDataSourceRequest + +DataSource service + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| data_source | DataSource | | | + + + +CreateDataSourceResponse + + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| data_source | DataSource | | | + + + CreateEntityReconciliationTaskRequest @@ -524,7 +550,7 @@ User service | project_name | string | | | | identity_subject | string | | | | created_at | google.protobuf.Timestamp | | | -| context | Context | | | +| context | Context | | **Deprecated.** | @@ -538,8 +564,8 @@ retrieve. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| cursor | string | | cursor is the index to start from within the collection being retrieved. It's an opaque payload specified and interpreted on an per-rpc basis. | -| size | uint32 | | size is the number of items to retrieve from the collection. | +| cursor | string | | cursor is the index to start from within the collection being retrieved. It's an opaque payload specified and interpreted on an per-rpc basis. An empty string is used to indicate the first item in the collection. | +| size | uint32 | | size is the number of items to retrieve from the collection. 0 uses a server-defined default. | @@ -553,8 +579,87 @@ subsets with respect to the one containing this struct. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | total_records | uint32 | | Total number of records matching the request. This is optional. | -| next | Cursor | | Cursor pointing to retrieve results logically placed after the ones shipped with the message containing this struct. | -| prev | Cursor | | Cursor pointing to retrieve results logically placed before the ones shipped with the message containing this struct. | +| next | Cursor | | Cursor pointing to retrieve results logically placed after the ones shipped with the message containing this struct. This is optional. | +| prev | Cursor | | Cursor pointing to retrieve results logically placed before the ones shipped with the message containing this struct. This is optional. | + + + +DataSource + +DataSource is a Data source instance. Data sources represent +external integrations that enrich the data in Minder, but do not +have explicit lifecycle objects (entities). Integrations which +create entities are called Providers. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| version | string | | version is the version of the data source API. | +| type | string | | type is the data source type | +| context | ContextV2 | | context is the context in which the data source is evaluated. Note that in this case we only need the project in the context, since data sources are not provider-specific. | +| name | string | | name is the name of the data source. Note that this is unique within a project hierarchy. Names must be lowercase and can only contain letters, numbers, hyphens, and underscores. | +| id | string | | id is the unique identifier of the data source. | +| structured | StructDataSource | | structured is the structired data - data source. | +| rest | RestDataSource | | rest is the REST data source driver. | + + + +DataSourceReference + +DataSourceReference is a reference to a data source. +Note that for a resource to refer to a data source the data source must +be available in the same project hierarchy. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | string | | refer to a data source by name. | + + + +DeleteDataSourceByIdRequest + + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| context | ContextV2 | | | +| id | string | | | + + + +DeleteDataSourceByIdResponse + + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| id | string | | | + + + +DeleteDataSourceByNameRequest + + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| context | ContextV2 | | | +| name | string | | | + + + +DeleteDataSourceByNameResponse + + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | string | | | @@ -720,6 +825,42 @@ DeleteRuleTypeResponse is the response to delete a rule type. +DepsType + +DepsType defines the "deps" ingester which can extract depndencies in protobom +format for rule evaluation. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| repo | DepsType.RepoConfigs | | | +| pr | DepsType.PullRequestConfigs | | | + + + +DepsType.PullRequestConfigs + + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| filter | string | | filter is the filter to apply to the PRs. The default value is "NEW_AND_UPDATED". | + + + +DepsType.RepoConfigs + +branch is the branch of the git repository, when applied to repository entities. +Has no meaning or effect on other entity types. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| branch | string | | | + + + DiffType DiffType defines the diff data ingester. @@ -770,7 +911,7 @@ Namespace: is the namespace for the DockerHub provider. EntityInstance - +used for parsing resources in ruletypes | Field | Type | Label | Description | @@ -812,7 +953,8 @@ EvalResultAlert holds the alert details for a given rule evaluation EvaluationHistory - +EvaluationHistory represents the history of an entity evaluation. +This is only used in responses. | Field | Type | Label | Description | @@ -820,8 +962,8 @@ EvalResultAlert holds the alert details for a given rule evaluation | entity | EvaluationHistoryEntity | | entity contains details of the entity which was evaluated. | | rule | EvaluationHistoryRule | | rule contains details of the rule which the entity was evaluated against. | | status | EvaluationHistoryStatus | | status contains the evaluation status. | -| alert | EvaluationHistoryAlert | | alert contains details of the alerts for this evaluation. | -| remediation | EvaluationHistoryRemediation | | remediation contains details of the remediation for this evaluation. | +| alert | EvaluationHistoryAlert | | alert contains details of the alerts for this evaluation. This is optional. | +| remediation | EvaluationHistoryRemediation | | remediation contains details of the remediation for this evaluation. This is optional. | | evaluated_at | google.protobuf.Timestamp | | created_at is the timestamp of creation of this evaluation | | id | string | | id is the unique identifier of the evaluation. | @@ -923,7 +1065,7 @@ Namespace: is the namespace for the GHCR provider. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | artifact | Artifact | | | -| versions | ArtifactVersion | repeated | | +| versions | ArtifactVersion | repeated | This is optional and currently always nil. | @@ -947,7 +1089,7 @@ Namespace: is the namespace for the GHCR provider. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | artifact | Artifact | | | -| versions | ArtifactVersion | repeated | | +| versions | ArtifactVersion | repeated | This is optional and currently always nil. | @@ -958,11 +1100,10 @@ Namespace: is the namespace for the GHCR provider. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| cli | bool | | | -| port | int32 | | | -| owner | string | optional | | +| cli | bool | | cli is true if the request is being made from a CLI. | +| owner | string | optional | owner is the owner (e.g GitHub org) that the provider is associated with. This is optional. | | context | Context | | | -| redirect_url | string | optional | | +| redirect_url | string | optional | redirect_url is the URL to redirect to after the authorization is complete. | | config | google.protobuf.Struct | | config is a JSON object that can be used to pass additional configuration | | provider_class | string | | | @@ -980,6 +1121,52 @@ Namespace: is the namespace for the GHCR provider. +GetDataSourceByIdRequest + + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| context | ContextV2 | | | +| id | string | | | + + + +GetDataSourceByIdResponse + + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| data_source | DataSource | | | + + + +GetDataSourceByNameRequest + +GetDataSourceByNameRequest is the request message for the GetDataSourceByName RPC. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| context | ContextV2 | | | +| name | string | | | + + + +GetDataSourceByNameResponse + + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| data_source | DataSource | | | + + + GetEvaluationHistoryRequest GetEvaluationHistoryRequest represents a request for the GetEvaluationHistory endpoint @@ -1084,11 +1271,11 @@ get profile by name | ----- | ---- | ----- | ----------- | | context | Context | | context is the context in which the rule type is evaluated. | | name | string | | name is the name of the profile to get | -| entity | EntityTypedId | | | -| all | bool | | | +| entity | EntityTypedId | | entity is the entity to get status for. Incompatible with `all`. This is optional. | +| all | bool | | all is true if the status of all entities should be returned. Incompatible with `entity`. This is optional. | | rule | string | | **Deprecated.** rule is the type of the rule. Deprecated in favor of rule_type | -| rule_type | string | | | -| rule_name | string | | | +| rule_type | string | | rule_type is the type of the rule to filter on. This is optional. | +| rule_name | string | | rule_name is the name of the rule to filter on. This is optional. | @@ -1242,28 +1429,6 @@ GetRuleTypeByNameResponse is the response to get a rule type by name. -GetUnclaimedProvidersRequest - - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| context | Context | | context is the context in which the set of providers are evaluated. | - - - -GetUnclaimedProvidersResponse - - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| providers | ProviderParameter | repeated | providers is a set of parameters which can be supplied to allow the user to assign existing unclaimed credentials to a new provider in the project via CreateProvider(). | - - - GetUserRequest get user @@ -1354,7 +1519,7 @@ GitType defines the git data ingester. Invitation - +Invitation is an invitation to join a project. This is only used in responses. | Field | Type | Label | Description | @@ -1381,9 +1546,9 @@ GitType defines the git data ingester. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| provider | string | | | +| provider | string | | **Deprecated.** | | context | Context | | | -| from | string | | | +| from | string | | from is the filter to apply to the list of artifacts. An example is "repository=org1/repo1,org2/repo2" to filter by repository names. This is optional. | @@ -1421,6 +1586,28 @@ GitType defines the git data ingester. +ListDataSourcesRequest + + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| context | ContextV2 | | | + + + +ListDataSourcesResponse + + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| data_sources | DataSource | repeated | | + + + ListEvaluationHistoryRequest ListEvaluationHistoryRequest represents a request message for the @@ -1441,7 +1628,10 @@ which is used for pagination. | alert | string | repeated | List of alert statuses to retrieve. | | from | google.protobuf.Timestamp | | Timestamp representing the start time of the selection window. | | to | google.protobuf.Timestamp | | Timestamp representing the end time of the selection window. | -| cursor | Cursor | | Cursor object to select the "page" of data to retrieve. | +| label_filter | string | repeated | Filter evaluation history to only those matching the specified labels. + +The default is to return all user-created profiles; the string "*" can be used to select all profiles, including system profiles. This syntax may be expanded in the future. | +| cursor | Cursor | | Cursor object to select the "page" of data to retrieve. This is optional. | @@ -1602,7 +1792,7 @@ The default is to return all user-created profiles; the string "*" can be used t | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | context | Context | | context is the context in which the providers are evaluated. | -| limit | int32 | | limit is the maximum number of providers to return. | +| limit | int32 | | limit is the maximum number of providers to return. 0 uses a server-defined default. | | cursor | string | | cursor is the cursor to use for the page of results, empty if at the beginning | @@ -1651,9 +1841,9 @@ The default is to return all user-created profiles; the string "*" can be used t | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | provider | string | | **Deprecated.** | -| limit | int64 | | | +| limit | int64 | | limit is the maximum number of results to return. This is optional. | | context | Context | | | -| cursor | string | | | +| cursor | string | | cursor is the cursor to use for the next page of results. This is optional. | @@ -1792,7 +1982,7 @@ ListRuleTypesResponse is the response to list rule types. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| context | Context | | | +| context | Context | | context is the context in which the provider is updated. The provider name is required in this context. | | patch | Provider | | | | update_mask | google.protobuf.FieldMask | | | @@ -1818,6 +2008,7 @@ ListRuleTypesResponse is the response to list rule types. Profile Profile defines a profile that is user defined. +All fields are optional because we want to allow partial updates. | Field | Type | Label | Description | @@ -1877,13 +2068,13 @@ Rule defines the individual call of a certain rule type. ProfileStatus -get the overall profile status +get the overall profile status as output | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| profile_id | string | | profile_id is the id of the profile | -| profile_name | string | | profile_name is the name of the profile | +| profile_id | string | | profile_id is the id of the profile. One of profile_id or profile_name must be set. | +| profile_name | string | | profile_name is the name of the profile. One of profile_id or profile_name must be set. | | profile_status | string | | profile_status is the status of the profile | | last_updated | google.protobuf.Timestamp | | last_updated is the last time the profile was updated | | profile_display_name | string | | profile_display_name is the display name of the profile | @@ -1892,17 +2083,17 @@ get the overall profile status Project -Project API Objects +Project API Objects. This is only used in responses. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | project_id | string | | | | name | string | | | -| description | string | | | +| description | string | | description is a human-readable description of the project. This is optional. | | created_at | google.protobuf.Timestamp | | | | updated_at | google.protobuf.Timestamp | | | -| display_name | string | | display_name allows for a human-readable name to be used. display_names are short *non-unique* strings to provide a user-friendly name for presentation in lists, etc. | +| display_name | string | | display_name allows for a human-readable name to be used. display_names are short *non-unique* strings to provide a user-friendly name for presentation in lists, etc. This is optional. | @@ -1932,7 +2123,8 @@ ProjectRole has the project along with the role the user has in the project Provider - +Provider represents a provider that is used to interact with external systems. +All fields are optional because we want to allow partial updates. | Field | Type | Label | Description | @@ -1940,12 +2132,13 @@ ProjectRole has the project along with the role the user has in the project | name | string | | name is the name of the provider. | | class | string | | class is the name of the provider implementation, eg. 'github' or 'gh-app'. | | project | string | | project is the project where the provider is. This is ignored on input in favor of the context field in CreateProviderRequest. | -| version | string | | version is the version of the provider. | +| version | string | | version is the version of the provider. if unset, "v1" is assumed. | | implements | ProviderType | repeated | implements is the list of interfaces that the provider implements. | | config | google.protobuf.Struct | | config is the configuration of the provider. | | auth_flows | AuthorizationFlow | repeated | auth_flows is the list of authorization flows that the provider supports. | | parameters | ProviderParameter | | parameters is the list of parameters that the provider requires. | | credentials_state | string | | credentials_state is the state of the credentials for the provider. This is an output-only field. It may be: "set", "unset", "not_applicable". | +| id | string | | id is the unique identifier of the provider. | @@ -1971,29 +2164,6 @@ ProviderConfig contains the generic configuration for a provider. -PullRequest - - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| url | string | | The full URL to the PR | -| commit_sha | string | | Commit SHA of the PR HEAD. Will be useful to submit a review | -| number | int64 | | The sequential PR number (not the DB PK!) | -| repo_owner | string | | The owner of the repo, will be used to submit a review | -| repo_name | string | | The name of the repo, will be used to submit a review | -| author_id | int64 | | The author of the PR, will be used to check if we can request changes | -| action | string | | The action that triggered the webhook | -| context | Context | | | -| properties | google.protobuf.Struct | | properties is a map of properties of the entity. | -| base_clone_url | string | | URL used to clone the base repository | -| target_clone_url | string | | URL used to clone the target repository | -| base_ref | string | | The base ref of the PR | -| target_ref | string | | The target ref of the PR | - - - RESTProviderConfig RESTProviderConfig contains the configuration for the REST provider. @@ -2013,7 +2183,7 @@ RESTProviderConfig contains the configuration for the REST provider. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | context | Context | | | -| entity | string | | | +| entity | string | | entity is the entity type | @@ -2055,9 +2225,9 @@ RESTProviderConfig contains the configuration for the REST provider. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | provider | string | | **Deprecated.** | -| repository | UpstreamRepositoryRef | | | +| repository | UpstreamRepositoryRef | | repository is the repository to register. This is optional if entity is set. | | context | Context | | | -| entity | UpstreamEntityRef | | entity is the entity to register. This is the same as the repository field, but uses the new UpstreamEntityRef message. This is what we'll migrate to eventually. | +| entity | UpstreamEntityRef | | entity is the entity to register. This is the same as the repository field, but uses the new UpstreamEntityRef message. This is what we'll migrate to eventually. This is optional if repository is set. | @@ -2116,12 +2286,12 @@ Stubs for the SDLC entities Repository - +Repository API objects. This is only used in responses. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| id | string | optional | This is optional when returning remote repositories | +| id | string | optional | id is the unique identifier of the repository within Minder. It is always populated, but the optional keyword is used for backwards compatibility. | | context | Context | optional | | | owner | string | | | | name | string | | | @@ -2170,6 +2340,73 @@ Stubs for the SDLC entities +RestDataSource + +RestDataSource is the REST data source driver. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| def | RestDataSource.DefEntry | repeated | defs is the list of definitions for the REST API. | + + + +RestDataSource.Def + + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| endpoint | string | | endpoint is the URL of the REST API. Note that endpoints are templates that can be parameterized with variables. Parametrization is done using RFC 6570. | +| method | string | | method is the HTTP method to use for the request. If left unset, it will default to "GET". | +| headers | RestDataSource.Def.HeadersEntry | repeated | headers is a map of headers to send with the request. | +| bodyobj | google.protobuf.Struct | | body is the body of the request. | +| bodystr | string | | bodystr is the body of the request as a string. | +| body_from_field | string | | body_from_field is the field in the input to use as the body. If the value is an string, it will be used as the body, as is. If the value is an object, it will be serialized as JSON. If the value is not found in the input, the request will fail. | +| parse | string | | parse is the parse configuration for the response. This allows us to serialize the response into a structured format, or not. If left unset, the response will be treated as a string. If set to "json", the response will be parsed as JSON. | +| fallback | RestDataSource.Def.Fallback | repeated | fallback is the fallback configuration for the response in case of an unexpected status code. | +| expected_status | int32 | repeated | expected_status is the expected status code for the response. This may be repeated to allow for multiple expected status codes. If left unset, it will default to 200. | +| input_schema | google.protobuf.Struct | | input_schema is the schema for the input to the REST API. | + + + +RestDataSource.Def.Fallback + + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| http_status | int32 | | | +| body | string | | | + + + +RestDataSource.Def.HeadersEntry + + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | string | | | +| value | string | | | + + + +RestDataSource.DefEntry + + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | string | | | +| value | RestDataSource.Def | | | + + + RestType RestType defines the rest data evaluation. @@ -2178,10 +2415,10 @@ This is used to fetch data from a REST endpoint. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| endpoint | string | | endpoint is the endpoint to fetch data from. This can be a URL or the path on the API.bool This is a required field and must be set. This is also evaluated via a template which allows us dynamically fill in the values. | +| endpoint | string | | endpoint is the endpoint to fetch data from. This can be a URL or path on the API. This is a required field and must be set. This is also evaluated via a template which allows us dynamically fill in the values. | | method | string | | method is the method to use to fetch data. | | headers | string | repeated | headers are the headers to be sent to the endpoint. | -| body | string | optional | body is the body to be sent to the endpoint. | +| body | string | optional | body is the body to be sent to the endpoint. This is expected to be a valid JSON string. | | parse | string | | parse is the parsing mechanism to be used to parse the data. | | fallback | RestType.Fallback | repeated | fallback provides a body that the ingester would return in case the REST call returns a non-200 status code. | @@ -2195,7 +2432,7 @@ This is used to fetch data from a REST endpoint. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | http_code | int32 | | | -| body | string | | | +| body | string | | This is expected to be a valid JSON string. | @@ -2264,7 +2501,7 @@ get the status of the rules for a given profile | rule_type_name | string | | rule_type_name is the name of the rule | | rule_description_name | string | | rule_description_name is the name to describe the rule | | alert | EvalResultAlert | | alert holds the alert details if the rule generated an alert in an external system | -| severity | Severity | | severity is the severity of the rule | +| severity | Severity | | severity is the severity of the rule. This may be empty. | | rule_evaluation_id | string | | rule_evaluation_id is the id of the rule evaluation | | remediation_url | string | | remediation_url is a url to get more data about a remediation, for PRs is the link to the PR | | rule_display_name | string | | rule_display_name captures the display name of the rule | @@ -2300,8 +2537,8 @@ The version is assumed from the folder's version. | short_failure_message | string | | short_failure_message is the message to display when the evaluation fails. | | context | Context | | context is the context in which the rule is evaluated. | | def | RuleType.Definition | | def is the definition of the rule type. | -| description | string | | description is the description of the rule type. | -| guidance | string | | guidance are instructions we give the user in case a rule fails. | +| description | string | | description is the description of the rule type. This is expected to be a valid markdown formatted string. | +| guidance | string | | guidance are instructions we give the user in case a rule fails. This is expected to be a valid markdown formatted string. | | severity | Severity | | severity is the severity of the rule type. | | release_phase | RuleTypeReleasePhase | | release_phase is the release phase of the rule type, i.e. alpha, beta, ga, deprecated. | @@ -2333,6 +2570,18 @@ Definition defines the rule type. It encompases the schema and the data evaluati | ----- | ---- | ----- | ----------- | | type | string | | | | security_advisory | RuleType.Definition.Alert.AlertTypeSA | optional | | +| pull_request_comment | RuleType.Definition.Alert.AlertTypePRComment | optional | | + + + +RuleType.Definition.Alert.AlertTypePRComment + + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| review_message | string | | | @@ -2356,12 +2605,15 @@ endpoint and how we compare it to the rule. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| type | string | | type is the type of the data evaluation. Right now only `jq` is supported as a driver | +| type | string | | type is the type of the data evaluation. | | jq | RuleType.Definition.Eval.JQComparison | repeated | jq is only used if the `jq` type is selected. It defines the comparisons that are made between the ingested data and the profile rule. | | rego | RuleType.Definition.Eval.Rego | optional | rego is only used if the `rego` type is selected. | | vulncheck | RuleType.Definition.Eval.Vulncheck | optional | vulncheck is only used if the `vulncheck` type is selected. | | trusty | RuleType.Definition.Eval.Trusty | optional | The trusty type is no longer used, but is still here for backwards compatibility with existing stored rules | | homoglyphs | RuleType.Definition.Eval.Homoglyphs | optional | homoglyphs is only used if the `homoglyphs` type is selected. | +| data_sources | DataSourceReference | repeated | Data sources that the rule refers to. These are used to instantiate the relevant data sources for the rule and keep track of them as dependencies. + +Note that the data source must exist in the project hierarchy in order to be used in the rule. | @@ -2384,8 +2636,8 @@ endpoint and how we compare it to the rule. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | ingested | RuleType.Definition.Eval.JQComparison.Operator | | Ingested points to the data retrieved in the `ingest` section | -| profile | RuleType.Definition.Eval.JQComparison.Operator | | Profile points to the profile itself. | -| constant | google.protobuf.Value | | Constant points to a constant value | +| profile | RuleType.Definition.Eval.JQComparison.Operator | | Profile points to the profile itself. This is mutually exclusive with the `constant` field. | +| constant | google.protobuf.Value | | Constant points to a constant value. This is mutually exclusive with the `profile` field. | @@ -2440,9 +2692,10 @@ Ingest defines how the data is ingested. | type | string | | type is the type of the data ingestion. we currently support rest, artifact and builtin. | | rest | RestType | optional | rest is the rest data ingestion. this is only used if the type is rest. | | builtin | BuiltinType | optional | builtin is the builtin data ingestion. | -| artifact | ArtifactType | optional | artifact is the artifact data ingestion. | -| git | GitType | optional | git is the git data ingestion. | -| diff | DiffType | optional | diff is the diff data ingestion. | +| artifact | ArtifactType | optional | artifact is the artifact data ingestion. artifact currently only applies to artifacts. | +| git | GitType | optional | git is the git data ingestion. git currently only applies to repositories. | +| diff | DiffType | optional | diff is the diff data ingestion. diff currently only applies to pull_requests. | +| deps | DepsType | optional | deps is the deps data ingestion. deps currently only applies to repositories. | @@ -2478,10 +2731,11 @@ the name stutters a bit but we already use a PullRequest message for handling PR | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| title | string | | the title of the PR | -| body | string | | the body of the PR | +| title | string | | the title of the PR This is not validated here as it will be validated by the repository provider, i.e. GitHub upon creation of the PR. | +| body | string | | the body of the PR This is not validated here as it will be validated by the repository provider, i.e. GitHub upon creation of the PR. | | contents | RuleType.Definition.Remediate.PullRequestRemediation.Content | repeated | | -| method | string | | the method to use to create the PR. For now, these are supported: -- minder.content - ensures that the content of the file is exactly as specified refer to the Content message for more details -- minder.actions.replace_tags_with_sha - finds any github actions within a workflow file and replaces the tag with the SHA | +| method | string | | the method to use to create the PR. For now, these are supported: -- minder.content - ensures that the content of the file is exactly as specified refer to the Content message for more details -- minder.actions.replace_tags_with_sha - finds any github actions within a workflow file and replaces the tag with the SHA -- minder.yq.evaluate - evaluates a yq expression on a file | +| params | google.protobuf.Struct | | params are unstructured parameters passed to the method. These are optional and evaluated by the method. | | actions_replace_tags_with_sha | RuleType.Definition.Remediate.PullRequestRemediation.ActionsReplaceTagsWithSha | optional | If the method is minder.actions.replace_tags_with_sha, this is the configuration for that method | @@ -2530,8 +2784,8 @@ Severity defines the severity of the rule. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | provider | string | | **Deprecated.** | -| access_token | string | | | -| owner | string | optional | | +| access_token | string | | access_token is the token to store. | +| owner | string | optional | owner is the owner (e.g GitHub org) that the provider is associated with. This is optional. | | context | Context | | | @@ -2542,12 +2796,80 @@ Severity defines the severity of the rule. +StructDataSource + +StructDataSource is the structured data source driver. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| def | StructDataSource.DefEntry | repeated | defs is the list of definitions for the structured data API. | + + + +StructDataSource.Def + + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| path | StructDataSource.Def.Path | | Path is the path specification for the structured data source. | + + + +StructDataSource.Def.Path + + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| file_name | string | | | +| alternatives | string | repeated | | + + + +StructDataSource.DefEntry + + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | string | | | +| value | StructDataSource.Def | | | + + + TaskRun +UpdateDataSourceRequest + + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| data_source | DataSource | | | + + + +UpdateDataSourceResponse + + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| data_source | DataSource | | | + + + UpdateProfileRequest @@ -2578,8 +2900,8 @@ Severity defines the severity of the rule. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | context | Context | | context is the context in which the project is updated. | -| display_name | string | | display_name is the display name of the project to update. | -| description | string | | description is the description of the project to update. | +| display_name | string | | display_name is the display name of the project to update. This is optional. | +| description | string | | description is the description of the project to update. This is optional. | @@ -2663,7 +2985,7 @@ provider to identify the entity in the upstream system. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| owner | string | | | +| owner | string | | owner is the owner (e.g GitHub org) that the provider is associated with. This is optional. | | name | string | | | | repo_id | int64 | | The upstream identity of the repository, as an integer. This is only set on output, and is ignored on input. | | context | Context | | | @@ -2705,8 +3027,8 @@ name, if it has been created | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| created | bool | | | -| provider_name | string | | | +| created | bool | | created is true if the provider was created. | +| provider_name | string | | provider_name is the name of the provider that was created. This is populated if creation was successful. | @@ -2874,6 +3196,10 @@ ProviderTrait is the type of the provider. | RELATION_ENTITY_RECONCILIATION_TASK_CREATE | 35 | | | RELATION_ENTITY_RECONCILE | 36 | | | RELATION_ROLE_ASSIGNMENT_UPDATE | 37 | | +| RELATION_DATA_SOURCE_GET | 38 | | +| RELATION_DATA_SOURCE_CREATE | 39 | | +| RELATION_DATA_SOURCE_UPDATE | 40 | | +| RELATION_DATA_SOURCE_DELETE | 41 | | diff --git a/docs/docs/ref/rules/pr_trusty_check.md b/docs/docs/ref/rules/pr_trusty_check.md index 7b28c4196d..e09afe05f1 100644 --- a/docs/docs/ref/rules/pr_trusty_check.md +++ b/docs/docs/ref/rules/pr_trusty_check.md @@ -1,18 +1,19 @@ --- -title: Trusty Score +title: Stacklok Insight check sidebar_position: 20 --- -# Trusty Score Threshold Rule +# Stacklok Insight Rule -The following rule type is available for [Trusty](https://www.trustypkg.dev/) score threshold. +The following rule type is available to check dependency risk with [Stacklok Insight](https://insight.stacklok.com/). -## `pr_trusty_check` - Verifies that pull requests do not add any dependencies with Trusty scores below a certain threshold +## `pr_trusty_check` - Verifies that pull requests do not add any dependencies with risk indicators from Stacklok Insight -This rule allows you to monitor new pull requests for newly added dependencies with low -[Trusty](https://www.trustypkg.dev/) scores. -For every pull request submitted to a repository, this rule will check if the pull request adds a new dependency with -a Trusty score below a threshold that you define. If a dependency with a low score is added, the PR will be commented on. +This rule allows you to monitor new pull requests for newly added dependencies with risk indicators from +[Stacklok Insight](https://insight.stacklok.com/). +For every pull request submitted to a repository, this rule will check any software +dependencies for the supported ecosystems and flag any problems found with them. +Based on the Stacklok Insight data, Minder can block the PR or mark the policy as failed. ## Entity - `pull_request` @@ -25,15 +26,15 @@ a Trusty score below a threshold that you define. If a dependency with a low sco ## Rule Definition Options -The `pr_trusty_check` rule has the following options: +The `pr_trusty_check` rule supports the following options: -- `action` (string): The action to take if a package with a low score is found. Valid values are: - - `summary`: The evaluator engine will add a single summary comment with a table listing the packages with low scores found - - `profile_only`: The evaluator engine will merely pass on an error, marking the profile as failed if a packages with low scores is found +- `action` (string): The action to take if a risky package is found. Valid values are: + - `summary`: The evaluator engine will add a single summary comment with a table listing risky packages found + - `profile_only`: The evaluator engine will merely pass on an error, marking the profile as failed if a risky package is found - `review`: The trusty evaluator will add a review asking for changes when problematic dependencies are found. Use the review action to block any pull requests introducing dependencies that break the policy established defined by the rule. - `ecosystem_config`: An array of ecosystem configurations to check. Each ecosystem configuration has the following options: - `name` (string): The name of the ecosystem to check. Currently `npm` and `pypi` are supported. - - `score` (number): The minimum Trusty score for a dependency to be considered safe. + - `score (integer)`: DEPRECATED - this score is deprecated and only remains for backward compatibility. It always returns a value of `0`. We recommend setting this option to `0` and using the other options to control this rule's behavior. - `provenance` (number): Minimum provenance score to consider a package's proof of origin satisfactory. - `activity` (number): Minimum activity score to consider a package as active. - `allow_malicious` (boolean): Don't raise an error when a PR introduces dependencies known to be malicious (not recommended) diff --git a/docs/docs/run_minder_server/config_provider.md b/docs/docs/run_minder_server/config_provider.md index 17dcdf59c4..d180cd5ac3 100644 --- a/docs/docs/run_minder_server/config_provider.md +++ b/docs/docs/run_minder_server/config_provider.md @@ -38,6 +38,7 @@ Complete the following fields: - Callback URL: `http://localhost:8080/api/v1/auth/callback/github-app/app` - Add an additional Callback URL for Keycloak: `http://localhost:8081/realms/stacklok/broker/github/endpoint` - Select the checkbox for "Request user authorization (OAuth) during installation" + ![Configuring the GitHub Provider](./images/provider-ident-and-auth.png) ### Webhook @@ -55,7 +56,11 @@ Select the following permissions: - Webhooks (read and write) - Workflows (read and write) + - Account permissions: + - Email addresses (read only) + Once completed, double check your selected numbers match the ones in the screenshot. + ![Permissions](./images/provider-permissions.png) ### Installation and Scope @@ -77,6 +82,7 @@ Save the Client secret value for use in the Configure Minder step. ### Generate a private key Scroll down to the bottom of the page and generate a private key. + ![Generate a private key](./images/provider-generate-private.png) This will generate and download your private key. @@ -102,7 +108,9 @@ github-app: ``` Update the `client_id` and `client_secret` values with the following: - Client ID : Found in the General -> About section of your GitHub App on GitHub. + ![Client ID](./images/provider-client-id.png) + - Client Secret : The value you saved previously. ### Add Provider configuration @@ -117,9 +125,11 @@ provider: private_key: ".secrets/github-app.pem" ``` Update the `app_name` with the name of your app, which you can get by looking at the GitHub URL when editing your GitHub App. For example, if the URL is https://github.com/settings/apps/my-test-app, then your app name is my-test-app. + ![App name](./images/provider-app-name.png) Update `app_id` with the app ID of your GitHub App, which is found in the General -> About section of your GitHub App on GitHub. + ![App ID](./images/provider-app-id.png) Finally, you need the `user_id` value. To get the value, run the following command, where `` is the App name you used above: @@ -127,7 +137,8 @@ Finally, you need the `user_id` value. To get the value, run the following comma ```bash curl https://api.github.com/users/%5Bbot%5D ``` -Update the `user_id` value with the `id` value returned from that command. +Update the `user_id` value with the `id` value returned from that command. + ![User ID](./images/provider-user-id.png) Now save the file. Your Provider is now created and the Minder server is configured to use it. diff --git a/docs/docs/run_minder_server/images/provider-permissions.png b/docs/docs/run_minder_server/images/provider-permissions.png index 4f682ff5ff..900dccf22c 100644 Binary files a/docs/docs/run_minder_server/images/provider-permissions.png and b/docs/docs/run_minder_server/images/provider-permissions.png differ diff --git a/docs/docs/run_minder_server/installing_minder.md b/docs/docs/run_minder_server/installing_minder.md index 8a4edf414c..a30b312cf7 100644 --- a/docs/docs/run_minder_server/installing_minder.md +++ b/docs/docs/run_minder_server/installing_minder.md @@ -87,5 +87,4 @@ Deploy Minder on Kubernetes | service.metricPort | int | `9090` | Metrics port for the service to expose metrics on | | serviceAccounts.migrate | string | `""` | ServiceAccount to be used for migration. If set, Minder will use this named ServiceAccount. | | serviceAccounts.server | string | `""` | ServiceAccount to be used by the server. If set, Minder will use this named ServiceAccount. | -| trusty.endpoint | string | `"http://pi.pi:8000"` | Endpoint for the trusty service which Minder communicates with | - +| trusty.endpoint | string | `"https://api.trustypkg.dev"` | Endpoint for the Stacklok Insight service which Minder communicates with | diff --git a/docs/docs/run_minder_server/run_the_server.md b/docs/docs/run_minder_server/run_the_server.md index 05beac5658..edcb8f4f20 100644 --- a/docs/docs/run_minder_server/run_the_server.md +++ b/docs/docs/run_minder_server/run_the_server.md @@ -17,7 +17,7 @@ Once you complete this guide, you will have a Minder server built from source an ## Prerequisites -- [Go 1.22](https://golang.org/doc/install) +- [Go 1.23](https://golang.org/doc/install) - [Docker](https://docs.docker.com/get-docker/) - [Docker Compose](https://docs.docker.com/compose/install/) - [ko](https://ko.build/install/) @@ -73,6 +73,11 @@ you should see 4 new services running: - openfga - postgres +At this point, you might also want to ensure that created folders are owned by the current user - e.g.: +```bash +sudo chown "$(id -un):$(id -gn)" {flags-config.yaml,.secrets,.ssh} +``` + ### Configure Keycloak Now that the Keycloak application is running, you need to configure it using the GitHub App you previously configured. @@ -99,12 +104,15 @@ minder auth login ``` This will open Keycloak login window in your browser. + ![Keycloak Login](./images/keycloak-login.png) Click GitHub to sign in. This should display a GitHub authorization window asking if you'd like to give permission to your Minder server. + ![Github Auth](./images/github-auth.png) Click Authorize. The browser window should say Authentication Successful and the command line should say you've been successfully registered. + ![Successful Minder Auth](./images/successful-install.png) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index a6024ae925..ed5eaf25ac 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -18,6 +18,10 @@ const redocusaurus = [ spec: '../pkg/api/openapi/minder/v1/minder.swagger.json', }, ], + theme: { + primaryColor: '#000000', + primaryColorDark: '#b0e0e6', + }, } ] @@ -57,6 +61,7 @@ const config = { presets: [ [ 'classic', + /** @type {import('@docusaurus/preset-classic').Options} */ { docs: { routeBasePath: '/', @@ -70,6 +75,22 @@ const config = { ], redocusaurus, ], + + plugins: [ + [ + '@docusaurus/plugin-client-redirects', + { + redirects: [ + { + /* Trusty rebrand */ + to: '/integrations/stacklok-insight', + from: '/integrations/trusty', + }, + ], + }, + ], + ], + themeConfig: /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ ( @@ -85,7 +106,7 @@ const config = { title: 'Minder docs', logo: { alt: 'Minder Logo', - src: 'img/Minder_darkMode.png', + src: 'img/Minder-whitetxt.svg', }, items: [ // { diff --git a/docs/package-lock.json b/docs/package-lock.json index 333f82a251..90b98123c5 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8,9 +8,10 @@ "name": "minder-docs", "version": "0.0.0", "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/preset-classic": "3.5.2", - "@docusaurus/theme-mermaid": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/plugin-client-redirects": "3.6.3", + "@docusaurus/preset-classic": "3.6.3", + "@docusaurus/theme-mermaid": "3.6.3", "@mdx-js/react": "3.1.0", "clsx": "^2.1.1", "docusaurus-protobuffet": "^0.3.3", @@ -18,45 +19,42 @@ "prism-react-renderer": "^1.3.5", "react": "^18.3.1", "react-dom": "^18.3.1", - "redocusaurus": "^2.1.2", + "redocusaurus": "^2.2.0", "styled-components": "^6.1.13" }, "devDependencies": { - "@docusaurus/module-type-aliases": "3.5.2" + "@docusaurus/module-type-aliases": "3.6.3" }, "engines": { "node": ">=16.14" } }, "node_modules/@algolia/autocomplete-core": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", - "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", - "license": "MIT", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", + "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", - "@algolia/autocomplete-shared": "1.9.3" + "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", + "@algolia/autocomplete-shared": "1.17.7" } }, "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", - "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", - "license": "MIT", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", + "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", "dependencies": { - "@algolia/autocomplete-shared": "1.9.3" + "@algolia/autocomplete-shared": "1.17.7" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", - "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", - "license": "MIT", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", + "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", "dependencies": { - "@algolia/autocomplete-shared": "1.9.3" + "@algolia/autocomplete-shared": "1.17.7" }, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", @@ -64,10 +62,9 @@ } }, "node_modules/@algolia/autocomplete-shared": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", - "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", - "license": "MIT", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", + "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" @@ -77,7 +74,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.24.0.tgz", "integrity": "sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==", - "license": "MIT", "dependencies": { "@algolia/cache-common": "4.24.0" } @@ -85,23 +81,34 @@ "node_modules/@algolia/cache-common": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.24.0.tgz", - "integrity": "sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==", - "license": "MIT" + "integrity": "sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==" }, "node_modules/@algolia/cache-in-memory": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.24.0.tgz", "integrity": "sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==", - "license": "MIT", "dependencies": { "@algolia/cache-common": "4.24.0" } }, + "node_modules/@algolia/client-abtesting": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.15.0.tgz", + "integrity": "sha512-FaEM40iuiv1mAipYyiptP4EyxkJ8qHfowCpEeusdHUC4C7spATJYArD2rX3AxkVeREkDIgYEOuXcwKUbDCr7Nw==", + "dependencies": { + "@algolia/client-common": "5.15.0", + "@algolia/requester-browser-xhr": "5.15.0", + "@algolia/requester-fetch": "5.15.0", + "@algolia/requester-node-http": "5.15.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@algolia/client-account": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.24.0.tgz", "integrity": "sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==", - "license": "MIT", "dependencies": { "@algolia/client-common": "4.24.0", "@algolia/client-search": "4.24.0", @@ -112,7 +119,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0", "@algolia/transporter": "4.24.0" @@ -122,7 +128,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "license": "MIT", "dependencies": { "@algolia/client-common": "4.24.0", "@algolia/requester-common": "4.24.0", @@ -133,7 +138,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.24.0.tgz", "integrity": "sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==", - "license": "MIT", "dependencies": { "@algolia/client-common": "4.24.0", "@algolia/client-search": "4.24.0", @@ -145,7 +149,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0", "@algolia/transporter": "4.24.0" @@ -155,7 +158,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "license": "MIT", "dependencies": { "@algolia/client-common": "4.24.0", "@algolia/requester-common": "4.24.0", @@ -163,11 +165,23 @@ } }, "node_modules/@algolia/client-common": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.0.0.tgz", - "integrity": "sha512-6N5Qygv/Z/B+rPufnPDLNWgsMf1uubMU7iS52xLcQSLiGlTS4f9eLUrmNXSzHccP33uoFi6xN9craN1sZi5MPQ==", - "license": "MIT", - "peer": true, + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.15.0.tgz", + "integrity": "sha512-IofrVh213VLsDkPoSKMeM9Dshrv28jhDlBDLRcVJQvlL8pzue7PEB1EZ4UoJFYS3NSn7JOcJ/V+olRQzXlJj1w==", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.15.0.tgz", + "integrity": "sha512-bDDEQGfFidDi0UQUCbxXOCdphbVAgbVmxvaV75cypBTQkJ+ABx/Npw7LkFGw1FsoVrttlrrQbwjvUB6mLVKs/w==", + "dependencies": { + "@algolia/client-common": "5.15.0", + "@algolia/requester-browser-xhr": "5.15.0", + "@algolia/requester-fetch": "5.15.0", + "@algolia/requester-node-http": "5.15.0" + }, "engines": { "node": ">= 14.0.0" } @@ -176,7 +190,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.24.0.tgz", "integrity": "sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==", - "license": "MIT", "dependencies": { "@algolia/client-common": "4.24.0", "@algolia/requester-common": "4.24.0", @@ -187,22 +200,34 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0", "@algolia/transporter": "4.24.0" } }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.15.0.tgz", + "integrity": "sha512-wu8GVluiZ5+il8WIRsGKu8VxMK9dAlr225h878GGtpTL6VBvwyJvAyLdZsfFIpY0iN++jiNb31q2C1PlPL+n/A==", + "dependencies": { + "@algolia/client-common": "5.15.0", + "@algolia/requester-browser-xhr": "5.15.0", + "@algolia/requester-fetch": "5.15.0", + "@algolia/requester-node-http": "5.15.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@algolia/client-search": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.0.0.tgz", - "integrity": "sha512-QdDYMzoxYZ3axzBy6CHe+M+NlOGvHEFTa2actchGnp25Uu0N6lyVNivT7nph+P1XoxgAD08cWbeJD3wWQXnpng==", - "license": "MIT", - "peer": true, + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.15.0.tgz", + "integrity": "sha512-Z32gEMrRRpEta5UqVQA612sLdoqY3AovvUPClDfMxYrbdDAebmGDVPtSogUba1FZ4pP5dx20D3OV3reogLKsRA==", "dependencies": { - "@algolia/client-common": "5.0.0", - "@algolia/requester-browser-xhr": "5.0.0", - "@algolia/requester-node-http": "5.0.0" + "@algolia/client-common": "5.15.0", + "@algolia/requester-browser-xhr": "5.15.0", + "@algolia/requester-fetch": "5.15.0", + "@algolia/requester-node-http": "5.15.0" }, "engines": { "node": ">= 14.0.0" @@ -211,29 +236,53 @@ "node_modules/@algolia/events": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", - "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", - "license": "MIT" + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" + }, + "node_modules/@algolia/ingestion": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.15.0.tgz", + "integrity": "sha512-MkqkAxBQxtQ5if/EX2IPqFA7LothghVyvPoRNA/meS2AW2qkHwcxjuiBxv4H6mnAVEPfJlhu9rkdVz9LgCBgJg==", + "dependencies": { + "@algolia/client-common": "5.15.0", + "@algolia/requester-browser-xhr": "5.15.0", + "@algolia/requester-fetch": "5.15.0", + "@algolia/requester-node-http": "5.15.0" + }, + "engines": { + "node": ">= 14.0.0" + } }, "node_modules/@algolia/logger-common": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.24.0.tgz", - "integrity": "sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==", - "license": "MIT" + "integrity": "sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==" }, "node_modules/@algolia/logger-console": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.24.0.tgz", "integrity": "sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==", - "license": "MIT", "dependencies": { "@algolia/logger-common": "4.24.0" } }, + "node_modules/@algolia/monitoring": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.15.0.tgz", + "integrity": "sha512-QPrFnnGLMMdRa8t/4bs7XilPYnoUXDY8PMQJ1sf9ZFwhUysYYhQNX34/enoO0LBjpoOY6rLpha39YQEFbzgKyQ==", + "dependencies": { + "@algolia/client-common": "5.15.0", + "@algolia/requester-browser-xhr": "5.15.0", + "@algolia/requester-fetch": "5.15.0", + "@algolia/requester-node-http": "5.15.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@algolia/recommend": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.24.0.tgz", "integrity": "sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==", - "license": "MIT", "dependencies": { "@algolia/cache-browser-local-storage": "4.24.0", "@algolia/cache-common": "4.24.0", @@ -252,7 +301,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0", "@algolia/transporter": "4.24.0" @@ -262,7 +310,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "license": "MIT", "dependencies": { "@algolia/client-common": "4.24.0", "@algolia/requester-common": "4.24.0", @@ -273,7 +320,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", - "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0" } @@ -282,19 +328,16 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", - "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.0.0.tgz", - "integrity": "sha512-oOoQhSpg/RGiGHjn/cqtYpHBkkd+5M/DCi1jmfW+ZOvLVx21QVt6PbWIJoKJF85moNFo4UG9pMBU35R1MaxUKQ==", - "license": "MIT", - "peer": true, + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.15.0.tgz", + "integrity": "sha512-Po/GNib6QKruC3XE+WKP1HwVSfCDaZcXu48kD+gwmtDlqHWKc7Bq9lrS0sNZ456rfCKhXksOmMfUs4wRM/Y96w==", "dependencies": { - "@algolia/client-common": "5.0.0" + "@algolia/client-common": "5.15.0" }, "engines": { "node": ">= 14.0.0" @@ -303,17 +346,25 @@ "node_modules/@algolia/requester-common": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz", - "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==", - "license": "MIT" + "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==" + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.15.0.tgz", + "integrity": "sha512-rOZ+c0P7ajmccAvpeeNrUmEKoliYFL8aOR5qGW5pFq3oj3Iept7Y5mEtEsOBYsRt6qLnaXn4zUKf+N8nvJpcIw==", + "dependencies": { + "@algolia/client-common": "5.15.0" + }, + "engines": { + "node": ">= 14.0.0" + } }, "node_modules/@algolia/requester-node-http": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.0.0.tgz", - "integrity": "sha512-FwCdugzpnW0wxbgWPauAz5vhmWGQnjZa5DCl9PBbIoDNEy/NIV8DmiL9CEA+LljQdDidG0l0ijojcTNaRRtPvQ==", - "license": "MIT", - "peer": true, + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.15.0.tgz", + "integrity": "sha512-b1jTpbFf9LnQHEJP5ddDJKE2sAlhYd7EVSOWgzo/27n/SfCoHfqD0VWntnWYD83PnOKvfe8auZ2+xCb0TXotrQ==", "dependencies": { - "@algolia/client-common": "5.0.0" + "@algolia/client-common": "5.15.0" }, "engines": { "node": ">= 14.0.0" @@ -323,7 +374,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.24.0.tgz", "integrity": "sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==", - "license": "MIT", "dependencies": { "@algolia/cache-common": "4.24.0", "@algolia/logger-common": "4.24.0", @@ -343,104 +393,44 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", + "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", - "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.0", - "@babel/parser": "^7.24.0", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", - "@babel/types": "^7.24.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -464,49 +454,55 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz", + "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -518,23 +514,23 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.0.tgz", - "integrity": "sha512-QAH+vfvts51BCsNZ2PhY6HAggnlS6omLLFTsIpeqZk/MmJ6cW7tgz5yRv0fMJThcr6FmbMrENh1RgrWPTYA76g==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", "semver": "^6.3.1" }, "engines": { @@ -548,17 +544,19 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz", + "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.1.1", "semver": "^6.3.1" }, "engines": { @@ -577,9 +575,10 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -591,69 +590,41 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -663,32 +634,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -698,13 +672,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -714,182 +689,138 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz", + "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "license": "MIT", "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", - "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "license": "MIT", "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "node_modules/@babel/parser": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@babel/types": "^7.26.0" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=4" + "node": ">=6.0.0" } }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", - "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", - "bin": { - "parser": "bin/babel-parser.js" + "node": ">=6.9.0" }, - "engines": { - "node": ">=6.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -899,13 +830,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -915,12 +847,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", - "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -940,10 +873,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -951,23 +884,28 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -976,221 +914,58 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1200,14 +975,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", - "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1217,13 +992,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1233,11 +1009,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", + "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1247,11 +1024,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1261,12 +1039,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1276,13 +1055,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1292,17 +1071,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", - "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", "globals": "^11.1.0" }, "engines": { @@ -1313,12 +1091,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1328,11 +1107,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1342,12 +1122,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1357,11 +1138,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1370,13 +1152,29 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1386,12 +1184,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz", + "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==", + "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1401,12 +1200,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1416,12 +1215,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1431,13 +1231,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1447,12 +1248,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1462,11 +1263,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1476,12 +1278,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1491,11 +1293,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1505,12 +1308,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1520,13 +1324,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz", + "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==", + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-simple-access": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1536,14 +1341,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", - "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "license": "MIT", "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1553,12 +1359,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1568,12 +1375,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1583,11 +1391,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1597,12 +1406,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", + "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1612,12 +1421,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1627,15 +1436,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.0.tgz", - "integrity": "sha512-y/yKMm7buHpFFXfxVFS4Vk1ToRJDilIa6fKRioB9Vjichv58TDGXTvqV0dN7plobAmTW5eSEGXDngE+Mm+uO+w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1645,12 +1453,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1660,12 +1469,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1675,13 +1484,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1691,11 +1500,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1705,12 +1515,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1720,14 +1531,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1737,11 +1548,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1765,11 +1577,12 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", - "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", + "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1779,15 +1592,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", + "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1797,11 +1611,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", + "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", + "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.22.5" + "@babel/plugin-transform-react-jsx": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1811,12 +1626,13 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", - "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", + "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1826,11 +1642,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.25.9", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1840,12 +1657,29 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1855,15 +1689,15 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.0.tgz", - "integrity": "sha512-zc0GA5IitLKJrSfXlXmp8KDqLrnGECK7YRfQBmEKg1NmBOQ7e+KuclBEKJgzifQeUYLdNiAw4B4bjyvzWVLiSA==", - "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0", - "babel-plugin-polyfill-corejs2": "^0.4.8", - "babel-plugin-polyfill-corejs3": "^0.9.0", - "babel-plugin-polyfill-regenerator": "^0.5.5", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", + "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, "engines": { @@ -1882,11 +1716,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1896,12 +1731,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1911,11 +1747,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1925,11 +1762,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1939,11 +1777,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1953,14 +1792,16 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", - "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz", + "integrity": "sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.23.3" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1970,11 +1811,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1984,12 +1826,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1999,12 +1842,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2014,12 +1858,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2029,89 +1874,79 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.0.tgz", - "integrity": "sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==", - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.9", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.4", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.8", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.4", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.4", - "@babel/plugin-transform-for-of": "^7.23.6", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.4", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.9", - "@babel/plugin-transform-modules-umd": "^7.23.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", - "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.24.0", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.4", - "@babel/plugin-transform-optional-chaining": "^7.23.4", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.4", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.8", - "babel-plugin-polyfill-corejs3": "^0.9.0", - "babel-plugin-polyfill-regenerator": "^0.5.5", - "core-js-compat": "^3.31.0", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.38.1", "semver": "^6.3.1" }, "engines": { @@ -2143,16 +1978,17 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", - "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.25.9.tgz", + "integrity": "sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-transform-react-display-name": "^7.23.3", - "@babel/plugin-transform-react-jsx": "^7.22.15", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.23.3" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-transform-react-display-name": "^7.25.9", + "@babel/plugin-transform-react-jsx": "^7.25.9", + "@babel/plugin-transform-react-jsx-development": "^7.25.9", + "@babel/plugin-transform-react-pure-annotations": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2162,15 +1998,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", - "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz", + "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-typescript": "^7.23.3" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-typescript": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2179,15 +2016,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" - }, "node_modules/@babel/runtime": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", - "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2196,9 +2029,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.0.tgz", - "integrity": "sha512-HxiRMOncx3ly6f3fcZ1GVKf+/EROcI9qwPgmij8Czqy6Okm/0T37T4y2ZIlLUuEUFjtM7NRsfdCO8Y3tAiJZew==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.26.0.tgz", + "integrity": "sha512-YXHu5lN8kJCb1LOb9PgV6pvak43X2h4HvRApcN5SdWeaItQOzfn1hgP6jasD6KWQyJDBxrVmA9o9OivlnNJK/w==", "dependencies": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" @@ -2208,31 +2041,30 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", - "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2241,13 +2073,13 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2289,1372 +2121,1873 @@ "node": ">=0.1.90" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "node_modules/@csstools/cascade-layer-name-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.4.tgz", + "integrity": "sha512-7DFHlPuIxviKYZrOiwVU/PiHLm3lLUR23OMuEEtfEOQTOp9hzQ2JjdY6X5H18RVuUPJqSCI+qNnD5iOLMVE0bA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "engines": { - "node": ">=10.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" } }, - "node_modules/@docsearch/css": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.1.tgz", - "integrity": "sha512-VtVb5DS+0hRIprU2CO6ZQjK2Zg4QU5HrDM1+ix6rT0umsYvFvatMAnf97NHZlVWDaaLlx7GRfR/7FikANiM2Fg==", - "license": "MIT" + "node_modules/@csstools/color-helpers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.1.tgz", + "integrity": "sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@docsearch/react": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.1.tgz", - "integrity": "sha512-qXZkEPvybVhSXj0K7U3bXc233tk5e8PfhoZ6MhPOiik/qUQxYC+Dn9DnoS7CxHQQhHfCvTiN0eY9M12oRghEXw==", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-core": "1.9.3", - "@algolia/autocomplete-preset-algolia": "1.9.3", - "@docsearch/css": "3.6.1", - "algoliasearch": "^4.19.1" + "node_modules/@csstools/css-calc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.0.tgz", + "integrity": "sha512-X69PmFOrjTZfN5ijxtI8hZ9kRADFSLrmmQ6hgDJ272Il049WGKpDY64KhrFm/7rbWve0z81QepawzjkKlqkNGw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" }, "peerDependencies": { - "@types/react": ">= 16.8.0 < 19.0.0", - "react": ">= 16.8.0 < 19.0.0", - "react-dom": ">= 16.8.0 < 19.0.0", - "search-insights": ">= 1 < 3" + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.6.tgz", + "integrity": "sha512-S/IjXqTHdpI4EtzGoNCHfqraXF37x12ZZHA1Lk7zoT5pm2lMjFuqhX/89L7dqX4CcMacKK+6ZCs5TmEGb/+wKw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/color-helpers": "^5.0.1", + "@csstools/css-calc": "^2.1.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" }, - "react": { - "optional": true + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" }, - "react-dom": { - "optional": true + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", + "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" }, - "search-insights": { - "optional": true + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" } }, - "node_modules/@docusaurus/core": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.5.2.tgz", - "integrity": "sha512-4Z1WkhCSkX4KO0Fw5m/Vuc7Q3NxBG53NE5u59Rs96fWkMPZVSrzEPP16/Nk6cWb/shK7xXPndTmalJtw7twL/w==", + "node_modules/@csstools/postcss-cascade-layers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.1.tgz", + "integrity": "sha512-XOfhI7GShVcKiKwmPAnWSqd2tBR0uxt+runAxttbSp/LY2U16yAVPmAf7e9q4JJ0d+xMNmpwNDLBXnmRCl3HMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@babel/core": "^7.23.3", - "@babel/generator": "^7.23.3", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.22.9", - "@babel/preset-env": "^7.22.9", - "@babel/preset-react": "^7.22.5", - "@babel/preset-typescript": "^7.22.5", - "@babel/runtime": "^7.22.6", - "@babel/runtime-corejs3": "^7.22.6", - "@babel/traverse": "^7.22.8", - "@docusaurus/cssnano-preset": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "autoprefixer": "^10.4.14", - "babel-loader": "^9.1.3", - "babel-plugin-dynamic-import-node": "^2.3.3", - "boxen": "^6.2.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "clean-css": "^5.3.2", - "cli-table3": "^0.6.3", - "combine-promises": "^1.1.0", - "commander": "^5.1.0", - "copy-webpack-plugin": "^11.0.0", - "core-js": "^3.31.1", - "css-loader": "^6.8.1", - "css-minimizer-webpack-plugin": "^5.0.1", - "cssnano": "^6.1.2", - "del": "^6.1.1", - "detect-port": "^1.5.1", - "escape-html": "^1.0.3", - "eta": "^2.2.0", - "eval": "^0.1.8", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "html-minifier-terser": "^7.2.0", - "html-tags": "^3.3.1", - "html-webpack-plugin": "^5.5.3", - "leven": "^3.1.0", - "lodash": "^4.17.21", - "mini-css-extract-plugin": "^2.7.6", - "p-map": "^4.0.0", - "postcss": "^8.4.26", - "postcss-loader": "^7.3.3", - "prompts": "^2.4.2", - "react-dev-utils": "^12.0.1", - "react-helmet-async": "^1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", - "react-loadable-ssr-addon-v5-slorber": "^1.0.1", - "react-router": "^5.3.4", - "react-router-config": "^5.1.1", - "react-router-dom": "^5.3.4", - "rtl-detect": "^1.0.4", - "semver": "^7.5.4", - "serve-handler": "^6.1.5", - "shelljs": "^0.8.5", - "terser-webpack-plugin": "^5.3.9", - "tslib": "^2.6.0", - "update-notifier": "^6.0.2", - "url-loader": "^4.1.1", - "webpack": "^5.88.1", - "webpack-bundle-analyzer": "^4.9.0", - "webpack-dev-server": "^4.15.1", - "webpack-merge": "^5.9.0", - "webpackbar": "^5.0.2" + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" }, - "bin": { - "docusaurus": "bin/docusaurus.mjs" + "engines": { + "node": ">=18" }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "engines": { - "node": ">=18.0" + "node": ">=18" }, "peerDependencies": { - "@mdx-js/react": "^3.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" + "postcss-selector-parser": "^7.0.0" } }, - "node_modules/@docusaurus/cssnano-preset": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.5.2.tgz", - "integrity": "sha512-D3KiQXOMA8+O0tqORBrTOEQyQxNIfPm9jEaJoALjjSjc2M/ZAWcUfPQEnwr2JB2TadHw2gqWgpZckQmrVWkytA==", + "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", "dependencies": { - "cssnano-preset-advanced": "^6.1.2", - "postcss": "^8.4.38", - "postcss-sort-media-queries": "^5.2.0", - "tslib": "^2.6.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=18.0" + "node": ">=4" } }, - "node_modules/@docusaurus/logger": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.5.2.tgz", - "integrity": "sha512-LHC540SGkeLfyT3RHK3gAMK6aS5TRqOD4R72BEU/DE2M/TY8WwEUAMY576UUc/oNJXv8pGhBmQB6N9p3pt8LQw==", - "license": "MIT", + "node_modules/@csstools/postcss-color-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.6.tgz", + "integrity": "sha512-EcvXfC60cTIumzpsxWuvVjb7rsJEHPvqn3jeMEBUaE3JSc4FRuP7mEQ+1eicxWmIrs3FtzMH9gR3sgA5TH+ebQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "chalk": "^4.1.2", - "tslib": "^2.6.0" + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">=18.0" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/@docusaurus/mdx-loader": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.5.2.tgz", - "integrity": "sha512-ku3xO9vZdwpiMIVd8BzWV0DCqGEbCP5zs1iHfKX50vw6jX8vQo0ylYo1YJMZyz6e+JFJ17HYHT5FzVidz2IflA==", - "license": "MIT", + "node_modules/@csstools/postcss-color-mix-function": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.6.tgz", + "integrity": "sha512-jVKdJn4+JkASYGhyPO+Wa5WXSx1+oUgaXb3JsjJn/BlrtFh5zjocCY7pwWi0nuP24V1fY7glQsxEYcYNy0dMFg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@docusaurus/logger": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "@mdx-js/mdx": "^3.0.0", - "@slorber/remark-comment": "^1.0.0", - "escape-html": "^1.0.3", - "estree-util-value-to-estree": "^3.0.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "image-size": "^1.0.2", - "mdast-util-mdx": "^3.0.0", - "mdast-util-to-string": "^4.0.0", - "rehype-raw": "^7.0.0", - "remark-directive": "^3.0.0", - "remark-emoji": "^4.0.0", - "remark-frontmatter": "^5.0.0", - "remark-gfm": "^4.0.0", - "stringify-object": "^3.3.0", - "tslib": "^2.6.0", - "unified": "^11.0.3", - "unist-util-visit": "^5.0.0", - "url-loader": "^4.1.1", - "vfile": "^6.0.1", - "webpack": "^5.88.1" + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">=18.0" + "node": ">=18" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/module-type-aliases": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.5.2.tgz", - "integrity": "sha512-Z+Xu3+2rvKef/YKTMxZHsEXp1y92ac0ngjDiExRdqGTmEKtCUpkbNYH8v5eXo5Ls+dnW88n6WTa+Q54kLOkwPg==", + "node_modules/@csstools/postcss-content-alt-text": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.4.tgz", + "integrity": "sha512-YItlZUOuZJCBlRaCf8Aucc1lgN41qYGALMly0qQllrxYJhiyzlI6RxOTMUvtWk+KhS8GphMDsDhKQ7KTPfEMSw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@docusaurus/types": "3.5.2", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "*", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { - "react": "*", - "react-dom": "*" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.5.2.tgz", - "integrity": "sha512-R7ghWnMvjSf+aeNDH0K4fjyQnt5L0KzUEnUhmf1e3jZrv3wogeytZNN6n7X8yHcMsuZHPOrctQhXWnmxu+IRRg==", - "license": "MIT", + "node_modules/@csstools/postcss-exponential-functions": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.5.tgz", + "integrity": "sha512-mi8R6dVfA2nDoKM3wcEi64I8vOYEgQVtVKCfmLHXupeLpACfGAided5ddMt5f+CnEodNu4DifuVwb0I6fQDGGQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "cheerio": "1.0.0-rc.12", - "feed": "^4.2.2", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "reading-time": "^1.5.0", - "srcset": "^4.0.0", - "tslib": "^2.6.0", - "unist-util-visit": "^5.0.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" }, "engines": { - "node": ">=18.0" + "node": ">=18" }, "peerDependencies": { - "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0", - "react-dom": "^18.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.5.2.tgz", - "integrity": "sha512-Bt+OXn/CPtVqM3Di44vHjE7rPCEsRCB/DMo2qoOuozB9f7+lsdrHvD0QCHdBs0uhz6deYJDppAr2VgqybKPlVQ==", - "license": "MIT", + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", + "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/module-type-aliases": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "@types/react-router-config": "^5.0.7", - "combine-promises": "^1.1.0", - "fs-extra": "^11.1.1", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.6.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=18.0" + "node": ">=18" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.5.2.tgz", - "integrity": "sha512-WzhHjNpoQAUz/ueO10cnundRz+VUtkjFhhaQ9jApyv1a46FPURO4cef89pyNIOMny1fjDz/NUN2z6Yi+5WUrCw==", - "license": "MIT", + "node_modules/@csstools/postcss-gamut-mapping": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.6.tgz", + "integrity": "sha512-0ke7fmXfc8H+kysZz246yjirAH6JFhyX9GTlyRnM0exHO80XcA9zeJpy5pOp5zo/AZiC/q5Pf+Hw7Pd6/uAoYA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "fs-extra": "^11.1.1", - "tslib": "^2.6.0", - "webpack": "^5.88.1" + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" }, "engines": { - "node": ">=18.0" + "node": ">=18" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/plugin-debug": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.5.2.tgz", - "integrity": "sha512-kBK6GlN0itCkrmHuCS6aX1wmoWc5wpd5KJlqQ1FyrF0cLDnvsYSnh7+ftdwzt7G6lGBho8lrVwkkL9/iQvaSOA==", - "license": "MIT", + "node_modules/@csstools/postcss-gradients-interpolation-method": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.6.tgz", + "integrity": "sha512-Itrbx6SLUzsZ6Mz3VuOlxhbfuyLTogG5DwEF1V8dAi24iMuvQPIHd7Ti+pNDp7j6WixndJGZaoNR0f9VSzwuTg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "fs-extra": "^11.1.1", - "react-json-view-lite": "^1.2.0", - "tslib": "^2.6.0" + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">=18.0" + "node": ">=18" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.5.2.tgz", - "integrity": "sha512-rjEkJH/tJ8OXRE9bwhV2mb/WP93V441rD6XnM6MIluu7rk8qg38iSxS43ga2V2Q/2ib53PcqbDEJDG/yWQRJhQ==", - "license": "MIT", + "node_modules/@csstools/postcss-hwb-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.6.tgz", + "integrity": "sha512-927Pqy3a1uBP7U8sTfaNdZVB0mNXzIrJO/GZ8us9219q9n06gOqCdfZ0E6d1P66Fm0fYHvxfDbfcUuwAn5UwhQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "tslib": "^2.6.0" + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">=18.0" + "node": ">=18" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.5.2.tgz", - "integrity": "sha512-lm8XL3xLkTPHFKKjLjEEAHUrW0SZBSHBE1I+i/tmYMBsjCcUB5UJ52geS5PSiOCFVR74tbPGcPHEV/gaaxFeSA==", - "license": "MIT", + "node_modules/@csstools/postcss-ic-unit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.0.tgz", + "integrity": "sha512-9QT5TDGgx7wD3EEMN3BSUG6ckb6Eh5gSPT5kZoVtUuAonfPmLDJyPhqR4ntPpMYhUKAMVKAg3I/AgzqHMSeLhA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "@types/gtag.js": "^0.0.12", - "tslib": "^2.6.0" + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=18.0" + "node": ">=18" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.5.2.tgz", - "integrity": "sha512-QkpX68PMOMu10Mvgvr5CfZAzZQFx8WLlOiUQ/Qmmcl6mjGK6H21WLT5x7xDmcpCoKA/3CegsqIqBR+nA137lQg==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "tslib": "^2.6.0" - }, + "node_modules/@csstools/postcss-initial": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.0.tgz", + "integrity": "sha512-dv2lNUKR+JV+OOhZm9paWzYBXOCi+rJPqJ2cJuhh9xd8USVrd0cBEPczla81HNOyThMQWeCcdln3gZkQV2kYxA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "engines": { - "node": ">=18.0" + "node": ">=18" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.5.2.tgz", - "integrity": "sha512-DnlqYyRAdQ4NHY28TfHuVk414ft2uruP4QWCH//jzpHjqvKyXjj2fmDtI8RPUBh9K8iZKFMHRnLtzJKySPWvFA==", - "license": "MIT", + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.1.tgz", + "integrity": "sha512-JLp3POui4S1auhDR0n8wHd/zTOWmMsmK3nQd3hhL6FhWPaox5W7j1se6zXOG/aP07wV2ww0lxbKYGwbBszOtfQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "fs-extra": "^11.1.1", - "sitemap": "^7.1.1", - "tslib": "^2.6.0" + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": ">=18.0" + "node": ">=18" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/preset-classic": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.5.2.tgz", - "integrity": "sha512-3ihfXQ95aOHiLB5uCu+9PRy2gZCeSZoDcqpnDvf3B+sTrMvMTr8qRUzBvWkoIqc82yG5prCboRjk1SVILKx6sg==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/plugin-content-blog": "3.5.2", - "@docusaurus/plugin-content-docs": "3.5.2", - "@docusaurus/plugin-content-pages": "3.5.2", - "@docusaurus/plugin-debug": "3.5.2", - "@docusaurus/plugin-google-analytics": "3.5.2", - "@docusaurus/plugin-google-gtag": "3.5.2", - "@docusaurus/plugin-google-tag-manager": "3.5.2", - "@docusaurus/plugin-sitemap": "3.5.2", - "@docusaurus/theme-classic": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/theme-search-algolia": "3.5.2", - "@docusaurus/types": "3.5.2" - }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "engines": { - "node": ">=18.0" + "node": ">=18" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "postcss-selector-parser": "^7.0.0" } }, - "node_modules/@docusaurus/theme-classic": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.5.2.tgz", - "integrity": "sha512-XRpinSix3NBv95Rk7xeMF9k4safMkwnpSgThn0UNQNumKvmcIYjfkwfh2BhwYh/BxMXQHJ/PdmNh22TQFpIaYg==", - "license": "MIT", + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/module-type-aliases": "3.5.2", - "@docusaurus/plugin-content-blog": "3.5.2", - "@docusaurus/plugin-content-docs": "3.5.2", - "@docusaurus/plugin-content-pages": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/theme-translations": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "@mdx-js/react": "^3.0.0", - "clsx": "^2.0.0", - "copy-text-to-clipboard": "^3.2.0", - "infima": "0.2.0-alpha.44", - "lodash": "^4.17.21", - "nprogress": "^0.2.0", - "postcss": "^8.4.26", - "prism-react-renderer": "^2.3.0", - "prismjs": "^1.29.0", - "react-router-dom": "^5.3.4", - "rtlcss": "^4.1.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "node": ">=4" } }, - "node_modules/@docusaurus/theme-classic/node_modules/prism-react-renderer": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz", - "integrity": "sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==", - "license": "MIT", + "node_modules/@csstools/postcss-light-dark-function": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.7.tgz", + "integrity": "sha512-ZZ0rwlanYKOHekyIPaU+sVm3BEHCe+Ha0/px+bmHe62n0Uc1lL34vbwrLYn6ote8PHlsqzKeTQdIejQCJ05tfw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@types/prismjs": "^1.26.0", - "clsx": "^2.0.0" + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { - "react": ">=16.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/theme-common": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.5.2.tgz", - "integrity": "sha512-QXqlm9S6x9Ibwjs7I2yEDgsCocp708DrCrgHgKwg2n2AY0YQ6IjU0gAK35lHRLOvAoJUfCKpQAwUykB0R7+Eew==", - "license": "MIT", - "dependencies": { - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/module-type-aliases": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "clsx": "^2.0.0", - "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^2.3.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" + "node_modules/@csstools/postcss-logical-float-and-clear": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", + "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overflow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", + "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "engines": { - "node": ">=18.0" + "node": ">=18" }, "peerDependencies": { - "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0", - "react-dom": "^18.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/theme-common/node_modules/prism-react-renderer": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz", - "integrity": "sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==", - "dependencies": { - "@types/prismjs": "^1.26.0", - "clsx": "^2.0.0" + "node_modules/@csstools/postcss-logical-overscroll-behavior": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", + "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" }, "peerDependencies": { - "react": ">=16.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/theme-mermaid": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.5.2.tgz", - "integrity": "sha512-7vWCnIe/KoyTN1Dc55FIyqO5hJ3YaV08Mr63Zej0L0mX1iGzt+qKSmeVUAJ9/aOalUhF0typV0RmNUSy5FAmCg==", - "license": "MIT", + "node_modules/@csstools/postcss-logical-resize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", + "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/module-type-aliases": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "mermaid": "^10.4.0", - "tslib": "^2.6.0" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=18.0" + "node": ">=18" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.5.2.tgz", - "integrity": "sha512-qW53kp3VzMnEqZGjakaV90sst3iN1o32PH+nawv1uepROO8aEGxptcq2R5rsv7aBShSRbZwIobdvSYKsZ5pqvA==", - "license": "MIT", + "node_modules/@csstools/postcss-logical-viewport-units": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.3.tgz", + "integrity": "sha512-OC1IlG/yoGJdi0Y+7duz/kU/beCwO+Gua01sD6GtOtLi7ByQUpcIqs7UE/xuRPay4cHgOMatWdnDdsIDjnWpPw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@docsearch/react": "^3.5.2", - "@docusaurus/core": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/plugin-content-docs": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/theme-translations": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "algoliasearch": "^4.18.0", - "algoliasearch-helper": "^3.13.3", - "clsx": "^2.0.0", - "eta": "^2.2.0", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">=18.0" + "node": ">=18" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/theme-translations": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.5.2.tgz", - "integrity": "sha512-GPZLcu4aT1EmqSTmbdpVrDENGR2yObFEX8ssEFYTCiAIVc0EihNSdOIBTazUvgNqwvnoU1A8vIs1xyzc3LITTw==", - "license": "MIT", + "node_modules/@csstools/postcss-media-minmax": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.5.tgz", + "integrity": "sha512-sdh5i5GToZOIAiwhdntRWv77QDtsxP2r2gXW/WbLSCoLr00KTq/yiF1qlQ5XX2+lmiFa8rATKMcbwl3oXDMNew==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "fs-extra": "^11.1.1", - "tslib": "^2.6.0" + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" }, "engines": { - "node": ">=18.0" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/@docusaurus/types": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.5.2.tgz", - "integrity": "sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw==", - "license": "MIT", + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.4.tgz", + "integrity": "sha512-AnGjVslHMm5xw9keusQYvjVWvuS7KWK+OJagaG0+m9QnIjZsrysD2kJP/tr/UJIyYtMCtu8OkUd+Rajb4DqtIQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/utils": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.5.2.tgz", - "integrity": "sha512-33QvcNFh+Gv+C2dP9Y9xWEzMgf3JzrpL2nW9PopidiohS1nDcyknKRx2DWaFvyVTTYIkkABVSr073VTj/NITNA==", - "license": "MIT", + "node_modules/@csstools/postcss-nested-calc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", + "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@docusaurus/logger": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@svgr/webpack": "^8.1.0", - "escape-string-regexp": "^4.0.0", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "github-slugger": "^1.5.0", - "globby": "^11.1.0", - "gray-matter": "^4.0.3", - "jiti": "^1.20.0", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "micromatch": "^4.0.5", - "prompts": "^2.4.2", - "resolve-pathname": "^3.0.0", - "shelljs": "^0.8.5", - "tslib": "^2.6.0", - "url-loader": "^4.1.1", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=18.0" + "node": ">=18" }, "peerDependencies": { - "@docusaurus/types": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/types": { - "optional": true - } + "postcss": "^8.4" } }, - "node_modules/@docusaurus/utils-common": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.5.2.tgz", - "integrity": "sha512-i0AZjHiRgJU6d7faQngIhuHKNrszpL/SHQPgF1zH4H+Ij6E9NBYGy6pkcGWToIv7IVPbs+pQLh1P3whn0gWXVg==", - "license": "MIT", + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz", + "integrity": "sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "tslib": "^2.6.0" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=18.0" + "node": ">=18" }, "peerDependencies": { - "@docusaurus/types": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/types": { - "optional": true - } + "postcss": "^8.4" } }, - "node_modules/@docusaurus/utils-validation": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.5.2.tgz", - "integrity": "sha512-m+Foq7augzXqB6HufdS139PFxDC5d5q2QKZy8q0qYYvGdI6nnlNsGH4cIGsgBnV7smz+mopl3g4asbSDvMV0jA==", - "license": "MIT", + "node_modules/@csstools/postcss-oklab-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.6.tgz", + "integrity": "sha512-Hptoa0uX+XsNacFBCIQKTUBrFKDiplHan42X73EklG6XmQLG7/aIvxoNhvZ7PvOWMt67Pw3bIlUY2nD6p5vL8A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@docusaurus/logger": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "fs-extra": "^11.2.0", - "joi": "^17.9.2", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.6.0" + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">=18.0" - } - }, - "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", - "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.0.0.tgz", + "integrity": "sha512-XQPtROaQjomnvLUSy/bALTR5VCtTVUFwYs1SblvYgLSeTo2a/bMNwUwo2piXw5rTv/FEYiy5yPSXBqg9OKUx7Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", - "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", - "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node_modules/@csstools/postcss-random-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-1.0.1.tgz", + "integrity": "sha512-Ab/tF8/RXktQlFwVhiC70UNfpFQRhtE5fQQoP2pO+KCPGLsLdWFiOuHgSRtBOqEshCVAzR4H6o38nhvRZq8deA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", - "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", - "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", - "engines": { - "node": ">=12" + "node_modules/@csstools/postcss-relative-color-syntax": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.6.tgz", + "integrity": "sha512-yxP618Xb+ji1I624jILaYM62uEmZcmbdmFoZHoaThw896sq0vU39kqTTF+ZNic9XyPtPMvq0vyvbgmHaszq8xg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "engines": { + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/utils/node_modules/@svgr/babel-preset": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", - "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "node_modules/@csstools/postcss-scope-pseudo-class": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", + "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", - "@svgr/babel-plugin-transform-svg-component": "8.0.0" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/utils/node_modules/@svgr/core": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", - "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3", - "snake-case": "^3.0.4" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=4" } }, - "node_modules/@docusaurus/utils/node_modules/@svgr/hast-util-to-babel-ast": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", - "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "node_modules/@csstools/postcss-sign-functions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.0.tgz", + "integrity": "sha512-SLcc20Nujx/kqbSwDmj6oaXgpy3UjFhBy1sfcqPgDkHfOIfUtUVH7OXO+j7BU4v/At5s61N5ZX6shvgPwluhsA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" }, "engines": { - "node": ">=14" + "node": ">=18" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/@docusaurus/utils/node_modules/@svgr/plugin-jsx": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", - "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.5.tgz", + "integrity": "sha512-G6SJ6hZJkhxo6UZojVlLo14MohH4J5J7z8CRBrxxUYy9JuZiIqUo5TBYyDGcE0PLdzpg63a7mHSJz3VD+gMwqw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "@svgr/hast-util-to-babel-ast": "8.0.0", - "svg-parser": "^2.0.4" + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" }, "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=18" }, "peerDependencies": { - "@svgr/core": "*" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/utils/node_modules/@svgr/plugin-svgo": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", - "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.1.tgz", + "integrity": "sha512-xPZIikbx6jyzWvhms27uugIc0I4ykH4keRvoa3rxX5K7lEhkbd54rjj/dv60qOCTisoS+3bmwJTeyV1VNBrXaw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "cosmiconfig": "^8.1.3", - "deepmerge": "^4.3.1", - "svgo": "^3.0.2" + "@csstools/color-helpers": "^5.0.1", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=18" }, "peerDependencies": { - "@svgr/core": "*" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/utils/node_modules/@svgr/webpack": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", - "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.5.tgz", + "integrity": "sha512-/YQThYkt5MLvAmVu7zxjhceCYlKrYddK6LEmK5I4ojlS6BmO9u2yO4+xjXzu2+NPYmHSTtP4NFSamBCMmJ1NJA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@babel/core": "^7.21.3", - "@babel/plugin-transform-react-constant-elements": "^7.21.3", - "@babel/preset-env": "^7.20.2", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.21.0", - "@svgr/core": "8.1.0", - "@svgr/plugin-jsx": "8.1.0", - "@svgr/plugin-svgo": "8.1.0" + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" }, "engines": { - "node": ">=14" + "node": ">=18" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@docusaurus/utils/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/@docusaurus/utils/node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "node_modules/@csstools/postcss-unset-value": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", + "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/utilities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", + "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "engines": { - "node": ">=14" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.0.tgz", + "integrity": "sha512-pieeipSOW4sQ0+bE5UFC51AOZp9NGxg89wAlZ1BAQFaiRAGK1IKUaPQ0UGZeNctJXyqZ1UvBtOQh2HH+U5GtmA==" + }, + "node_modules/@docsearch/react": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.0.tgz", + "integrity": "sha512-WnFK720+iwTVt94CxY3u+FgX6exb3BfN5kE9xUY6uuAH/9W/UFboBZFLlrw/zxFRHoHZCOXRtOylsXF+6LHI+Q==", + "dependencies": { + "@algolia/autocomplete-core": "1.17.7", + "@algolia/autocomplete-preset-algolia": "1.17.7", + "@docsearch/css": "3.8.0", + "algoliasearch": "^5.12.0" }, "peerDependencies": { - "typescript": ">=4.9.5" + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" }, "peerDependenciesMeta": { - "typescript": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { "optional": true } } }, - "node_modules/@docusaurus/utils/node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "node_modules/@docsearch/react/node_modules/@algolia/client-analytics": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.15.0.tgz", + "integrity": "sha512-lho0gTFsQDIdCwyUKTtMuf9nCLwq9jOGlLGIeQGKDxXF7HbiAysFIu5QW/iQr1LzMgDyM9NH7K98KY+BiIFriQ==", "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" + "@algolia/client-common": "5.15.0", + "@algolia/requester-browser-xhr": "5.15.0", + "@algolia/requester-fetch": "5.15.0", + "@algolia/requester-node-http": "5.15.0" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + "node": ">= 14.0.0" } }, - "node_modules/@docusaurus/utils/node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "node_modules/@docsearch/react/node_modules/@algolia/client-personalization": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.15.0.tgz", + "integrity": "sha512-LfaZqLUWxdYFq44QrasCDED5bSYOswpQjSiIL7Q5fYlefAAUO95PzBPKCfUhSwhb4rKxigHfDkd81AvEicIEoA==", "dependencies": { - "css-tree": "~2.2.0" + "@algolia/client-common": "5.15.0", + "@algolia/requester-browser-xhr": "5.15.0", + "@algolia/requester-fetch": "5.15.0", + "@algolia/requester-node-http": "5.15.0" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "node": ">= 14.0.0" } }, - "node_modules/@docusaurus/utils/node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "node_modules/@docsearch/react/node_modules/@algolia/recommend": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.15.0.tgz", + "integrity": "sha512-5eupMwSqMLDObgSMF0XG958zR6GJP3f7jHDQ3/WlzCM9/YIJiWIUoJFGsko9GYsA5xbLDHE/PhWtq4chcCdaGQ==", "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" + "@algolia/client-common": "5.15.0", + "@algolia/requester-browser-xhr": "5.15.0", + "@algolia/requester-fetch": "5.15.0", + "@algolia/requester-node-http": "5.15.0" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "node": ">= 14.0.0" } }, - "node_modules/@docusaurus/utils/node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" - }, - "node_modules/@docusaurus/utils/node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" - }, - "node_modules/@docusaurus/utils/node_modules/svgo": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "node_modules/@docsearch/react/node_modules/algoliasearch": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.15.0.tgz", + "integrity": "sha512-Yf3Swz1s63hjvBVZ/9f2P1Uu48GjmjCN+Esxb6MAONMGtZB1fRX8/S1AhUTtsuTlcGovbYLxpHgc7wEzstDZBw==", "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.3.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.0.0" - }, - "bin": { - "svgo": "bin/svgo" + "@algolia/client-abtesting": "5.15.0", + "@algolia/client-analytics": "5.15.0", + "@algolia/client-common": "5.15.0", + "@algolia/client-insights": "5.15.0", + "@algolia/client-personalization": "5.15.0", + "@algolia/client-query-suggestions": "5.15.0", + "@algolia/client-search": "5.15.0", + "@algolia/ingestion": "1.15.0", + "@algolia/monitoring": "1.15.0", + "@algolia/recommend": "5.15.0", + "@algolia/requester-browser-xhr": "5.15.0", + "@algolia/requester-fetch": "5.15.0", + "@algolia/requester-node-http": "5.15.0" }, "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" + "node": ">= 14.0.0" } }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", - "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "node_modules/@docusaurus/babel": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.6.3.tgz", + "integrity": "sha512-7dW9Hat9EHYCVicFXYA4hjxBY38+hPuCURL8oRF9fySRm7vzNWuEOghA1TXcykuXZp0HLG2td4RhDxCvGG7tNw==", "dependencies": { - "@emotion/memoize": "^0.8.1" + "@babel/core": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.25.9", + "@babel/preset-react": "^7.25.9", + "@babel/preset-typescript": "^7.25.9", + "@babel/runtime": "^7.25.9", + "@babel/runtime-corejs3": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@docusaurus/logger": "3.6.3", + "@docusaurus/utils": "3.6.3", + "babel-plugin-dynamic-import-node": "^2.3.3", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" } }, - "node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - }, - "node_modules/@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" - }, - "node_modules/@exodus/schemasafe": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz", - "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==" - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "node_modules/@docusaurus/bundler": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.6.3.tgz", + "integrity": "sha512-47JLuc8D4wA+6VOvmMd5fUC9rFppBQpQOnxDYiVXffm/DeV/wmm3sbpNd5Y+O+G2+nevLTRnvCm/qyancv0Y3A==", "dependencies": { - "@hapi/hoek": "^9.0.0" + "@babel/core": "^7.25.9", + "@docusaurus/babel": "3.6.3", + "@docusaurus/cssnano-preset": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils": "3.6.3", + "babel-loader": "^9.2.1", + "clean-css": "^5.3.2", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.8.1", + "css-minimizer-webpack-plugin": "^5.0.1", + "cssnano": "^6.1.2", + "file-loader": "^6.2.0", + "html-minifier-terser": "^7.2.0", + "mini-css-extract-plugin": "^2.9.1", + "null-loader": "^4.0.1", + "postcss": "^8.4.26", + "postcss-loader": "^7.3.3", + "postcss-preset-env": "^10.1.0", + "react-dev-utils": "^12.0.1", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "webpack": "^5.95.0", + "webpackbar": "^6.0.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/faster": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dependencies": { - "@sinclair/typebox": "^0.27.8" + "node_modules/@docusaurus/core": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.6.3.tgz", + "integrity": "sha512-xL7FRY9Jr5DWqB6pEnqgKqcMPJOX5V0pgWXi5lCiih11sUBmcFKM7c3+GyxcVeeWFxyYSDP3grLTWqJoP4P9Vw==", + "dependencies": { + "@docusaurus/babel": "3.6.3", + "@docusaurus/bundler": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/mdx-loader": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "core-js": "^3.31.1", + "del": "^6.1.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "eval": "^0.1.8", + "fs-extra": "^11.1.1", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.6.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "p-map": "^4.0.0", + "prompts": "^2.4.2", + "react-dev-utils": "^12.0.1", + "react-helmet-async": "^1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "rtl-detect": "^1.0.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.6", + "shelljs": "^0.8.5", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-dev-server": "^4.15.2", + "webpack-merge": "^6.0.1" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18.0" + }, + "peerDependencies": { + "@mdx-js/react": "^3.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "node_modules/@docusaurus/core/node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18.0.0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.6.3.tgz", + "integrity": "sha512-qP7SXrwZ+23GFJdPN4aIHQrZW+oH/7tzwEuc/RNL0+BdZdmIjYQqUxdXsjE4lFxLNZjj0eUrSNYIS6xwfij+5Q==", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "cssnano-preset-advanced": "^6.1.2", + "postcss": "^8.4.38", + "postcss-sort-media-queries": "^5.2.0", + "tslib": "^2.6.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=18.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@docusaurus/logger": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.6.3.tgz", + "integrity": "sha512-xSubJixcNyMV9wMV4q0s47CBz3Rlc5jbcCCuij8pfQP8qn/DIpt0ks8W6hQWzHAedg/J/EwxxUOUrnEoKzJo8g==", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" + }, "engines": { - "node": ">=6.0.0" + "node": ">=18.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "node_modules/@docusaurus/mdx-loader": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.6.3.tgz", + "integrity": "sha512-3iJdiDz9540ppBseeI93tWTDtUGVkxzh59nMq4ignylxMuXBLK8dFqVeaEor23v1vx6TrGKZ2FuLaTB+U7C0QQ==", + "dependencies": { + "@docusaurus/logger": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^1.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, "engines": { - "node": ">=6.0.0" + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.6.3.tgz", + "integrity": "sha512-MjaXX9PN/k5ugNvfRZdWyKWq4FsrhN4LEXaj0pEmMebJuBNlFeGyKQUa9DRhJHpadNaiMLrbo9m3U7Ig5YlsZg==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@docusaurus/types": "3.6.3", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "node_modules/@docusaurus/plugin-client-redirects": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.6.3.tgz", + "integrity": "sha512-fQDCxoJCO1jXNQGQmhgYoX3Yx+Z2xSbrLf3PBET6pHnsRk6gGW/VuCHcfQuZlJzbTxN0giQ5u3XcQQ/LzXftJA==", + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@docusaurus/core": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" - }, - "node_modules/@mdx-js/mdx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", - "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdx": "^2.0.0", - "collapse-white-space": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-build-jsx": "^3.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-util-to-js": "^2.0.0", - "estree-walker": "^3.0.0", - "hast-util-to-estree": "^3.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "markdown-extensions": "^2.0.0", - "periscopic": "^3.0.0", - "remark-mdx": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "source-map": "^0.7.0", - "unified": "^11.0.0", - "unist-util-position-from-estree": "^2.0.0", - "unist-util-stringify-position": "^4.0.0", + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.6.3.tgz", + "integrity": "sha512-k0ogWwwJU3pFRFfvW1kRVHxzf2DutLGaaLjAnHVEU6ju+aRP0Z5ap/13DHyPOfHeE4WKpn/M0TqjdwZAcY3kAw==", + "dependencies": { + "@docusaurus/core": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/mdx-loader": "3.6.3", + "@docusaurus/theme-common": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", + "cheerio": "1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "reading-time": "^1.5.0", + "srcset": "^4.0.0", + "tslib": "^2.6.0", "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" + "utility-types": "^3.10.0", + "webpack": "^5.88.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@mdx-js/react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz", - "integrity": "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==", - "dependencies": { - "@types/mdx": "^2.0.0" + "node_modules/@docusaurus/plugin-content-docs": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.6.3.tgz", + "integrity": "sha512-r2wS8y/fsaDcxkm20W5bbYJFPzdWdEaTWVYjNxlHlcmX086eqQR1Fomlg9BHTJ0dLXPzAlbC8EN4XqMr3QzNCQ==", + "dependencies": { + "@docusaurus/core": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/mdx-loader": "3.6.3", + "@docusaurus/module-type-aliases": "3.6.3", + "@docusaurus/theme-common": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=18.0" }, "peerDependencies": { - "@types/react": ">=16", - "react": ">=16" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.6.3.tgz", + "integrity": "sha512-eHrmTgjgLZsuqfsYr5X2xEwyIcck0wseSofWrjTwT9FLOWp+KDmMAuVK+wRo7sFImWXZk3oV/xX/g9aZrhD7OA==", + "dependencies": { + "@docusaurus/core": "3.6.3", + "@docusaurus/mdx-loader": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" }, "engines": { - "node": ">= 8" + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@docusaurus/plugin-debug": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.6.3.tgz", + "integrity": "sha512-zB9GXfIZNPRfzKnNjU6xGVrqn9bPXuGhpjgsuc/YtcTDjnjhasg38NdYd5LEqXex5G/zIorQgWB3n6x/Ut62vQ==", + "dependencies": { + "@docusaurus/core": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils": "3.6.3", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^1.2.0", + "tslib": "^2.6.0" + }, "engines": { - "node": ">= 8" + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.6.3.tgz", + "integrity": "sha512-rCDNy1QW8Dag7nZq67pcum0bpFLrwvxJhYuVprhFh8BMBDxV0bY+bAkGHbSf68P3Bk9C3hNOAXX1srGLIDvcTA==", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@docusaurus/core": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", + "tslib": "^2.6.0" }, "engines": { - "node": ">= 8" + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.6.3.tgz", + "integrity": "sha512-+OyDvhM6rqVkQOmLVkQWVJAizEEfkPzVWtIHXlWPOCFGK9X4/AWeBSrU0WG4iMg9Z4zD4YDRrU+lvI4s6DSC+w==", + "dependencies": { + "@docusaurus/core": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", + "@types/gtag.js": "^0.0.12", + "tslib": "^2.6.0" + }, "engines": { - "node": ">=12.22.0" + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.6.3.tgz", + "integrity": "sha512-1M6UPB13gWUtN2UHX083/beTn85PlRI9ABItTl/JL1FJ5dJTWWFXXsHf9WW/6hrVwthwTeV/AGbGKvLKV+IlCA==", "dependencies": { - "graceful-fs": "4.2.10" + "@docusaurus/core": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", + "tslib": "^2.6.0" }, "engines": { - "node": ">=12.22.0" + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", - "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.6.3.tgz", + "integrity": "sha512-94qOO4M9Fwv9KfVQJsgbe91k+fPJ4byf1L3Ez8TUa6TAFPo/BrLwQ80zclHkENlL1824TuxkcMKv33u6eydQCg==", + "dependencies": { + "@docusaurus/core": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" }, "engines": { - "node": ">=12" + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@polka/url": { - "version": "1.0.0-next.24", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.24.tgz", - "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==" + "node_modules/@docusaurus/preset-classic": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.6.3.tgz", + "integrity": "sha512-VHSYWROT3flvNNI1SrnMOtW1EsjeHNK9dhU6s9eY5hryZe79lUqnZJyze/ymDe2LXAqzyj6y5oYvyBoZZk6ErA==", + "dependencies": { + "@docusaurus/core": "3.6.3", + "@docusaurus/plugin-content-blog": "3.6.3", + "@docusaurus/plugin-content-docs": "3.6.3", + "@docusaurus/plugin-content-pages": "3.6.3", + "@docusaurus/plugin-debug": "3.6.3", + "@docusaurus/plugin-google-analytics": "3.6.3", + "@docusaurus/plugin-google-gtag": "3.6.3", + "@docusaurus/plugin-google-tag-manager": "3.6.3", + "@docusaurus/plugin-sitemap": "3.6.3", + "@docusaurus/theme-classic": "3.6.3", + "@docusaurus/theme-common": "3.6.3", + "@docusaurus/theme-search-algolia": "3.6.3", + "@docusaurus/types": "3.6.3" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } }, - "node_modules/@redocly/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-9GWx27t7xWhDIR02PA18nzBdLcKQRgc46xNQvjFkrYk4UOmvKhJ/dawwiX0cCOeetN5LcaaiqQbVOWYK62SGHw==", + "node_modules/@docusaurus/theme-classic": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.6.3.tgz", + "integrity": "sha512-1RRLK1tSArI2c00qugWYO3jRocjOZwGF1mBzPPylDVRwWCS/rnWWR91ChdbbaxIupRJ+hX8ZBYrwr5bbU0oztQ==", + "dependencies": { + "@docusaurus/core": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/mdx-loader": "3.6.3", + "@docusaurus/module-type-aliases": "3.6.3", + "@docusaurus/plugin-content-blog": "3.6.3", + "@docusaurus/plugin-content-docs": "3.6.3", + "@docusaurus/plugin-content-pages": "3.6.3", + "@docusaurus/theme-common": "3.6.3", + "@docusaurus/theme-translations": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "copy-text-to-clipboard": "^3.2.0", + "infima": "0.2.0-alpha.45", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.4.26", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-classic/node_modules/prism-react-renderer": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.0.tgz", + "integrity": "sha512-327BsVCD/unU4CNLZTWVHyUHKnsqcvj2qbPlQ8MiBE2eq2rgctjigPA1Gp9HLF83kZ20zNN6jgizHJeEsyFYOw==", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "peerDependencies": { + "react": ">=16.0.0" } }, - "node_modules/@redocly/config": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.6.2.tgz", - "integrity": "sha512-c3K5u64eMnr2ootPcpEI0ioIRLE8QP8ptvLxG9MwAmb2sU8HMRfVwXDU3AZiMVY2w4Ts0mDc+Xv4HTIk8DRqFw==" + "node_modules/@docusaurus/theme-common": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.6.3.tgz", + "integrity": "sha512-b8ZkhczXHDxWWyvz+YJy4t/PlPbEogTTbgnHoflYnH7rmRtyoodTsu8WVM12la5LmlMJBclBXFl29OH8kPE7gg==", + "dependencies": { + "@docusaurus/mdx-loader": "3.6.3", + "@docusaurus/module-type-aliases": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0", + "react-dom": "^18.0.0" + } }, - "node_modules/@redocly/openapi-core": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.16.0.tgz", - "integrity": "sha512-z06h+svyqbUcdAaePq8LPSwTPlm6Ig7j2VlL8skPBYnJvyaQ2IN7x/JkOvRL4ta+wcOCBdAex5JWnZbKaNktJg==", + "node_modules/@docusaurus/theme-common/node_modules/prism-react-renderer": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz", + "integrity": "sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==", "dependencies": { - "@redocly/ajv": "^8.11.0", - "@redocly/config": "^0.6.0", - "colorette": "^1.2.0", - "https-proxy-agent": "^7.0.4", - "js-levenshtein": "^1.1.6", - "js-yaml": "^4.1.0", - "lodash.isequal": "^4.5.0", - "minimatch": "^5.0.1", - "node-fetch": "^2.6.1", - "pluralize": "^8.0.0", - "yaml-ast-parser": "0.0.43" + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, + "node_modules/@docusaurus/theme-mermaid": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.6.3.tgz", + "integrity": "sha512-kIqpjNCP/9R2GGf8UmiDxD3CkOAEJuJIEFlaKMgQtjVxa/vH+9PLI1+DFbArGoG4+0ENTYUq8phHPW7SeL36uQ==", + "dependencies": { + "@docusaurus/core": "3.6.3", + "@docusaurus/module-type-aliases": "3.6.3", + "@docusaurus/theme-common": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", + "mermaid": ">=10.4", + "tslib": "^2.6.0" }, "engines": { - "node": ">=14.19.0", - "npm": ">=7.0.0" + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@redocly/openapi-core/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.6.3.tgz", + "integrity": "sha512-rt+MGCCpYgPyWCGXtbxlwFbTSobu15jWBTPI2LHsHNa5B0zSmOISX6FWYAPt5X1rNDOqMGM0FATnh7TBHRohVA==", "dependencies": { - "balanced-match": "^1.0.0" + "@docsearch/react": "^3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/plugin-content-docs": "3.6.3", + "@docusaurus/theme-common": "3.6.3", + "@docusaurus/theme-translations": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", + "algoliasearch": "^4.18.0", + "algoliasearch-helper": "^3.13.3", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@redocly/openapi-core/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "node_modules/@docusaurus/theme-translations": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.6.3.tgz", + "integrity": "sha512-Gb0regclToVlngSIIwUCtBMQBq48qVUaN1XQNKW4XwlsgUyk0vP01LULdqbem7czSwIeBAFXFoORJ0RPX7ht/w==", "dependencies": { - "brace-expansion": "^2.0.1" + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" }, "engines": { - "node": ">=10" + "node": ">=18.0" } }, - "node_modules/@sideway/address": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "node_modules/@docusaurus/types": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.6.3.tgz", + "integrity": "sha512-xD9oTGDrouWzefkhe9ogB2fDV96/82cRpNGx2HIvI5L87JHNhQVIWimQ/3JIiiX/TEd5S9s+VO6FFguwKNRVow==", "dependencies": { - "@hapi/hoek": "^9.0.0" + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "node_modules/@docusaurus/utils": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.6.3.tgz", + "integrity": "sha512-0R/FR3bKVl4yl8QwbL4TYFfR+OXBRpVUaTJdENapBGR3YMwfM6/JnhGilWQO8AOwPJGtGoDK7ib8+8UF9f3OZQ==", + "dependencies": { + "@docusaurus/logger": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils-common": "3.6.3", + "@svgr/webpack": "^8.1.0", + "escape-string-regexp": "^4.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "shelljs": "^0.8.5", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, "engines": { - "node": ">=10" + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.6.3.tgz", + "integrity": "sha512-v4nKDaANLgT3pMBewHYEMAl/ufY0LkXao1QkFWzI5huWFOmNQ2UFzv2BiKeHX5Ownis0/w6cAyoxPhVdDonlSQ==", + "dependencies": { + "@docusaurus/types": "3.6.3", + "tslib": "^2.6.0" }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "engines": { + "node": ">=18.0" } }, - "node_modules/@slorber/remark-comment": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", - "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", + "node_modules/@docusaurus/utils-validation": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.6.3.tgz", + "integrity": "sha512-bhEGGiN5BE38h21vjqD70Gxg++j+PfYVddDUE5UFvLDup68QOcpD33CLr+2knPorlxRbEaNfz6HQDUMQ3HuqKw==", "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.1.0", - "micromark-util-symbol": "^1.0.1" + "@docusaurus/logger": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" } }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", - "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", + "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3664,10 +3997,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", "engines": { "node": ">=14" }, @@ -3679,10 +4012,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-svg-dynamic-title": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", "engines": { "node": ">=14" }, @@ -3694,12 +4027,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", - "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", + "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3709,42 +4042,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", - "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", - "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", - "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", + "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3754,10 +4057,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", - "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", + "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", "engines": { "node": ">=12" }, @@ -3769,22 +4072,22 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@svgr/babel-preset": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", - "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", + "node_modules/@docusaurus/utils/node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", - "@svgr/babel-plugin-remove-jsx-attribute": "*", - "@svgr/babel-plugin-remove-jsx-empty-expression": "*", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", - "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", - "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", - "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", - "@svgr/babel-plugin-transform-svg-component": "^6.5.1" + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3794,73 +4097,73 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@svgr/core": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", - "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", + "node_modules/@docusaurus/utils/node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.1" + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", - "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", + "node_modules/@docusaurus/utils/node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", "dependencies": { - "@babel/types": "^7.20.0", + "@babel/types": "^7.21.3", "entities": "^4.4.0" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@svgr/plugin-jsx": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", - "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", + "node_modules/@docusaurus/utils/node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/hast-util-to-babel-ast": "^6.5.1", + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", "svg-parser": "^2.0.4" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { - "@svgr/core": "^6.0.0" + "@svgr/core": "*" } }, - "node_modules/@svgr/plugin-svgo": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", - "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", + "node_modules/@docusaurus/utils/node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", "dependencies": { - "cosmiconfig": "^7.0.1", - "deepmerge": "^4.2.2", - "svgo": "^2.8.0" + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -3870,84 +4173,786 @@ "@svgr/core": "*" } }, - "node_modules/@svgr/webpack": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", - "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", + "node_modules/@docusaurus/utils/node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", "dependencies": { - "@babel/core": "^7.19.6", - "@babel/plugin-transform-react-constant-elements": "^7.18.12", - "@babel/preset-env": "^7.19.4", + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.18.6", - "@svgr/core": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "@svgr/plugin-svgo": "^6.5.1" + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dependencies": { - "defer-to-connect": "^2.0.1" - }, + "node_modules/@docusaurus/utils/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "engines": { - "node": ">=14.16" + "node": ">= 10" } }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "node_modules/@docusaurus/utils/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, "engines": { - "node": ">=10.13.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@types/acorn": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", - "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "node_modules/@docusaurus/utils/node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dependencies": { - "@types/estree": "*" + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "node_modules/@docusaurus/utils/node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "dependencies": { - "@types/connect": "*", - "@types/node": "*" + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "node_modules/@docusaurus/utils/node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "dependencies": { - "@types/node": "*" + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dependencies": { - "@types/node": "*" - } + "node_modules/@docusaurus/utils/node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" + }, + "node_modules/@docusaurus/utils/node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" + }, + "node_modules/@docusaurus/utils/node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@exodus/schemasafe": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz", + "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==" + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", + "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-to-js": "^2.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-estree": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "periscopic": "^3.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz", + "integrity": "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", + "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.28", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", + "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", + "license": "MIT" + }, + "node_modules/@redocly/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-9GWx27t7xWhDIR02PA18nzBdLcKQRgc46xNQvjFkrYk4UOmvKhJ/dawwiX0cCOeetN5LcaaiqQbVOWYK62SGHw==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@redocly/config": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.6.2.tgz", + "integrity": "sha512-c3K5u64eMnr2ootPcpEI0ioIRLE8QP8ptvLxG9MwAmb2sU8HMRfVwXDU3AZiMVY2w4Ts0mDc+Xv4HTIk8DRqFw==" + }, + "node_modules/@redocly/openapi-core": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.16.0.tgz", + "integrity": "sha512-z06h+svyqbUcdAaePq8LPSwTPlm6Ig7j2VlL8skPBYnJvyaQ2IN7x/JkOvRL4ta+wcOCBdAex5JWnZbKaNktJg==", + "dependencies": { + "@redocly/ajv": "^8.11.0", + "@redocly/config": "^0.6.0", + "colorette": "^1.2.0", + "https-proxy-agent": "^7.0.4", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "lodash.isequal": "^4.5.0", + "minimatch": "^5.0.1", + "node-fetch": "^2.6.1", + "pluralize": "^8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=14.19.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@redocly/openapi-core/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@redocly/openapi-core/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@slorber/remark-comment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", + "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.1.0", + "micromark-util-symbol": "^1.0.1" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", + "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", + "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", + "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", + "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", + "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", + "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", + "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", + "@svgr/babel-plugin-remove-jsx-attribute": "*", + "@svgr/babel-plugin-remove-jsx-empty-expression": "*", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", + "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", + "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", + "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", + "@svgr/babel-plugin-transform-svg-component": "^6.5.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", + "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", + "dependencies": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", + "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", + "dependencies": { + "@babel/types": "^7.20.0", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", + "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", + "dependencies": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/hast-util-to-babel-ast": "^6.5.1", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "^6.0.0" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", + "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", + "dependencies": { + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "svgo": "^2.8.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", + "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", + "dependencies": { + "@babel/core": "^7.19.6", + "@babel/plugin-transform-react-constant-elements": "^7.18.12", + "@babel/preset-env": "^7.19.4", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@svgr/core": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "@svgr/plugin-svgo": "^6.5.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/acorn": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", + "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/connect-history-api-fallback": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" @@ -3979,10 +4984,31 @@ "@types/ms": "*" } }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "license": "MIT" }, "node_modules/@types/estree-jsx": { "version": "1.0.5", @@ -3996,6 +5022,7 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -4004,9 +5031,22 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.43", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", - "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.1.tgz", + "integrity": "sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -4017,8 +5057,7 @@ "node_modules/@types/gtag.js": { "version": "0.0.12", "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", - "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==", - "license": "MIT" + "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==" }, "node_modules/@types/hast": { "version": "3.0.4", @@ -4046,12 +5085,14 @@ "node_modules/@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "license": "MIT" }, "node_modules/@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -4098,7 +5139,8 @@ "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" }, "node_modules/@types/ms": { "version": "0.7.34", @@ -4117,6 +5159,7 @@ "version": "1.3.11", "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -4137,14 +5180,16 @@ "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "node_modules/@types/qs": { - "version": "6.9.12", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.12.tgz", - "integrity": "sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==" + "version": "6.9.16", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", + "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", + "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" }, "node_modules/@types/react": { "version": "18.2.78", @@ -4187,13 +5232,13 @@ "node_modules/@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" }, "node_modules/@types/sax": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -4202,6 +5247,7 @@ "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "license": "MIT", "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -4211,24 +5257,27 @@ "version": "1.9.4", "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "license": "MIT", "dependencies": { "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" + "@types/node": "*", + "@types/send": "*" } }, "node_modules/@types/sockjs": { "version": "0.3.36", "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -4244,17 +5293,18 @@ "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "version": "8.5.13", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", + "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dependencies": { "@types/yargs-parser": "*" } @@ -4414,6 +5464,7 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -4426,6 +5477,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -4434,6 +5486,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -4441,10 +5494,20 @@ "node": ">= 0.6" } }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -4452,14 +5515,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -4469,9 +5524,13 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } @@ -4508,14 +5567,15 @@ } }, "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -4526,6 +5586,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -4542,6 +5603,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -4553,7 +5615,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.24.0.tgz", "integrity": "sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==", - "license": "MIT", "dependencies": { "@algolia/cache-browser-local-storage": "4.24.0", "@algolia/cache-common": "4.24.0", @@ -4573,10 +5634,9 @@ } }, "node_modules/algoliasearch-helper": { - "version": "3.22.3", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.22.3.tgz", - "integrity": "sha512-2eoEz8mG4KHE+DzfrBTrCmDPxVXv7aZZWPojAJFtARpxxMO6lkos1dJ+XDCXdPvq7q3tpYWRi6xXmVQikejtpA==", - "license": "MIT", + "version": "3.22.5", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.22.5.tgz", + "integrity": "sha512-lWvhdnc+aKOKx8jyA3bsdEgHzm/sglC4cYdMG4xSQyRiPLJVJtH/IVYZG3Hp6PkTEhQqhyVYkeP9z2IlcHJsWw==", "dependencies": { "@algolia/events": "^4.0.1" }, @@ -4588,7 +5648,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0", "@algolia/transporter": "4.24.0" @@ -4598,7 +5657,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "license": "MIT", "dependencies": { "@algolia/client-common": "4.24.0", "@algolia/requester-common": "4.24.0", @@ -4609,7 +5667,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", - "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0" } @@ -4618,7 +5675,6 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", - "license": "MIT", "dependencies": { "@algolia/requester-common": "4.24.0" } @@ -4649,6 +5705,31 @@ "node": ">=8" } }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", @@ -4656,6 +5737,7 @@ "engines": [ "node >= 0.8.0" ], + "license": "Apache-2.0", "bin": { "ansi-html": "bin/ansi-html" } @@ -4697,8 +5779,7 @@ "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "node_modules/argparse": { "version": "2.0.1", @@ -4723,7 +5804,8 @@ "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" }, "node_modules/array-union": { "version": "2.1.0", @@ -4859,9 +5941,9 @@ } }, "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "dependencies": { "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" @@ -4883,12 +5965,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", - "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.5.0", + "@babel/helper-define-polyfill-provider": "^0.6.2", "semver": "^6.3.1" }, "peerDependencies": { @@ -4899,28 +5982,31 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", - "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0", - "core-js-compat": "^3.34.0" + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", - "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0" + "@babel/helper-define-polyfill-provider": "^0.6.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -4943,7 +6029,8 @@ "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" }, "node_modules/big.js": { "version": "5.2.2", @@ -4965,6 +6052,7 @@ "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -4988,6 +6076,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -4996,6 +6085,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -5004,6 +6094,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -5014,12 +6105,14 @@ "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/bonjour-service": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" @@ -5072,9 +6165,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "funding": [ { "type": "opencollective", @@ -5091,10 +6184,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -5112,6 +6205,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -5223,9 +6317,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001651", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", - "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", + "version": "1.0.30001677", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001677.tgz", + "integrity": "sha512-fmfjsOlJUpMWu+mAAtZZZHz7UEwsUxIIvu1TJfO1HqFQvB/B+ii0xr9B5HpbZY/mC4XZ8SvjHJqtAY6pDPQEog==", "funding": [ { "type": "opencollective", @@ -5614,6 +6708,7 @@ "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -5622,34 +6717,46 @@ } }, "node_modules/compressible/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz", + "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz", + "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==", + "license": "MIT", "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", + "bytes": "3.1.2", + "compressible": "~2.0.18", "debug": "2.6.9", + "negotiator": "~0.6.4", "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", + "safe-buffer": "5.2.1", "vary": "~1.1.2" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/compression/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -5657,12 +6764,8 @@ "node_modules/compression/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", @@ -5700,19 +6803,24 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } }, "node_modules/content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5721,6 +6829,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5734,6 +6843,7 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5741,13 +6851,13 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" }, "node_modules/copy-text-to-clipboard": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -5829,11 +6939,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.0.tgz", - "integrity": "sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==", + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", + "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", + "license": "MIT", "dependencies": { - "browserslist": "^4.22.3" + "browserslist": "^4.24.2" }, "funding": { "type": "opencollective", @@ -5841,9 +6952,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.36.0.tgz", - "integrity": "sha512-cN28qmhRNgbMZZMc/RFu5w8pK9VJzpb2rJVR/lHuZJKwmXnoWOpXmMkxqBB514igkp1Hu8WGROsiOAzUcKdHOQ==", + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.39.0.tgz", + "integrity": "sha512-7fEcWwKI4rJinnK+wLTezeg2smbFFdSBP6E2kQZNbnzM2s1rpKQ6aaRteZSSg7FLU3P0HGGVo/gbpfanU36urg==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -5853,7 +6964,8 @@ "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" }, "node_modules/cose-base": { "version": "1.0.3", @@ -5879,9 +6991,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", + "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -5916,6 +7028,42 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/css-blank-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", + "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/css-color-keywords": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", @@ -5935,16 +7083,75 @@ "postcss": "^8.0.9" } }, + "node_modules/css-has-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.1.tgz", + "integrity": "sha512-EOcoyJt+OsuKfCADgLT7gADZI5jMzIe/AeI6MeAYKiFBDmNmM7kk46DtSfMj5AohUJisqVzopBpnQTlvbyaBWg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/css-loader": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.10.0.tgz", - "integrity": "sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.4", - "postcss-modules-scope": "^3.1.1", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", "semver": "^7.5.4" @@ -6012,6 +7219,27 @@ } } }, + "node_modules/css-prefers-color-scheme": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", + "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, "node_modules/css-select": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", @@ -6068,6 +7296,21 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/cssdb": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.2.1.tgz", + "integrity": "sha512-KwEPys7lNsC8OjASI8RrmwOYYDcm0JOW9zQhcV83ejYcQkirTEyeAGui8aO2F5PiS6SLpxuTzl6qlMElIdsgIg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ] + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -6689,7 +7932,8 @@ "node_modules/debounce": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "license": "MIT" }, "node_modules/debug": { "version": "4.3.4", @@ -6769,6 +8013,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "license": "BSD-2-Clause", "dependencies": { "execa": "^5.0.0" }, @@ -6857,6 +8102,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -6873,6 +8119,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -6881,7 +8128,8 @@ "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" }, "node_modules/detect-port": { "version": "1.5.1", @@ -6966,6 +8214,7 @@ "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -7064,9 +8313,9 @@ } }, "node_modules/docusaurus-theme-redoc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/docusaurus-theme-redoc/-/docusaurus-theme-redoc-2.1.2.tgz", - "integrity": "sha512-UB6g+YDPjVgFMhJnIUaW/mNl9vsCMbrMQutgdoG5DaI+HpxO2sV+zT2z23Wg6ngi2GM+oxEhYf5Qc1dPwKZqBQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/docusaurus-theme-redoc/-/docusaurus-theme-redoc-2.2.0.tgz", + "integrity": "sha512-oeREQZ7xf3qbkHSAvPVciGlssSb80zx+1GkiymM0sZwuZbD6FbTc6g1Dz81j8oCv0asSiRbsGo62KnpAatjnOg==", "dependencies": { "@redocly/openapi-core": "1.16.0", "clsx": "^1.2.1", @@ -7094,9 +8343,9 @@ } }, "node_modules/docusaurus-theme-redoc/node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "version": "8.4.48", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.48.tgz", + "integrity": "sha512-GCRK8F6+Dl7xYniR5a4FYbpBzU8XnZVeowqsQFYdcXuSbChgiks7qybSkbvnaeqv0G0B+dd9/jJgH8kkLDQeEA==", "funding": [ { "type": "opencollective", @@ -7113,7 +8362,7 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { @@ -7228,12 +8477,13 @@ "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.6.tgz", - "integrity": "sha512-jwXWsM5RPf6j9dPYzaorcBSUg6AiqocPEyMpkchkvntaH9HGfOOMZwxMJjDY/XEs3T5dM7uyH1VhRMkqUU9qVw==", + "version": "1.5.51", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.51.tgz", + "integrity": "sha512-kKeWV57KSS8jH4alKt/jKnvHPmJgBxXzGUSbMd4eQF+iOsVPl7bz2KUmu6eo80eMP8wVioTfTyTzdMgM15WXNg==", "license": "ISC" }, "node_modules/elkjs": { @@ -7269,9 +8519,10 @@ } }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -7496,9 +8747,10 @@ "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==" }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -7690,6 +8942,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7709,7 +8962,8 @@ "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" }, "node_modules/events": { "version": "3.3.0", @@ -7723,6 +8977,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -7742,9 +8997,10 @@ } }, "node_modules/express": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", - "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -7765,7 +9021,7 @@ "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", @@ -7780,12 +9036,17 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -7797,32 +9058,28 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, - "node_modules/express/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" }, "node_modules/express/node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7873,13 +9130,11 @@ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, - "node_modules/fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", - "dependencies": { - "punycode": "^1.3.2" - } + "node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "license": "BSD-3-Clause" }, "node_modules/fastq": { "version": "1.17.1", @@ -7905,6 +9160,7 @@ "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -7916,7 +9172,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", - "license": "MIT", "dependencies": { "xml-js": "^1.6.11" }, @@ -7924,6 +9179,28 @@ "node": ">=0.4.0" } }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/file-loader": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", @@ -8011,6 +9288,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", @@ -8028,22 +9306,16 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, - "node_modules/finalhandler/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/find-cache-dir": { "version": "4.0.0", @@ -8084,15 +9356,16 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -8255,6 +9528,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -8275,6 +9549,7 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -8515,6 +9790,7 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", "engines": { "node": ">=4" } @@ -8655,7 +9931,8 @@ "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT" }, "node_modules/has": { "version": "1.0.4", @@ -8955,6 +10232,7 @@ "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -8965,12 +10243,14 @@ "node_modules/hpack.js/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" }, "node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -8984,12 +10264,14 @@ "node_modules/hpack.js/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } @@ -9020,12 +10302,14 @@ "type": "patreon", "url": "https://patreon.com/mdevils" } - ] + ], + "license": "MIT" }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" }, "node_modules/html-minifier-terser": { "version": "7.2.0", @@ -9160,12 +10444,14 @@ "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -9180,12 +10466,14 @@ "node_modules/http-parser-js": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "license": "MIT" }, "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -9199,6 +10487,7 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -9222,6 +10511,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -9262,6 +10552,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } @@ -9359,10 +10650,9 @@ } }, "node_modules/infima": { - "version": "0.2.0-alpha.44", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.44.tgz", - "integrity": "sha512-tuRkUSO/lB3rEhLJk25atwAjgLuzq070+pOW8XcvpHky/YbENnRRdPd85IBkyeTgttmOy5ah+yHYsK1HhUd4lQ==", - "license": "MIT", + "version": "0.2.0-alpha.45", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", + "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==", "engines": { "node": ">=12" } @@ -9429,9 +10719,10 @@ } }, "node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "license": "MIT", "engines": { "node": ">= 10" } @@ -9737,14 +11028,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-reference": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", @@ -9802,6 +11085,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -9999,14 +11283,15 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-buffer": { @@ -10121,9 +11406,10 @@ } }, "node_modules/launch-editor": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", + "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", + "license": "MIT", "dependencies": { "picocolors": "^1.0.0", "shell-quote": "^1.8.1" @@ -10206,7 +11492,8 @@ "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" }, "node_modules/lodash.escape": { "version": "4.0.1", @@ -10278,6 +11565,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -10710,6 +11998,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -10730,6 +12019,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -11206,6 +12496,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -12897,6 +14188,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -12908,6 +14200,7 @@ "version": "1.33.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -12916,6 +14209,7 @@ "version": "2.1.18", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "license": "MIT", "dependencies": { "mime-db": "~1.33.0" }, @@ -12927,6 +14221,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", "engines": { "node": ">=6" } @@ -12943,9 +14238,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz", - "integrity": "sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", + "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", "dependencies": { "schema-utils": "^4.0.0", "tapable": "^2.2.1" @@ -12964,7 +14259,8 @@ "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" }, "node_modules/minimatch": { "version": "3.1.2", @@ -13060,6 +14356,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "license": "MIT", "engines": { "node": ">=10" } @@ -13073,6 +14370,7 @@ "version": "7.2.5", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", "dependencies": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" @@ -13082,15 +14380,16 @@ } }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -13127,9 +14426,10 @@ "peer": true }, "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -13196,6 +14496,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } @@ -13232,35 +14533,99 @@ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "engines": { - "node": ">=0.10.0" + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/null-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dependencies": { - "path-key": "^3.0.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", - "license": "MIT" + "node_modules/null-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "node_modules/null-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/null-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dependencies": { - "boolbase": "^1.0.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" }, "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/oas-kit-common": { @@ -13418,12 +14783,14 @@ "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -13435,6 +14802,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -13451,6 +14819,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -13490,6 +14859,7 @@ "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "license": "(WTFPL OR MIT)", "bin": { "opener": "bin/opener-bin.js" } @@ -13548,6 +14918,7 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" @@ -13630,393 +15001,833 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/perfect-scrollbar": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz", + "integrity": "sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g==" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "peer": true + }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-numeric-range": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dependencies": { - "entities": "^4.4.0" + "p-limit": "^2.0.0" }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "engines": { + "node": ">=6" } }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "dependencies": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "node_modules/polished": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", + "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" } }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" - }, - "node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 0.4" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || >=14" } }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/postcss-attribute-case-insensitive": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", + "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "node_modules/postcss-calc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", "dependencies": { - "isarray": "0.0.1" + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=8" + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" } }, - "node_modules/perfect-scrollbar": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz", - "integrity": "sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g==" + "node_modules/postcss-color-functional-notation": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.6.tgz", + "integrity": "sha512-wLXvm8RmLs14Z2nVpB4CWlnvaWPRcOZFltJSlcbYwSJ1EDZKsKDhPKIMecCnuU054KSmlmubkqczmm6qBPCBhA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "peer": true + "node_modules/postcss-color-hex-alpha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", + "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } }, - "node_modules/periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "node_modules/postcss-color-rebeccapurple": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", + "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" + "node_modules/postcss-colormin": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", + "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/postcss-convert-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=8.6" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "node_modules/postcss-custom-media": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.5.tgz", + "integrity": "sha512-SQHhayVNgDvSAdX9NQ/ygcDQGEY+aSF4b/96z7QUX6mqL5yl/JgG/DywcF6fW9XbnCRE+aVYk+9/nqGuzOPWeQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "find-up": "^6.3.0" + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" }, "engines": { - "node": ">=14.16" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "node_modules/postcss-custom-properties": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.4.tgz", + "integrity": "sha512-QnW8FCCK6q+4ierwjnmXF9Y9KF8q0JkbgVfvQEMa93x1GT8FvOiUevWCN2YLaOWyByeDX8S6VFbZEeWoAoXs2A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "find-up": "^3.0.0" + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "node_modules/postcss-custom-selectors": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.4.tgz", + "integrity": "sha512-ASOXqNvDCE0dAJ/5qixxPeL1aOVGHGW2JwSy7HyjWNbnWTQCl+fDc968HY1jCmZI0+BaYT5CxsOiUhavpG/7eg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "locate-path": "^3.0.0" + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": ">=6" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/postcss-dir-pseudo-class": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", + "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "p-try": "^2.0.0" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": ">=6" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", "dependencies": { - "p-limit": "^2.0.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "node_modules/postcss-discard-comments": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", + "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", "engines": { - "node": ">=4" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "node_modules/postcss-discard-duplicates": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", + "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", "engines": { - "node": ">=4" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/polished": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", - "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", - "dependencies": { - "@babel/runtime": "^7.17.8" + "node_modules/postcss-discard-empty": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", + "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", + "engines": { + "node": "^14 || ^16 || >=18.0" }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", + "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", "engines": { - "node": ">=10" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "node_modules/postcss-discard-unused": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", + "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, "engines": { - "node": ">= 0.4" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "node_modules/postcss-double-position-gradients": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.0.tgz", + "integrity": "sha512-JkIGah3RVbdSEIrcobqj4Gzq0h53GG4uqDPsho88SgY84WnpkTpI0k50MFK/sX7XqVisZ6OqUfFnoUO6m1WWdg==", "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" + "type": "github", + "url": "https://github.com/sponsors/csstools" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "opencollective", + "url": "https://opencollective.com/csstools" } ], "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-calc": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", - "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.11", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.2.2" + "postcss": "^8.4" } }, - "node_modules/postcss-colormin": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", - "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", + "node_modules/postcss-focus-visible": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", + "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0", - "colord": "^2.9.3", - "postcss-value-parser": "^4.2.0" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4" } }, - "node_modules/postcss-convert-values": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", - "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", "dependencies": { - "browserslist": "^4.23.0", - "postcss-value-parser": "^4.2.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=4" } }, - "node_modules/postcss-discard-comments": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", - "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", + "node_modules/postcss-focus-within": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4" } }, - "node_modules/postcss-discard-duplicates": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", - "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", - "engines": { - "node": "^14 || ^16 || >=18.0" + "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.1.0" } }, - "node_modules/postcss-discard-empty": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", - "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", + "node_modules/postcss-gap-properties": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", + "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "engines": { - "node": "^14 || ^16 || >=18.0" + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4" } }, - "node_modules/postcss-discard-overridden": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", - "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", + "node_modules/postcss-image-set-function": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", + "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4" } }, - "node_modules/postcss-discard-unused": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", - "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", + "node_modules/postcss-lab-function": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.6.tgz", + "integrity": "sha512-HPwvsoK7C949vBZ+eMyvH2cQeMr3UREoHvbtra76/UhDuiViZH6pir+z71UaJQohd7VDSVUdR6TkWYKExEc9aQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "postcss-selector-parser": "^6.0.16" + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4" } }, "node_modules/postcss-loader": { @@ -14065,6 +15876,30 @@ } } }, + "node_modules/postcss-logical": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.0.0.tgz", + "integrity": "sha512-HpIdsdieClTjXLOyYdUPAX/XQASNIwdKt5hoZW08ZOAiI+tbV0ta1oclkpVkW5ANU+xJvk3KkA0FejkjGLXUkg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, "node_modules/postcss-merge-idents": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", @@ -14173,9 +16008,9 @@ } }, "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -14184,12 +16019,12 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", - "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.1.0.tgz", + "integrity": "sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q==", "dependencies": { "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.1.0" }, "engines": { @@ -14199,12 +16034,24 @@ "postcss": "^8.1.0" } }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-modules-scope": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", - "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", "dependencies": { - "postcss-selector-parser": "^6.0.4" + "postcss-selector-parser": "^7.0.0" }, "engines": { "node": "^10 || ^12 || >= 14" @@ -14213,6 +16060,18 @@ "postcss": "^8.1.0" } }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-modules-values": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", @@ -14227,6 +16086,86 @@ "postcss": "^8.1.0" } }, + "node_modules/postcss-nesting": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.1.tgz", + "integrity": "sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/selector-resolve-nested": "^3.0.0", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.0.0.tgz", + "integrity": "sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-normalize-charset": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", @@ -14342,36 +16281,235 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", "dependencies": { - "postcss-value-parser": "^4.2.0" + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", + "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-ordered-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", + "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", + "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", + "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-prefix-selector": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.1.tgz", + "integrity": "sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==", + "peerDependencies": { + "postcss": ">4 <9" + } + }, + "node_modules/postcss-preset-env": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.1.1.tgz", + "integrity": "sha512-wqqsnBFD6VIwcHHRbhjTOcOi4qRVlB26RwSr0ordPj7OubRRxdWebv/aLjKLRR8zkZrbxZyuus03nOIgC5elMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/postcss-cascade-layers": "^5.0.1", + "@csstools/postcss-color-function": "^4.0.6", + "@csstools/postcss-color-mix-function": "^3.0.6", + "@csstools/postcss-content-alt-text": "^2.0.4", + "@csstools/postcss-exponential-functions": "^2.0.5", + "@csstools/postcss-font-format-keywords": "^4.0.0", + "@csstools/postcss-gamut-mapping": "^2.0.6", + "@csstools/postcss-gradients-interpolation-method": "^5.0.6", + "@csstools/postcss-hwb-function": "^4.0.6", + "@csstools/postcss-ic-unit": "^4.0.0", + "@csstools/postcss-initial": "^2.0.0", + "@csstools/postcss-is-pseudo-class": "^5.0.1", + "@csstools/postcss-light-dark-function": "^2.0.7", + "@csstools/postcss-logical-float-and-clear": "^3.0.0", + "@csstools/postcss-logical-overflow": "^2.0.0", + "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", + "@csstools/postcss-logical-resize": "^3.0.0", + "@csstools/postcss-logical-viewport-units": "^3.0.3", + "@csstools/postcss-media-minmax": "^2.0.5", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.4", + "@csstools/postcss-nested-calc": "^4.0.0", + "@csstools/postcss-normalize-display-values": "^4.0.0", + "@csstools/postcss-oklab-function": "^4.0.6", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/postcss-random-function": "^1.0.1", + "@csstools/postcss-relative-color-syntax": "^3.0.6", + "@csstools/postcss-scope-pseudo-class": "^4.0.1", + "@csstools/postcss-sign-functions": "^1.1.0", + "@csstools/postcss-stepped-value-functions": "^4.0.5", + "@csstools/postcss-text-decoration-shorthand": "^4.0.1", + "@csstools/postcss-trigonometric-functions": "^4.0.5", + "@csstools/postcss-unset-value": "^4.0.0", + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.1", + "css-blank-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.1", + "css-prefers-color-scheme": "^10.0.0", + "cssdb": "^8.2.1", + "postcss-attribute-case-insensitive": "^7.0.1", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^7.0.6", + "postcss-color-hex-alpha": "^10.0.0", + "postcss-color-rebeccapurple": "^10.0.0", + "postcss-custom-media": "^11.0.5", + "postcss-custom-properties": "^14.0.4", + "postcss-custom-selectors": "^8.0.4", + "postcss-dir-pseudo-class": "^9.0.1", + "postcss-double-position-gradients": "^6.0.0", + "postcss-focus-visible": "^10.0.1", + "postcss-focus-within": "^9.0.1", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^6.0.0", + "postcss-image-set-function": "^7.0.0", + "postcss-lab-function": "^7.0.6", + "postcss-logical": "^8.0.0", + "postcss-nesting": "^13.0.1", + "postcss-opacity-percentage": "^3.0.0", + "postcss-overflow-shorthand": "^6.0.0", + "postcss-page-break": "^3.0.4", + "postcss-place": "^10.0.0", + "postcss-pseudo-class-any-link": "^10.0.1", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^8.0.1" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4" } }, - "node_modules/postcss-ordered-values": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", - "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", + "node_modules/postcss-pseudo-class-any-link": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", + "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.4" } }, - "node_modules/postcss-prefix-selector": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.1.tgz", - "integrity": "sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==", - "peerDependencies": { - "postcss": ">4 <9" + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" } }, "node_modules/postcss-reduce-idents": { @@ -14417,10 +16555,54 @@ "postcss": "^8.4.31" } }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", + "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-selector-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", - "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -14603,7 +16785,8 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" }, "node_modules/prompts": { "version": "2.4.2", @@ -14645,6 +16828,7 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -14657,15 +16841,11 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", "engines": { "node": ">= 0.10" } }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" - }, "node_modules/pupa": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", @@ -14684,6 +16864,7 @@ "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.6" }, @@ -14772,6 +16953,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -14780,6 +16962,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -14794,6 +16977,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -14802,6 +16986,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -14892,9 +17077,9 @@ } }, "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", "engines": { "node": ">= 12.13.0" } @@ -15004,10 +17189,9 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-json-view-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.4.0.tgz", - "integrity": "sha512-wh6F6uJyYAmQ4fK0e8dSQMEWuvTs2Wr3el3sLD9bambX1+pSWUVXIz1RFaoy3TI1mZ0FqdpKq9YgbgTTgyrmXA==", - "license": "MIT", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.5.0.tgz", + "integrity": "sha512-nWqA1E4jKPklL2jvHWs6s+7Na0qNgw9HCP6xehdQJeg6nPBTFZgGwyko9Q0oj+jQWKTTVRS30u0toM5wiuL3iw==", "engines": { "node": ">=14" }, @@ -15118,6 +17302,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -15141,8 +17326,7 @@ "node_modules/reading-time": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", - "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==", - "license": "MIT" + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" }, "node_modules/rechoir": { "version": "0.6.2", @@ -15212,12 +17396,12 @@ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, "node_modules/redocusaurus": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/redocusaurus/-/redocusaurus-2.1.2.tgz", - "integrity": "sha512-PqMXxmjAyQ78zdI9W5lUI21a9N9bXDQYj5NuTcjG5xmyn63+KfqF+ugmqh7FbY3Fr9Sud14X6ZDoRGdwVtBDew==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/redocusaurus/-/redocusaurus-2.2.0.tgz", + "integrity": "sha512-cf7kq5RRlwiLNtB4tMH6DBAhmLpZJ3UAOP9QkCHodvf2d46O9m5DOq1o7u6O4XZF65weCm3oDW8eFk6UvLrrtg==", "dependencies": { "docusaurus-plugin-redoc": "2.1.1", - "docusaurus-theme-redoc": "2.1.2" + "docusaurus-theme-redoc": "2.2.0" }, "engines": { "node": ">=14" @@ -15238,12 +17422,14 @@ "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "license": "MIT", "dependencies": { "regenerate": "^1.4.2" }, @@ -15260,6 +17446,7 @@ "version": "0.15.2", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.4" } @@ -15282,14 +17469,15 @@ } }, "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", + "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", + "license": "MIT", "dependencies": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.11.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, @@ -15322,25 +17510,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.2.tgz", + "integrity": "sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==", + "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~0.5.0" + "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "bin": { - "jsesc": "bin/jsesc" - } - }, "node_modules/rehype-raw": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", @@ -15576,6 +17763,14 @@ "entities": "^2.0.0" } }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -15603,7 +17798,8 @@ "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" }, "node_modules/resolve": { "version": "1.22.8", @@ -15666,6 +17862,7 @@ "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", "engines": { "node": ">= 4" } @@ -15714,10 +17911,9 @@ "integrity": "sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==" }, "node_modules/rtlcss": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.2.0.tgz", - "integrity": "sha512-AV+V3oOVvCrqyH5Q/6RuT1IDH1Xy5kJTkEWTWZPN5rdQ3HCFOd8SrbC7c6N5Y8bPpCfZSR6yYbUATXslvfvu5g==", - "license": "MIT", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0", @@ -15834,8 +18030,7 @@ "node_modules/sax": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "license": "ISC" + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" }, "node_modules/scheduler": { "version": "0.23.2", @@ -15849,6 +18044,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -15864,10 +18060,9 @@ } }, "node_modules/search-insights": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.16.3.tgz", - "integrity": "sha512-hSHy/s4Zk2xibhj9XTCACB+1PqS+CaJxepGNBhKc/OsHRpqvHAUAm5+uZ6kJJbGXn0pb3XqekHjg6JAqPExzqg==", - "license": "MIT", + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", "peer": true }, "node_modules/section-matter": { @@ -15885,12 +18080,14 @@ "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" }, "node_modules/selfsigned": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "license": "MIT", "dependencies": { "@types/node-forge": "^1.3.0", "node-forge": "^1" @@ -15947,6 +18144,7 @@ "version": "0.19.0", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -15970,6 +18168,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -15977,17 +18176,29 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/send/node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -16001,29 +18212,31 @@ } }, "node_modules/serve-handler": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", - "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", + "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", + "license": "MIT", "dependencies": { "bytes": "3.0.0", "content-disposition": "0.5.2", - "fast-url-parser": "1.1.3", "mime-types": "2.1.18", "minimatch": "3.1.2", "path-is-inside": "1.0.2", - "path-to-regexp": "2.2.1", + "path-to-regexp": "3.3.0", "range-parser": "1.2.0" } }, "node_modules/serve-handler/node_modules/path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", + "license": "MIT" }, "node_modules/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "license": "MIT", "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -16041,6 +18254,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -16049,6 +18263,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -16057,6 +18272,7 @@ "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -16070,22 +18286,26 @@ "node_modules/serve-index/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "license": "ISC" }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -16094,6 +18314,7 @@ "version": "1.16.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", @@ -16104,14 +18325,6 @@ "node": ">= 0.8.0" } }, - "node_modules/serve-static/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/set-function-length": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", @@ -16145,7 +18358,8 @@ "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" }, "node_modules/shallow-clone": { "version": "3.0.1", @@ -16280,6 +18494,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "license": "MIT", "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", @@ -16298,7 +18513,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", - "license": "MIT", "dependencies": { "@types/node": "^17.0.5", "@types/sax": "^1.2.1", @@ -16316,8 +18530,7 @@ "node_modules/sitemap/node_modules/@types/node": { "version": "17.0.45", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", - "license": "MIT" + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" }, "node_modules/skin-tone": { "version": "2.0.0", @@ -16359,6 +18572,7 @@ "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", @@ -16369,6 +18583,7 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -16427,6 +18642,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -16442,6 +18658,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -16460,7 +18677,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -16478,14 +18694,15 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==" + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==" }, "node_modules/stickyfill": { "version": "1.1.1", @@ -16496,6 +18713,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } @@ -16636,6 +18854,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -16644,7 +18863,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "license": "MIT", "engines": { "node": ">=8" }, @@ -16994,7 +19212,8 @@ "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" }, "node_modules/tiny-invariant": { "version": "1.3.3", @@ -17006,14 +19225,6 @@ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -17029,6 +19240,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { "node": ">=0.6" } @@ -17037,6 +19249,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", "engines": { "node": ">=6" } @@ -17092,6 +19305,7 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -17104,6 +19318,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -17112,6 +19327,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -17229,9 +19445,10 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "license": "MIT", "engines": { "node": ">=4" } @@ -17248,6 +19465,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -17257,9 +19475,10 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "license": "MIT", "engines": { "node": ">=4" } @@ -17268,6 +19487,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "license": "MIT", "engines": { "node": ">=4" } @@ -17404,14 +19624,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "funding": [ { "type": "opencollective", @@ -17428,8 +19649,8 @@ ], "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -17630,7 +19851,8 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" }, "node_modules/utila": { "version": "0.4.0", @@ -17649,6 +19871,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -17699,6 +19922,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -17759,6 +19983,7 @@ "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" } @@ -17783,17 +20008,18 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.94.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", - "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", + "version": "5.96.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", + "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", + "license": "MIT", "dependencies": { - "@types/estree": "^1.0.5", + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", "@webassemblyjs/ast": "^1.12.1", "@webassemblyjs/wasm-edit": "^1.12.1", "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", @@ -17828,9 +20054,10 @@ } }, "node_modules/webpack-bundle-analyzer": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz", - "integrity": "sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "0.5.7", "acorn": "^8.0.4", @@ -17840,7 +20067,6 @@ "escape-string-regexp": "^4.0.0", "gzip-size": "^6.0.0", "html-escaper": "^2.0.2", - "is-plain-object": "^5.0.0", "opener": "^1.5.2", "picocolors": "^1.0.0", "sirv": "^2.0.3", @@ -17857,6 +20083,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", "engines": { "node": ">= 10" } @@ -17865,6 +20092,7 @@ "version": "5.3.4", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.3", @@ -17886,12 +20114,14 @@ "node_modules/webpack-dev-middleware/node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" }, "node_modules/webpack-dev-middleware/node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -17900,6 +20130,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -17911,14 +20142,16 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/webpack-dev-server": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -17948,7 +20181,7 @@ "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", + "webpack-dev-middleware": "^5.3.4", "ws": "^8.13.0" }, "bin": { @@ -17976,12 +20209,14 @@ "node_modules/webpack-dev-server/node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -18084,26 +20319,77 @@ } }, "node_modules/webpackbar": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", - "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", + "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==", "dependencies": { - "chalk": "^4.1.0", - "consola": "^2.15.3", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "consola": "^3.2.3", + "figures": "^3.2.0", + "markdown-table": "^2.0.0", "pretty-time": "^1.1.0", - "std-env": "^3.0.1" + "std-env": "^3.7.0", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=12" + "node": ">=14.21.3" }, "peerDependencies": { "webpack": "3 || 4 || 5" } }, + "node_modules/webpackbar/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/webpackbar/node_modules/markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "dependencies": { + "repeat-string": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpackbar/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpackbar/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -18117,6 +20403,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", "engines": { "node": ">=0.8.0" } @@ -18268,6 +20555,7 @@ "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -18299,7 +20587,6 @@ "version": "1.6.11", "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "license": "MIT", "dependencies": { "sax": "^1.2.4" }, @@ -18318,7 +20605,8 @@ "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" }, "node_modules/yaml": { "version": "1.10.2", @@ -18377,9 +20665,9 @@ } }, "node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "engines": { "node": ">=12.20" }, diff --git a/docs/package.json b/docs/package.json index 91af37e9ff..d462d73555 100644 --- a/docs/package.json +++ b/docs/package.json @@ -14,9 +14,10 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/preset-classic": "3.5.2", - "@docusaurus/theme-mermaid": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/plugin-client-redirects": "3.6.3", + "@docusaurus/preset-classic": "3.6.3", + "@docusaurus/theme-mermaid": "3.6.3", "@mdx-js/react": "3.1.0", "clsx": "^2.1.1", "docusaurus-protobuffet": "^0.3.3", @@ -24,11 +25,11 @@ "prism-react-renderer": "^1.3.5", "react": "^18.3.1", "react-dom": "^18.3.1", - "redocusaurus": "^2.1.2", + "redocusaurus": "^2.2.0", "styled-components": "^6.1.13" }, "devDependencies": { - "@docusaurus/module-type-aliases": "3.5.2" + "@docusaurus/module-type-aliases": "3.6.3" }, "browserslist": { "production": [ diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css index 83a6b8b262..1e598b1819 100644 --- a/docs/src/css/custom.css +++ b/docs/src/css/custom.css @@ -16,23 +16,20 @@ a { text-decoration: underline; } -.navbar a { +.navbar a, +.menu a, +.footer a, +.pagination-nav__link, +.table-of-contents__link { text-decoration: none; } + .menu a { font-weight: 500; - text-decoration: none; -} -.footer a { - text-decoration: none; -} -.pagination-nav__link { - text-decoration: none; } .table-of-contents__link { text-transform: uppercase; - text-decoration: none; font-size: 12px; font-weight: 700; } @@ -42,11 +39,11 @@ h4 { } :root { - --ifm-font-family-base: 'Roboto'; + --ifm-font-family-base: 'Roboto'; --ifm-font-size-base: 15px; --ifm-code-font-size: 95%; --ifm-navbar-background-color: #303846; - --ifm-navbar-link-color: lightgray ; + --ifm-navbar-link-color: lightgray; --ifm-navbar-link-hover-color: white; } @@ -79,13 +76,13 @@ h4 { } [data-theme='light'] { - --ifm-font-family-base: 'Roboto'; + --ifm-font-family-base: 'Roboto'; --ifm-font-size-base: 15px; --ifm-color-primary: black; } -[data-theme='dark'] body { - background-color: black; +html[data-theme='dark'] { + --ifm-background-color: black; } [data-theme='dark'] .hero__subtitle { @@ -103,6 +100,7 @@ h4 { [data-theme='light'] .clean-btn { color: lightgray; } + [data-theme='light'] .clean-btn:hover { background-color: #202020; } @@ -130,7 +128,7 @@ h1 { } [data-theme='dark'] .breadcrumbs__item:not(:last-child):after { - content: "›"; + content: '›'; color: white; margin: 0 0.5rem; font-size: 1rem; diff --git a/docs/static/img/Minder-whitetxt.svg b/docs/static/img/Minder-whitetxt.svg index 82cadca5d6..2d3eab731e 100644 --- a/docs/static/img/Minder-whitetxt.svg +++ b/docs/static/img/Minder-whitetxt.svg @@ -10,9 +10,10 @@ .st4{fill:#002A3E;} .st5{fill:none;stroke:#002A3E;stroke-width:3.0465;stroke-miterlimit:10;} .st6{opacity:0.44;fill:#5A21FF;enable-background:new ;} + .st7{fill:none;} - + diff --git a/docs/static/img/minder/schema.png b/docs/static/img/minder/schema.png index 37d99f83ce..1865ee23d8 100644 Binary files a/docs/static/img/minder/schema.png and b/docs/static/img/minder/schema.png differ diff --git a/go.mod b/go.mod index f8ff599933..eb4b56128b 100644 --- a/go.mod +++ b/go.mod @@ -1,63 +1,69 @@ module github.com/mindersec/minder -go 1.23.1 +go 1.23.4 require ( - github.com/ThreeDotsLabs/watermill v1.3.7 + buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.1-20241127180247-a33202765966.1 + github.com/ThreeDotsLabs/watermill v1.4.1 github.com/ThreeDotsLabs/watermill-sql/v3 v3.1.0 github.com/alexdrl/zerowater v0.0.3 - github.com/aws/aws-sdk-go-v2 v1.32.2 - github.com/aws/aws-sdk-go-v2/config v1.28.0 - github.com/aws/aws-sdk-go-v2/service/sesv2 v1.37.0 + github.com/aws/aws-sdk-go-v2 v1.32.7 + github.com/aws/aws-sdk-go-v2/config v1.28.7 + github.com/aws/aws-sdk-go-v2/service/sesv2 v1.40.1 github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df + github.com/bufbuild/protovalidate-go v0.8.0 github.com/cenkalti/backoff/v4 v4.3.0 github.com/charmbracelet/bubbles v0.20.0 - github.com/charmbracelet/bubbletea v1.1.2 + github.com/charmbracelet/bubbletea v1.2.4 github.com/charmbracelet/glamour v0.8.0 - github.com/charmbracelet/lipgloss v0.13.1 + github.com/charmbracelet/lipgloss v1.0.0 + github.com/cloudevents/sdk-go/observability/opentelemetry/v2 v2.15.2 github.com/cloudevents/sdk-go/protocol/nats_jetstream/v2 v2.15.2 github.com/cloudevents/sdk-go/v2 v2.15.2 github.com/erikgeiser/promptkit v0.9.0 github.com/evanphx/json-patch/v5 v5.9.0 - github.com/fergusstrange/embedded-postgres v1.29.0 + github.com/fergusstrange/embedded-postgres v1.30.0 github.com/go-git/go-billy/v5 v5.6.0 github.com/go-git/go-git/v5 v5.12.0 - github.com/go-playground/validator/v10 v10.22.1 + github.com/go-playground/validator/v10 v10.23.0 github.com/go-viper/mapstructure/v2 v2.2.1 - github.com/goccy/go-json v0.10.3 - github.com/golang-jwt/jwt/v4 v4.5.0 + github.com/goccy/go-json v0.10.4 + github.com/golang-jwt/jwt/v4 v4.5.1 github.com/golang-migrate/migrate/v4 v4.18.1 - github.com/google/cel-go v0.21.0 + github.com/google/cel-go v0.22.1 github.com/google/go-cmp v0.6.0 github.com/google/go-containerregistry v0.20.2 github.com/google/go-github/v63 v63.0.0 - github.com/google/osv-scalibr v0.1.4-0.20241022131720-b583481e91a8 + github.com/google/osv-scalibr v0.1.5 github.com/google/uuid v1.6.0 github.com/gorilla/handlers v1.5.2 github.com/gorilla/securecookie v1.1.2 - github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 + github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.2.0 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 github.com/hashicorp/go-version v1.7.0 - github.com/itchyny/gojq v0.12.16 + github.com/itchyny/gojq v0.12.17 github.com/lib/pq v1.10.9 github.com/microcosm-cc/bluemonday v1.0.27 + github.com/mikefarah/yq/v4 v4.44.6 github.com/motemen/go-loghttp v0.0.0-20231107055348-29ae44b293f4 - github.com/nats-io/nats-server/v2 v2.10.22 - github.com/nats-io/nats.go v1.37.0 + github.com/nats-io/nats-server/v2 v2.10.24 + github.com/nats-io/nats.go v1.38.0 github.com/oapi-codegen/runtime v1.1.1 github.com/olekukonko/tablewriter v0.0.5 github.com/open-feature/go-sdk v1.13.1 github.com/open-feature/go-sdk-contrib/providers/go-feature-flag-in-process v0.1.0 - github.com/open-policy-agent/opa v0.69.0 + github.com/open-policy-agent/opa v0.70.0 github.com/openfga/go-sdk v0.6.3 - github.com/openfga/openfga v1.6.1 + github.com/openfga/openfga v1.8.2 github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c github.com/prometheus/client_golang v1.20.5 + github.com/protobom/protobom v0.5.0 github.com/puzpuzpuz/xsync/v3 v3.4.0 github.com/robfig/cron/v3 v3.0.1 github.com/rs/zerolog v1.33.0 - github.com/signalfx/splunk-otel-go/instrumentation/database/sql/splunksql v1.21.0 - github.com/signalfx/splunk-otel-go/instrumentation/github.com/lib/pq/splunkpq v1.21.0 + github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 + github.com/signalfx/splunk-otel-go/instrumentation/database/sql/splunksql v1.23.0 + github.com/signalfx/splunk-otel-go/instrumentation/github.com/lib/pq/splunkpq v1.23.0 github.com/sigstore/protobuf-specs v0.3.2 github.com/sigstore/sigstore-go v0.6.2 github.com/spf13/cobra v1.8.1 @@ -65,38 +71,40 @@ require ( github.com/spf13/viper v1.19.0 github.com/sqlc-dev/pqtype v0.3.0 github.com/stacklok/frizbee v0.1.4 - github.com/stacklok/trusty-sdk-go v0.2.1 - github.com/stretchr/testify v1.9.0 - github.com/styrainc/regal v0.28.0 - github.com/thomaspoignant/go-feature-flag v1.37.0 - github.com/xanzy/go-gitlab v0.112.0 - github.com/xeipuuv/gojsonschema v1.2.0 + github.com/stacklok/trusty-sdk-go v0.2.3-0.20241121160719-089f44e88687 + github.com/std-uritemplate/std-uritemplate/go/v2 v2.0.1 + github.com/stretchr/testify v1.10.0 + github.com/styrainc/regal v0.29.2 + github.com/thomaspoignant/go-feature-flag v1.40.0 github.com/yuin/goldmark v1.7.8 - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 - go.opentelemetry.io/otel v1.31.0 - go.opentelemetry.io/otel/exporters/prometheus v0.53.0 - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 - go.opentelemetry.io/otel/sdk v1.31.0 - go.opentelemetry.io/otel/sdk/metric v1.31.0 - go.opentelemetry.io/otel/trace v1.31.0 + gitlab.com/gitlab-org/api/client-go v0.116.0 + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 + go.opentelemetry.io/otel v1.33.0 + go.opentelemetry.io/otel/exporters/prometheus v0.55.0 + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.33.0 + go.opentelemetry.io/otel/sdk v1.33.0 + go.opentelemetry.io/otel/sdk/metric v1.33.0 + go.opentelemetry.io/otel/trace v1.33.0 go.uber.org/mock v0.5.0 - golang.org/x/crypto v0.28.0 + golang.org/x/crypto v0.31.0 golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c - golang.org/x/oauth2 v0.23.0 - golang.org/x/sync v0.8.0 - golang.org/x/term v0.25.0 - google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 - google.golang.org/grpc v1.67.1 - google.golang.org/protobuf v1.35.1 + golang.org/x/oauth2 v0.24.0 + golang.org/x/sync v0.10.0 + golang.org/x/term v0.27.0 + google.golang.org/genproto/googleapis/api v0.0.0-20241219192143-6b3ec007d9bb + google.golang.org/grpc v1.69.2 + google.golang.org/protobuf v1.36.1 + gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 - k8s.io/apimachinery v0.31.2 - k8s.io/client-go v0.31.2 + k8s.io/apimachinery v0.32.0 + k8s.io/client-go v0.32.0 sigs.k8s.io/release-utils v0.8.5 ) require ( + cel.dev/expr v0.18.0 // indirect filippo.io/edwards25519 v1.1.0 // indirect github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 // indirect github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20231105174938-2b5cbb29f3e2 // indirect @@ -105,27 +113,31 @@ require ( github.com/Masterminds/squirrel v1.5.4 // indirect github.com/MicahParks/keyfunc/v2 v2.1.0 // indirect github.com/Microsoft/hcsshim v0.12.8 // indirect + github.com/Yiling-J/theine-go v0.6.0 // indirect + github.com/a8m/envsubst v1.4.2 // indirect github.com/alecthomas/chroma/v2 v2.14.0 // indirect + github.com/alecthomas/participle/v2 v2.1.1 // indirect github.com/anchore/go-struct-converter v0.0.0-20240925125616-a0883641c664 // indirect github.com/anderseknert/roast v0.4.2 // indirect github.com/antlr4-go/antlr/v4 v4.13.1 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/atotto/clipboard v0.1.4 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.41 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.17 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.48 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.22 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.24.2 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.32.2 // indirect - github.com/aws/smithy-go v1.22.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.26 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.8 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.33.3 // indirect + github.com/aws/smithy-go v1.22.1 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/aymerick/douceur v0.2.0 // indirect - github.com/charmbracelet/x/ansi v0.4.0 // indirect - github.com/charmbracelet/x/term v0.2.0 // indirect + github.com/charmbracelet/x/ansi v0.4.5 // indirect + github.com/charmbracelet/x/term v0.2.1 // indirect github.com/containerd/cgroups/v3 v3.0.3 // indirect github.com/containerd/containerd v1.7.23 // indirect github.com/containerd/containerd/api v1.7.19 // indirect @@ -139,35 +151,41 @@ require ( github.com/coreos/go-semver v0.3.1 // indirect github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/dimchansky/utfbom v1.1.1 // indirect github.com/distribution/reference v0.6.0 // indirect github.com/dlclark/regexp2 v1.11.4 // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-events v0.0.0-20241017185736-969db071c880 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect + github.com/elliotchance/orderedmap v1.7.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.1.0 // indirect github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect github.com/erikvarga/go-rpmdb v0.0.0-20240208180226-b97e041ef9af // indirect + github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-chi/chi/v5 v5.1.0 // indirect github.com/go-jose/go-jose/v4 v4.0.4 // indirect github.com/go-sql-driver/mysql v1.8.1 // indirect + github.com/goccy/go-yaml v1.13.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/google/go-github/v61 v61.0.0 // indirect github.com/google/osv-scanner v1.9.0 // indirect github.com/gorilla/css v1.0.1 // indirect + github.com/groob/plist v0.1.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/hashicorp/go-sockaddr v1.0.5 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/in-toto/attestation v1.1.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect - github.com/jackc/pgx/v5 v5.7.0 // indirect - github.com/jackc/puddle/v2 v2.2.1 // indirect + github.com/jackc/pgx/v5 v5.7.1 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/jinzhu/copier v0.4.0 // indirect github.com/jon-whit/go-grpc-prometheus v1.4.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/karlseguin/ccache/v3 v3.0.5 // indirect + github.com/klauspost/cpuid/v2 v2.2.5 // indirect github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect github.com/lestrrat-go/blackmagic v1.0.2 // indirect @@ -196,8 +214,8 @@ require ( github.com/muhlemmer/gu v0.3.1 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/natefinch/wrap v0.2.0 // indirect - github.com/nats-io/jwt/v2 v2.5.8 // indirect - github.com/nats-io/nkeys v0.4.7 // indirect + github.com/nats-io/jwt/v2 v2.7.3 // indirect + github.com/nats-io/nkeys v0.4.9 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect github.com/nikunjy/rules v1.5.0 // indirect @@ -205,10 +223,10 @@ require ( github.com/oklog/ulid/v2 v2.1.0 // indirect github.com/opencontainers/runtime-spec v1.2.0 // indirect github.com/opencontainers/selinux v1.11.1 // indirect - github.com/openfga/api/proto v0.0.0-20240906203051-102620ef2a66 // indirect - github.com/openfga/language/pkg/go v0.2.0-beta.2 // indirect + github.com/openfga/api/proto v0.0.0-20241213152732-0bb89b73d655 // indirect + github.com/openfga/language/pkg/go v0.2.0-beta.2.0.20241115164311-10e575c8e47c // indirect github.com/package-url/packageurl-go v0.1.3 // indirect - github.com/pressly/goose/v3 v3.22.0 // indirect + github.com/pressly/goose/v3 v3.23.1 // indirect github.com/puzpuzpuz/xsync v1.5.2 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rs/cors v1.11.1 // indirect @@ -218,7 +236,7 @@ require ( github.com/secure-systems-lab/go-securesystemslib v0.8.0 // indirect github.com/segmentio/asm v1.2.0 // indirect github.com/sethvargo/go-retry v0.3.0 // indirect - github.com/signalfx/splunk-otel-go/instrumentation/internal v1.21.0 // indirect + github.com/signalfx/splunk-otel-go/instrumentation/internal v1.23.0 // indirect github.com/sigstore/sigstore v1.8.10 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spdx/gordf v0.0.0-20221230105357-b735bd5aac89 // indirect @@ -227,23 +245,27 @@ require ( github.com/theupdateframework/go-tuf/v2 v2.0.2 // indirect github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect github.com/yuin/goldmark-emoji v1.0.4 // indirect + github.com/yuin/gopher-lua v1.1.1 // indirect + github.com/zeebo/xxh3 v1.0.2 // indirect github.com/zitadel/logging v0.6.1 // indirect github.com/zitadel/schema v1.3.0 // indirect go.etcd.io/bbolt v1.3.11 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect - go.opentelemetry.io/proto/otlp v1.3.1 // indirect - golang.org/x/time v0.7.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0 // indirect + go.opentelemetry.io/proto/otlp v1.4.0 // indirect + golang.org/x/time v0.8.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect - google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 // indirect + gonum.org/v1/gonum v0.15.1 // indirect + google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 // indirect gotest.tools/v3 v3.5.1 // indirect - k8s.io/utils v0.0.0-20240921022957-49e7df575cb6 // indirect + k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect modernc.org/libc v1.55.3 // indirect modernc.org/mathutil v1.6.0 // indirect modernc.org/memory v1.8.0 // indirect - modernc.org/sqlite v1.32.0 // indirect + modernc.org/sqlite v1.34.2 // indirect modernc.org/strutil v1.2.0 // indirect modernc.org/token v1.1.0 // indirect ) @@ -267,12 +289,12 @@ require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/digitorus/pkcs7 v0.0.0-20230818184609-3a137a874352 // indirect github.com/digitorus/timestamp v0.0.0-20231217203849-220c5c2851b7 // indirect - github.com/docker/cli v27.3.1+incompatible + github.com/docker/cli v27.3.1+incompatible // indirect github.com/docker/distribution v2.8.3+incompatible // indirect - github.com/docker/docker v27.2.1+incompatible // indirect + github.com/docker/docker v27.4.0+incompatible // indirect github.com/docker/docker-credential-helpers v0.8.2 // indirect github.com/emirpasic/gods v1.18.1 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/gabriel-vasile/mimetype v1.4.6 // indirect github.com/go-chi/chi v4.1.2+incompatible // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect @@ -310,7 +332,7 @@ require ( github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/klauspost/compress v1.17.11 // indirect github.com/leodido/go-urn v1.4.0 // indirect - github.com/lestrrat-go/jwx/v2 v2.1.1 + github.com/lestrrat-go/jwx/v2 v2.1.3 github.com/letsencrypt/boulder v0.0.0-20241021211548-844334e04aef // indirect github.com/lithammer/shortuuid/v3 v3.0.7 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect @@ -326,12 +348,12 @@ require ( github.com/opencontainers/go-digest v1.0.0 github.com/opencontainers/image-spec v1.1.0 github.com/opentracing/opentracing-go v1.2.0 // indirect - github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.60.0 // indirect + github.com/prometheus/common v0.61.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rivo/uniseg v0.4.7 // indirect @@ -357,17 +379,17 @@ require ( github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/yashtewari/glob-intersection v0.2.0 // indirect - github.com/zitadel/oidc/v3 v3.31.0 + github.com/zitadel/oidc/v3 v3.33.1 go.mongodb.org/mongo-driver v1.17.1 // indirect - go.opentelemetry.io/otel/metric v1.31.0 + go.opentelemetry.io/otel/metric v1.33.0 go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/mod v0.21.0 - golang.org/x/net v0.30.0 // indirect - golang.org/x/sys v0.26.0 // indirect - golang.org/x/text v0.19.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 // indirect + golang.org/x/mod v0.22.0 + golang.org/x/net v0.33.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241219192143-6b3ec007d9bb // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect k8s.io/klog/v2 v2.130.1 // indirect diff --git a/go.sum b/go.sum index eb998c0122..8a72ede625 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ -cel.dev/expr v0.16.1 h1:NR0+oFYzR1CqLFhTAqg3ql59G9VfN8fKq1TCHJ6gq1g= -cel.dev/expr v0.16.1/go.mod h1:AsGA5zb3WruAEQeQng1RZdGEXmBj0jvMWh6l5SnNuC8= +buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.1-20241127180247-a33202765966.1 h1:v223wh/bhlSHSc0tU9PXRWXHhkw3UWMtth7TmYGfHAQ= +buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.1-20241127180247-a33202765966.1/go.mod h1:/zlFuuECgFgewxwW6qQKgvMJ07YZkWlVkcSxEhJprJw= +cel.dev/expr v0.18.0 h1:CJ6drgk+Hf96lkLikr4rFf19WrU0BOWEihyZnI2TAzo= +cel.dev/expr v0.18.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -17,29 +19,29 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= -cloud.google.com/go/auth v0.9.8 h1:+CSJ0Gw9iVeSENVCKJoLHhdUykDgXSc4Qn+gu2BRtR8= -cloud.google.com/go/auth v0.9.8/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI= -cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY= -cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc= +cloud.google.com/go/auth v0.11.0 h1:Ic5SZz2lsvbYcWT5dfjNWgw6tTlGi2Wc8hyQSC9BstA= +cloud.google.com/go/auth v0.11.0/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI= +cloud.google.com/go/auth/oauth2adapt v0.2.6 h1:V6a6XDu2lTwPZWOawrAa9HUK+DB2zfJyTuciBG5hFkU= +cloud.google.com/go/auth/oauth2adapt v0.2.6/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.28.1 h1:XwPcZjgMCnU2tkwY10VleUjSAfpTj9RDn+kGrbYsi8o= +cloud.google.com/go/compute v1.29.0 h1:Lph6d8oPi38NHkOr6S55Nus/Pbbcp37m/J0ohgKAefs= cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo= cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v1.2.1 h1:QFct02HRb7H12J/3utj0qf5tobFh9V4vR6h9eX5EBRU= -cloud.google.com/go/iam v1.2.1/go.mod h1:3VUIJDPpwT6p/amXRC5GY8fCCh70lxPygguVtI0Z4/g= -cloud.google.com/go/kms v1.20.0 h1:uKUvjGqbBlI96xGE669hcVnEMw1Px/Mvfa62dhM5UrY= -cloud.google.com/go/kms v1.20.0/go.mod h1:/dMbFF1tLLFnQV44AoI2GlotbjowyUfgVwezxW291fM= -cloud.google.com/go/longrunning v0.6.1 h1:lOLTFxYpr8hcRtcwWir5ITh1PAKUD/sG2lKrTSYjyMc= -cloud.google.com/go/longrunning v0.6.1/go.mod h1:nHISoOZpBcmlwbJmiVk5oDRz0qG/ZxPynEGs1iZ79s0= -cloud.google.com/go/monitoring v1.21.1 h1:zWtbIoBMnU5LP9A/fz8LmWMGHpk4skdfeiaa66QdFGc= -cloud.google.com/go/monitoring v1.21.1/go.mod h1:Rj++LKrlht9uBi8+Eb530dIrzG/cU/lB8mt+lbeFK1c= +cloud.google.com/go/iam v1.2.2 h1:ozUSofHUGf/F4tCNy/mu9tHLTaxZFLOUiKzjcgWHGIA= +cloud.google.com/go/iam v1.2.2/go.mod h1:0Ys8ccaZHdI1dEUilwzqng/6ps2YB6vRsjIe00/+6JY= +cloud.google.com/go/kms v1.20.1 h1:og29Wv59uf2FVaZlesaiDAqHFzHaoUyHI3HYp9VUHVg= +cloud.google.com/go/kms v1.20.1/go.mod h1:LywpNiVCvzYNJWS9JUcGJSVTNSwPwi0vBAotzDqn2nc= +cloud.google.com/go/longrunning v0.6.2 h1:xjDfh1pQcWPEvnfjZmwjKQEcHnpz6lHjfy7Fo0MK+hc= +cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI= +cloud.google.com/go/monitoring v1.21.2 h1:FChwVtClH19E7pJ+e0xUhJPGksctZNVOk2UhMmblmdU= +cloud.google.com/go/monitoring v1.21.2/go.mod h1:hS3pXvaG8KgWTSz+dAdyzPrGUYmi2Q+WFX8g2hqVEZU= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -49,8 +51,8 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.45.0 h1:5av0QcIVj77t+44mV4gffFC/LscFRUhto6UBMB5SimM= -cloud.google.com/go/storage v1.45.0/go.mod h1:wpPblkIuMP5jCB/E48Pz9zIo2S/zD8g+ITmxKkPCITE= +cloud.google.com/go/storage v1.48.0 h1:FhBDHACbVtdPx7S/AbcKujPWiHvfO6F8OXGgCEbB2+o= +cloud.google.com/go/storage v1.48.0/go.mod h1:aFoDYNMAjv67lp+xcuZqjUKv/ctmplzQ3wJgodA7b+M= dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -62,10 +64,10 @@ github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20231105174938-2b5cbb29f3e2 h1:dIS github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20231105174938-2b5cbb29f3e2/go.mod h1:gCLVsLfv1egrcZu+GoJATN5ts75F2s62ih/457eWzOw= github.com/AdamKorcz/go-fuzz-headers-1 v0.0.0-20230919221257-8b5d3ce2d11d h1:zjqpY4C7H15HjRPEenkS4SAn3Jy2eRRjkjZbGR30TOg= github.com/AdamKorcz/go-fuzz-headers-1 v0.0.0-20230919221257-8b5d3ce2d11d/go.mod h1:XNqJ7hv2kY++g8XEHREpi+JqZo3+0l+CH2egBVN4yqM= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 h1:nyQWyZvwGTvunIMxi1Y9uXkcyr+I7TeNrr/foo4Kpk8= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.16.0 h1:JZg6HRh6W6U4OLl6lk7BZ7BLisIzM9dG1R50zUk9C/M= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.16.0/go.mod h1:YL1xnZ6QejvQHWJrX/AvhFl4WW4rqHVoKspWNVwFk0M= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0 h1:B/dfvscEQtew9dVuoxqxrUKKv8Ih2f55PydknDamU+g= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0/go.mod h1:fiPSssYvltE08HJchL04dOy+RD4hgrjph0cwGGMntdI= github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.1.0 h1:DRiANoJTiW6obBQe3SqZizkuV1PEgfiiGivmVocDy64= @@ -82,8 +84,8 @@ github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/CycloneDX/cyclonedx-go v0.9.1 h1:yffaWOZsv77oTJa/SdVZYdgAgFioCeycBUKkqS2qzQM= github.com/CycloneDX/cyclonedx-go v0.9.1/go.mod h1:NE/EWvzELOFlG6+ljX/QeMlVt9VKcTwu8u0ccsACEsw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1 h1:pB2F2JKCj1Znmp2rwxxt1J0Fg0wezTMgWYk5Mpbi1kg= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1/go.mod h1:itPGVDKf9cC/ov4MdvJ2QZ0khw4bfoo9jzwTJlaxy2k= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.2 h1:cZpsGsWTIFKymTA0je7IIvi1O7Es7apb9CF3EQlOcfE= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.2/go.mod h1:itPGVDKf9cC/ov4MdvJ2QZ0khw4bfoo9jzwTJlaxy2k= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 h1:UQ0AhxogsIRZDkElkblfnwjc3IaltCm2HUMvezQaL7s= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1/go.mod h1:jyqM3eLpJ3IbIFDTKVz2rF9T/xWGW0rIriGwnz8l9Tk= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 h1:8nn+rsCvTq9axyEh382S0PFLBeaFwNsT43IrPWzctRU= @@ -103,16 +105,22 @@ github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0k github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= github.com/ThreeDotsLabs/watermill v1.1.1/go.mod h1:Qd1xNFxolCAHCzcMrm6RnjW0manbvN+DJVWc1MWRFlI= -github.com/ThreeDotsLabs/watermill v1.3.7 h1:NV0PSTmuACVEOV4dMxRnmGXrmbz8U83LENOvpHekN7o= -github.com/ThreeDotsLabs/watermill v1.3.7/go.mod h1:lBnrLbxOjeMRgcJbv+UiZr8Ylz8RkJ4m6i/VN/Nk+to= +github.com/ThreeDotsLabs/watermill v1.4.1 h1:gjP6yZH+otMPjV0KsV07pl9TeMm9UQV/gqiuiuG5Drs= +github.com/ThreeDotsLabs/watermill v1.4.1/go.mod h1:lBnrLbxOjeMRgcJbv+UiZr8Ylz8RkJ4m6i/VN/Nk+to= github.com/ThreeDotsLabs/watermill-sql/v3 v3.1.0 h1:g4uE5Nm3Z6LVB3m+uMgHlN4ne4bDpwf3RJmXYRgMv94= github.com/ThreeDotsLabs/watermill-sql/v3 v3.1.0/go.mod h1:G8/otZYWLTCeYL2Ww3ujQ7gQ/3+jw5Bj0UtyKn7bBjA= +github.com/Yiling-J/theine-go v0.6.0 h1:jv7V/tcD6ijL0T4kfbJDKP81TCZBkoriNTPSqwivWuY= +github.com/Yiling-J/theine-go v0.6.0/go.mod h1:mdch1vjgGWd7s3rWKvY+MF5InRLfRv/CWVI9RVNQ8wY= +github.com/a8m/envsubst v1.4.2 h1:4yWIHXOLEJHQEFd4UjrWDrYeYlV7ncFWJOCBRLOZHQg= +github.com/a8m/envsubst v1.4.2/go.mod h1:MVUTQNGQ3tsjOOtKCNd+fl8RzhsXcDvvAEzkhGtlsbY= github.com/agnivade/levenshtein v1.2.0 h1:U9L4IOT0Y3i0TIlUIDJ7rVUziKi/zPbrJGaFrtYH3SY= github.com/agnivade/levenshtein v1.2.0/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU= github.com/alecthomas/assert/v2 v2.7.0 h1:QtqSACNS3tF7oasA8CU6A6sXZSBDqnm7RfpLl9bZqbE= github.com/alecthomas/assert/v2 v2.7.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= github.com/alecthomas/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E= github.com/alecthomas/chroma/v2 v2.14.0/go.mod h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4EbYP4i6n68SG4I= +github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6icjJvbsmV8= +github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -146,48 +154,48 @@ github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= -github.com/aws/aws-sdk-go-v2 v1.32.2 h1:AkNLZEyYMLnx/Q/mSKkcMqwNFXMAvFto9bNsHqcTduI= -github.com/aws/aws-sdk-go-v2 v1.32.2/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6 h1:pT3hpW0cOHRJx8Y0DfJUEQuqPild8jRGmSFmBgvydr0= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6/go.mod h1:j/I2++U0xX+cr44QjHay4Cvxj6FUbnxrgmqN3H1jTZA= -github.com/aws/aws-sdk-go-v2/config v1.28.0 h1:FosVYWcqEtWNxHn8gB/Vs6jOlNwSoyOCA/g/sxyySOQ= -github.com/aws/aws-sdk-go-v2/config v1.28.0/go.mod h1:pYhbtvg1siOOg8h5an77rXle9tVG8T+BWLWAo7cOukc= -github.com/aws/aws-sdk-go-v2/credentials v1.17.41 h1:7gXo+Axmp+R4Z+AK8YFQO0ZV3L0gizGINCOWxSLY9W8= -github.com/aws/aws-sdk-go-v2/credentials v1.17.41/go.mod h1:u4Eb8d3394YLubphT4jLEwN1rLNq2wFOlT6OuxFwPzU= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.17 h1:TMH3f/SCAWdNtXXVPPu5D6wrr4G5hI1rAxbcocKfC7Q= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.17/go.mod h1:1ZRXLdTpzdJb9fwTMXiLipENRxkGMTn1sfKexGllQCw= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.33 h1:X+4YY5kZRI/cOoSMVMGTqFXHAMg1bvvay7IBcqHpybQ= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.33/go.mod h1:DPynzu+cn92k5UQ6tZhX+wfTB4ah6QDU/NgdHqatmvk= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21 h1:UAsR3xA31QGf79WzpG/ixT9FZvQlh5HY1NRqSHBNOCk= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21/go.mod h1:JNr43NFf5L9YaG3eKTm7HQzls9J+A9YYcGI5Quh1r2Y= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21 h1:6jZVETqmYCadGFvrYEQfC5fAQmlo80CeL5psbno6r0s= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21/go.mod h1:1SR0GbLlnN3QUmYaflZNiH1ql+1qrSiB2vwcJ+4UM60= +github.com/aws/aws-sdk-go-v2 v1.32.7 h1:ky5o35oENWi0JYWUZkB7WYvVPP+bcRF5/Iq7JWSb5Rw= +github.com/aws/aws-sdk-go-v2 v1.32.7/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 h1:lL7IfaFzngfx0ZwUGOZdsFFnQ5uLvR0hWqqhyE7Q9M8= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7/go.mod h1:QraP0UcVlQJsmHfioCrveWOC1nbiWUl3ej08h4mXWoc= +github.com/aws/aws-sdk-go-v2/config v1.28.7 h1:GduUnoTXlhkgnxTD93g1nv4tVPILbdNQOzav+Wpg7AE= +github.com/aws/aws-sdk-go-v2/config v1.28.7/go.mod h1:vZGX6GVkIE8uECSUHB6MWAUsd4ZcG2Yq/dMa4refR3M= +github.com/aws/aws-sdk-go-v2/credentials v1.17.48 h1:IYdLD1qTJ0zanRavulofmqut4afs45mOWEI+MzZtTfQ= +github.com/aws/aws-sdk-go-v2/credentials v1.17.48/go.mod h1:tOscxHN3CGmuX9idQ3+qbkzrjVIx32lqDSU1/0d/qXs= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.22 h1:kqOrpojG71DxJm/KDPO+Z/y1phm1JlC8/iT+5XRmAn8= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.22/go.mod h1:NtSFajXVVL8TA2QNngagVZmUtXciyrHOt7xgz4faS/M= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.43 h1:iLdpkYZ4cXIQMO7ud+cqMWR1xK5ESbt1rvN77tRi1BY= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.43/go.mod h1:OgbsKPAswXDd5kxnR4vZov69p3oYjbvUyIRBAAV0y9o= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26 h1:I/5wmGMffY4happ8NOCuIUEWGUvvFp5NSeQcXl9RHcI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26/go.mod h1:FR8f4turZtNy6baO0KJ5FJUmXH/cSkI9fOngs0yl6mA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26 h1:zXFLuEuMMUOvEARXFUVJdfqZ4bvvSgdGRq/ATcrQxzM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26/go.mod h1:3o2Wpy0bogG1kyOPrgkXA8pgIfEEv0+m19O9D5+W8y8= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.21 h1:7edmS3VOBDhK00b/MwGtGglCm7hhwNYnjJs/PgFdMQE= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.21/go.mod h1:Q9o5h4HoIWG8XfzxqiuK/CGUbepCJ8uTlaE3bAbxytQ= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 h1:TToQNkvGguu209puTojY/ozlqy2d/SFNcoLIqTFi42g= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0/go.mod h1:0jp+ltwkf+SwG2fm/PKo8t4y8pJSgOCO4D8Lz3k0aHQ= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.2 h1:4FMHqLfk0efmTqhXVRL5xYRqlEBNBiRI7N6w4jsEdd4= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.2/go.mod h1:LWoqeWlK9OZeJxsROW2RqrSPvQHKTpp69r/iDjwsSaw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.2 h1:s7NA1SOw8q/5c0wr8477yOPp0z+uBaXBnLE0XYb0POA= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.2/go.mod h1:fnjjWyAW/Pj5HYOxl9LJqWtEwS7W2qgcRLWP+uWbss0= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.2 h1:t7iUP9+4wdc5lt3E41huP+GvQZJD38WLsgVp4iOtAjg= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.2/go.mod h1:/niFCtmuQNxqx9v8WAPq5qh7EH25U4BF6tjoyq9bObM= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.26 h1:GeNJsIFHB+WW5ap2Tec4K6dzcVTsRbsT1Lra46Hv9ME= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.26/go.mod h1:zfgMpwHDXX2WGoG84xG2H+ZlPTkJUU4YUvx2svLQYWo= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6 h1:HCpPsWqmYQieU7SS6E9HXfdAMSud0pteVXieJmcpIRI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6/go.mod h1:ngUiVRCco++u+soRRVBIvBZxSMMvOVMXA4PJ36JLfSw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7 h1:8eUsivBQzZHqe/3FE+cqwfH+0p5Jo8PFM/QYQSmeZ+M= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7/go.mod h1:kLPQvGUmxn/fqiCrDeohwG33bq2pQpGeY62yRO6Nrh0= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6 h1:BbGDtTi0T1DYlmjBiCr/le3wzhA37O8QTC5/Ab8+EXk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6/go.mod h1:hLMJt7Q8ePgViKupeymbqI0la+t9/iYFBjxQCFwuAwI= github.com/aws/aws-sdk-go-v2/service/kms v1.35.5 h1:XUomV7SiclZl1QuXORdGcfFqHxEHET7rmNGtxTfNB+M= github.com/aws/aws-sdk-go-v2/service/kms v1.35.5/go.mod h1:A5CS0VRmxxj2YKYLCY08l/Zzbd01m6JZn0WzxgT1OCA= -github.com/aws/aws-sdk-go-v2/service/s3 v1.66.0 h1:xA6XhTF7PE89BCNHJbQi8VvPzcgMtmGC5dr8S8N7lHk= -github.com/aws/aws-sdk-go-v2/service/s3 v1.66.0/go.mod h1:cB6oAuus7YXRZhWCc1wIwPywwZ1XwweNp2TVAEGYeB8= -github.com/aws/aws-sdk-go-v2/service/sesv2 v1.37.0 h1:zi9Ore7Gibnc6e9UoN2hVRpC2TBs0WLG53Z2t/h4bL4= -github.com/aws/aws-sdk-go-v2/service/sesv2 v1.37.0/go.mod h1:7bUb26fIdasR5TTrP9jLuYp0V20xThhNCqID1onwat8= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.2 h1:bSYXVyUzoTHoKalBmwaZxs97HU9DWWI3ehHSAMa7xOk= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.2/go.mod h1:skMqY7JElusiOUjMJMOv1jJsP7YUg7DrhgqZZWuzu1U= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.2 h1:AhmO1fHINP9vFYUE0LHzCWg/LfUWUF+zFPEcY9QXb7o= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.2/go.mod h1:o8aQygT2+MVP0NaV6kbdE1YnnIM8RRVQzoeUH45GOdI= -github.com/aws/aws-sdk-go-v2/service/sts v1.32.2 h1:CiS7i0+FUe+/YY1GvIBLLrR/XNGZ4CtM1Ll0XavNuVo= -github.com/aws/aws-sdk-go-v2/service/sts v1.32.2/go.mod h1:HtaiBI8CjYoNVde8arShXb94UbQQi9L4EMr6D+xGBwo= -github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM= -github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/aws/aws-sdk-go-v2/service/s3 v1.71.0 h1:nyuzXooUNJexRT0Oy0UQY6AhOzxPxhtt4DcBIHyCnmw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.71.0/go.mod h1:sT/iQz8JK3u/5gZkT+Hmr7GzVZehUMkRZpOaAwYXeGY= +github.com/aws/aws-sdk-go-v2/service/sesv2 v1.40.1 h1:Yt8nLB7tGDz2tBACAvJpHHSMJ/JsFw4I2NqQI7wV8aE= +github.com/aws/aws-sdk-go-v2/service/sesv2 v1.40.1/go.mod h1:cwwQDQ0T1QgDRKyGU55qWLGg8BIij8oKKaYEjR1/U8o= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.8 h1:CvuUmnXI7ebaUAhbJcDy9YQx8wHR69eZ9I7q5hszt/g= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.8/go.mod h1:XDeGv1opzwm8ubxddF0cgqkZWsyOtw4lr6dxwmb6YQg= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.7 h1:F2rBfNAL5UyswqoeWv9zs74N/NanhK16ydHW1pahX6E= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.7/go.mod h1:JfyQ0g2JG8+Krq0EuZNnRwX0mU0HrwY/tG6JNfcqh4k= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.3 h1:Xgv/hyNgvLda/M9l9qxXc4UFSgppnRczLxlMs5Ae/QY= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.3/go.mod h1:5Gn+d+VaaRgsjewpMvGazt0WfcFO+Md4wLOuBfGR9Bc= +github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro= +github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= @@ -209,6 +217,8 @@ github.com/bmatcuk/doublestar/v4 v4.7.1 h1:fdDeAqgT47acgwd9bd9HxJRDmc9UAmPpc+2m0 github.com/bmatcuk/doublestar/v4 v4.7.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/bradleyjkemp/cupaloy/v2 v2.8.0 h1:any4BmKE+jGIaMpnU8YgH/I2LPiLBufr6oMMlVBbn9M= github.com/bradleyjkemp/cupaloy/v2 v2.8.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= +github.com/bufbuild/protovalidate-go v0.8.0 h1:Xs3kCLCJ4tQiogJ0iOXm+ClKw/KviW3nLAryCGW2I3Y= +github.com/bufbuild/protovalidate-go v0.8.0/go.mod h1:JPWZInGm2y2NBg3vKDKdDIkvDjyLv31J3hLH5GIFc/Q= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/bytecodealliance/wasmtime-go/v3 v3.0.2 h1:3uZCA/BLTIu+DqCfguByNMJa2HVHpXvjfy0Dy7g6fuA= github.com/bytecodealliance/wasmtime-go/v3 v3.0.2/go.mod h1:RnUjnIXxEJcL6BgCvNyzCCRzZcxCgsZCi+RNlvYor5Q= @@ -226,22 +236,24 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQWD9LIutE= github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU= -github.com/charmbracelet/bubbletea v1.1.2 h1:naQXF2laRxyLyil/i7fxdpiz1/k06IKquhm4vBfHsIc= -github.com/charmbracelet/bubbletea v1.1.2/go.mod h1:9HIU/hBV24qKjlehyj8z1r/tR9TYTQEag+cWZnuXo8E= +github.com/charmbracelet/bubbletea v1.2.4 h1:KN8aCViA0eps9SCOThb2/XPIlea3ANJLUkv3KnQRNCE= +github.com/charmbracelet/bubbletea v1.2.4/go.mod h1:Qr6fVQw+wX7JkWWkVyXYk/ZUQ92a6XNekLXa3rR18MM= github.com/charmbracelet/glamour v0.8.0 h1:tPrjL3aRcQbn++7t18wOpgLyl8wrOHUEDS7IZ68QtZs= github.com/charmbracelet/glamour v0.8.0/go.mod h1:ViRgmKkf3u5S7uakt2czJ272WSg2ZenlYEZXT2x7Bjw= -github.com/charmbracelet/lipgloss v0.13.1 h1:Oik/oqDTMVA01GetT4JdEC033dNzWoQHdWnHnQmXE2A= -github.com/charmbracelet/lipgloss v0.13.1/go.mod h1:zaYVJ2xKSKEnTEEbX6uAHabh2d975RJ+0yfkFpRBz5U= -github.com/charmbracelet/x/ansi v0.4.0 h1:NqwHA4B23VwsDn4H3VcNX1W1tOmgnvY1NDx5tOXdnOU= -github.com/charmbracelet/x/ansi v0.4.0/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= +github.com/charmbracelet/lipgloss v1.0.0 h1:O7VkGDvqEdGi93X+DeqsQ7PKHDgtQfF8j8/O2qFMQNg= +github.com/charmbracelet/lipgloss v1.0.0/go.mod h1:U5fy9Z+C38obMs+T+tJqst9VGzlOYGj4ri9reL3qUlo= +github.com/charmbracelet/x/ansi v0.4.5 h1:LqK4vwBNaXw2AyGIICa5/29Sbdq58GbGdFngSexTdRM= +github.com/charmbracelet/x/ansi v0.4.5/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= github.com/charmbracelet/x/exp/golden v0.0.0-20240815200342-61de596daa2b h1:MnAMdlwSltxJyULnrYbkZpp4k58Co7Tah3ciKhSNo0Q= github.com/charmbracelet/x/exp/golden v0.0.0-20240815200342-61de596daa2b/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= -github.com/charmbracelet/x/term v0.2.0 h1:cNB9Ot9q8I711MyZ7myUR5HFWL/lc3OpU8jZ4hwm0x0= -github.com/charmbracelet/x/term v0.2.0/go.mod h1:GVxgxAbjUrmpvIINHIQnJJKpMlHiZ4cktEQCN6GWyF0= +github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= +github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudevents/sdk-go/observability/opentelemetry/v2 v2.15.2 h1:J84sc4/cpw8Px+3plIt1oTULRL1Ag2o1Abed+ZionBc= +github.com/cloudevents/sdk-go/observability/opentelemetry/v2 v2.15.2/go.mod h1:KR1lgiXZYOh6vVqHy12jbj3QSCIYFi2TICtKiNlDLs0= github.com/cloudevents/sdk-go/protocol/nats_jetstream/v2 v2.15.2 h1:XsT8ZjPRk80F81yjG/ndSNISvYjzp4GRZj9+UC09HDQ= github.com/cloudevents/sdk-go/protocol/nats_jetstream/v2 v2.15.2/go.mod h1:ANzjGHwaQIn+u6uQ7ExVbnmQsNpKcath/uXL5q6hXts= github.com/cloudevents/sdk-go/v2 v2.15.2 h1:54+I5xQEnI73RBhWHxbI1XJcqOFOVJN85vb41+8mHUc= @@ -310,6 +322,8 @@ github.com/digitorus/pkcs7 v0.0.0-20230818184609-3a137a874352 h1:ge14PCmCvPjpMQM github.com/digitorus/pkcs7 v0.0.0-20230818184609-3a137a874352/go.mod h1:SKVExuS+vpu2l9IoOc0RwqE7NYnb0JlcFHFnEJkVDzc= github.com/digitorus/timestamp v0.0.0-20231217203849-220c5c2851b7 h1:lxmTCgmHE1GUYL7P0MlNa00M67axePTq+9nBSGddR8I= github.com/digitorus/timestamp v0.0.0-20231217203849-220c5c2851b7/go.mod h1:GvWntX9qiTlOud0WkQ6ewFm0LPy5JUR1Xo0Ngbd1w6Y= +github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= +github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo= @@ -318,8 +332,8 @@ github.com/docker/cli v27.3.1+incompatible h1:qEGdFBF3Xu6SCvCYhc7CzaQTlBmqDuzxPD github.com/docker/cli v27.3.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v27.2.1+incompatible h1:fQdiLfW7VLscyoeYEBz7/J8soYFDZV1u6VW6gJEjNMI= -github.com/docker/docker v27.2.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v27.4.0+incompatible h1:I9z7sQ5qyzO0BfAb9IMOawRkAGxhYsidKiTMcm0DU+A= +github.com/docker/docker v27.4.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.8.2 h1:bX3YxiGzFP5sOXWc3bTPEXdEaZSeVMrFgOr3T+zrFAo= github.com/docker/docker-credential-helpers v0.8.2/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= @@ -332,13 +346,15 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= +github.com/elliotchance/orderedmap v1.7.0 h1:FirjcM/NbcyudJhaIF9MG/RjIh5XHm2xb1SFquZ8k0g= +github.com/elliotchance/orderedmap v1.7.0/go.mod h1:wsDwEaX5jEoyhbs7x93zk2H/qv0zwuhg4inXhDkYqys= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.13.0 h1:HzkeUz1Knt+3bK+8LG1bxOO/jzWZmdxpwC51i202les= -github.com/envoyproxy/go-control-plane v0.13.0/go.mod h1:GRaKG3dwvFoTg4nj7aXdZnvMg4d7nvT/wl9WgVXn3Q8= +github.com/envoyproxy/go-control-plane v0.13.1 h1:vPfJZCkob6yTMEgS+0TwfTUfbHjfy/6vOJ8hUWX/uXE= +github.com/envoyproxy/go-control-plane v0.13.1/go.mod h1:X45hY0mufo6Fd0KW3rqsGvQMw58jvjymeCzBU3mWyHw= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= @@ -350,20 +366,20 @@ github.com/erikvarga/go-rpmdb v0.0.0-20240208180226-b97e041ef9af h1:JXdZ7gz1cike github.com/erikvarga/go-rpmdb v0.0.0-20240208180226-b97e041ef9af/go.mod h1:MiEorPk0IChAoCwpg2FXyqVgbNvOlPWZAYHqqIoDNoY= github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= -github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= -github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fergusstrange/embedded-postgres v1.29.0 h1:Uv8hdhoiaNMuH0w8UuGXDHr60VoAQPFdgx7Qf3bzXJM= -github.com/fergusstrange/embedded-postgres v1.29.0/go.mod h1:t/MLs0h9ukYM6FSt99R7InCHs1nW0ordoVCcnzmpTYw= +github.com/fergusstrange/embedded-postgres v1.30.0 h1:ewv1e6bBlqOIYtgGgRcEnNDpfGlmfPxB8T3PO9tV68Q= +github.com/fergusstrange/embedded-postgres v1.30.0/go.mod h1:w0YvnCgf19o6tskInrOOACtnqfVlOvluz3hlNLY7tRk= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/foxcpp/go-mockdns v1.1.0 h1:jI0rD8M0wuYAxL7r/ynTrCQQq0BVqfB99Vgk7DlmewI= github.com/foxcpp/go-mockdns v1.1.0/go.mod h1:IhLeSFGed3mJIAXPH2aiRQB+kqz7oqu8ld2qVbOu7Wk= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/gabriel-vasile/mimetype v1.4.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc= github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc= github.com/gkampitakis/ciinfo v0.3.0 h1:gWZlOC2+RYYttL0hBqcoQhM7h1qNkVqvRCV1fOvpAv8= @@ -433,8 +449,8 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.22.1 h1:40JcKH+bBNGFczGuoBYgX4I6m/i27HYW8P9FDk5PbgA= -github.com/go-playground/validator/v10 v10.22.1/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-playground/validator/v10 v10.23.0 h1:/PwmTwZhS0dPkav3cdK9kV1FsAmrL8sThn8IHr/sO+o= +github.com/go-playground/validator/v10 v10.23.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -444,8 +460,10 @@ github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIx github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= -github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/goccy/go-yaml v1.13.0 h1:0Wtp0FZLd7Sm8gERmR9S6Iczzb3vItJj7NaHmFg8pTs= +github.com/goccy/go-yaml v1.13.0/go.mod h1:IjYwxUiJDoqpx2RmbdjMUceGHZwYLon3sfOGl5Hi9lc= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= @@ -454,8 +472,8 @@ github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= +github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-migrate/migrate/v4 v4.18.1 h1:JML/k+t4tpHCpQTCAD62Nu43NUFzHY4CV3uAuvHGC+Y= @@ -500,8 +518,8 @@ github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/cel-go v0.21.0 h1:cl6uW/gxN+Hy50tNYvI691+sXxioCnstFzLp2WO4GCI= -github.com/google/cel-go v0.21.0/go.mod h1:rHUlWCcBKgyEk+eV03RPdZUekPp6YcJwV0FxuUksYxc= +github.com/google/cel-go v0.22.1 h1:AfVXx3chM2qwoSbM7Da8g8hX8OVSkBFwX+rz2+PcK40= +github.com/google/cel-go v0.22.1/go.mod h1:BuznPXXfQDpXKWQ9sPW3TzlAJN5zzFe+i9tIs0yC4s8= github.com/google/certificate-transparency-go v1.2.1 h1:4iW/NwzqOqYEEoCBEFP+jPbBXbLqMpq3CifMyOnDUME= github.com/google/certificate-transparency-go v1.2.1/go.mod h1:bvn/ytAccv+I6+DGkqpvSsEdiVGramgaSC6RD3tEmeE= github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI= @@ -532,8 +550,8 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/osv-scalibr v0.1.4-0.20241022131720-b583481e91a8 h1:OpMkZ/GYdzduybIW/PjzPC8zMBYjcIvP1GlvOoPKsg0= -github.com/google/osv-scalibr v0.1.4-0.20241022131720-b583481e91a8/go.mod h1:MbEYB+PKqEGjwMdpcoO5DWpi0+57jYgYcw2jlRy8O9Q= +github.com/google/osv-scalibr v0.1.5 h1:72HA+yhxk/fFUotxJgXIIEpDlYfuAP0BeM4m3PbGDWE= +github.com/google/osv-scalibr v0.1.5/go.mod h1:fvnB14pFjAupxDoCLUgdMg2rHu6v86BgKGQHzgTFrTg= github.com/google/osv-scanner v1.9.0 h1:srb17XR4Q6EVojAPDMQwkBVR5jMx0fGw2DFzTn4IUiI= github.com/google/osv-scanner v1.9.0/go.mod h1:AFmX40ZQOGpkCpqbDAtIjtVP4FMlA0OTWAxRBH1G7/I= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -543,8 +561,8 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM= -github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= @@ -561,8 +579,8 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gT github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= -github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= +github.com/googleapis/gax-go/v2 v2.14.0 h1:f+jMrjBPl+DL9nI4IQzLUxMq7XrAqFYB7hBPqMNIe8o= +github.com/googleapis/gax-go/v2 v2.14.0/go.mod h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= @@ -571,12 +589,14 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= +github.com/groob/plist v0.1.1 h1:JUsmXVPGJ0HqG4Ta1z3HYbO0XwOHsgc0PqahpvgU5Q0= +github.com/groob/plist v0.1.1/go.mod h1:itkABA+w2cw7x5nYUS/pLRef6ludkZKOigbROmCTaFw= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.2.0 h1:kQ0NI7W1B3HwiN5gAYtY+XFItDPbLBwYRxAqbFTyDes= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.2.0/go.mod h1:zrT2dxOAjNFPRGjTUe2Xmb4q4YdUwVvQFV6xiCSf+z0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 h1:VNqngBF40hVlDloBruUehVYC3ArSgIyScOAyMRqBxRg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1/go.mod h1:RBRO7fro65R6tjKzYgLAFo0t1QEXY1Dp+i/bvpRiqiQ= github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw= github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -620,8 +640,8 @@ github.com/in-toto/in-toto-golang v0.9.0 h1:tHny7ac4KgtsfrG6ybU8gVOZux2H8jN05AXJ github.com/in-toto/in-toto-golang v0.9.0/go.mod h1:xsBVrVsHNsB61++S6Dy2vWosKhuA3lUTQd+eF9HdeMo= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/itchyny/gojq v0.12.16 h1:yLfgLxhIr/6sJNVmYfQjTIv0jGctu6/DgDoivmxTr7g= -github.com/itchyny/gojq v0.12.16/go.mod h1:6abHbdC2uB9ogMS38XsErnfqJ94UlngIJGlRAIj4jTM= +github.com/itchyny/gojq v0.12.17 h1:8av8eGduDb5+rvEdaOO+zQUjA04MS0m3Ps8HiD+fceg= +github.com/itchyny/gojq v0.12.17/go.mod h1:WBrEMkgAfAGO1LUcGOckBl5O726KPp+OlkKug0I/FEY= github.com/itchyny/timefmt-go v0.1.6 h1:ia3s54iciXDdzWzwaVKXZPbiXzxxnv1SPGFfM/myJ5Q= github.com/itchyny/timefmt-go v0.1.6/go.mod h1:RRDZYC5s9ErkjQvTvvU7keJjxUYzIISJGxm9/mAERQg= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -640,10 +660,10 @@ github.com/jackc/pgtype v1.14.0 h1:y+xUdabmyMkJLyApYuPj38mW+aAIqCe5uuBB51rH3Vw= github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= github.com/jackc/pgx/v4 v4.18.2 h1:xVpYkNR5pk5bMCZGfClbO962UIqVABcAGt7ha1s/FeU= github.com/jackc/pgx/v4 v4.18.2/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= -github.com/jackc/pgx/v5 v5.7.0 h1:FG6VLIdzvAPhnYqP14sQ2xhFLkiUQHCs6ySqO91kF4g= -github.com/jackc/pgx/v5 v5.7.0/go.mod h1:awP1KNnjylvpxHuHP63gzjhnGkI1iw+PMoIwvoleN/8= -github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= -github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jackc/pgx/v5 v5.7.1 h1:x7SYsPBYDkHDksogeSmZZ5xzThcTgRz++I5E+ePFUcs= +github.com/jackc/pgx/v5 v5.7.1/go.mod h1:e7O26IywZZ+naJtWWos6i6fvWK+29etgITqrqHLfoZA= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww= github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= @@ -656,6 +676,8 @@ github.com/jellydator/ttlcache/v3 v3.3.0 h1:BdoC9cE81qXfrxeb9eoJi9dWrdhSuwXMAnHT github.com/jellydator/ttlcache/v3 v3.3.0/go.mod h1:bj2/e0l4jRnQdrnSTaGTsh4GSXvMjQcy41i7th0GVGw= github.com/jeremija/gosubmit v0.2.7 h1:At0OhGCFGPXyjPYAsCchoBUhE099pcBXmsb4iZqROIc= github.com/jeremija/gosubmit v0.2.7/go.mod h1:Ui+HS073lCFREXBbdfrJzMB57OI/bdxTiLtrDHHhFPI= +github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= +github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmhodges/clock v1.2.0 h1:eq4kys+NI0PLngzaHEe7AmPT90XMGIEySD1JfV1PDIs= @@ -671,8 +693,6 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/karlseguin/ccache/v3 v3.0.5 h1:hFX25+fxzNjsRlREYsoGNa2LoVEw5mPF8wkWq/UnevQ= -github.com/karlseguin/ccache/v3 v3.0.5/go.mod h1:qxC372+Qn+IBj8Pe3KvGjHPj0sWwEF7AeZVhsNPZ6uY= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= @@ -680,6 +700,8 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= +github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -705,8 +727,8 @@ github.com/lestrrat-go/httprc v1.0.6 h1:qgmgIRhpvBqexMJjA/PmwSvhNk679oqD1RbovdCG github.com/lestrrat-go/httprc v1.0.6/go.mod h1:mwwz3JMTPBjHUkkDv/IGJ39aALInZLrhBp0X7KGUZlo= github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI= github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= -github.com/lestrrat-go/jwx/v2 v2.1.1 h1:Y2ltVl8J6izLYFs54BVcpXLv5msSW4o8eXwnzZLI32E= -github.com/lestrrat-go/jwx/v2 v2.1.1/go.mod h1:4LvZg7oxu6Q5VJwn7Mk/UwooNRnTHUpXBj2C4j3HNx0= +github.com/lestrrat-go/jwx/v2 v2.1.3 h1:Ud4lb2QuxRClYAmRleF50KrbKIoM1TddXgBrneT5/Jo= +github.com/lestrrat-go/jwx/v2 v2.1.3/go.mod h1:q6uFgbgZfEmQrfJfrCo90QcQOcXFMfbI/fO0NqRtvZo= github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/letsencrypt/boulder v0.0.0-20241021211548-844334e04aef h1:iMdlQdJbEjIbIH8qWsy8O1l9CGRCk2mLJmrQFqW2XDA= @@ -745,6 +767,8 @@ github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwX github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs= github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ= +github.com/mikefarah/yq/v4 v4.44.6 h1:yuu+sH3KX1R3pQCP/vsDao8uNcuiXcjvC7XtoekCV0g= +github.com/mikefarah/yq/v4 v4.44.6/go.mod h1:sva/xvSlW4mKRtRm9nwIS40A+LqNbl46ezjBHYyFtLo= github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= @@ -798,14 +822,14 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8m github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/natefinch/wrap v0.2.0 h1:IXzc/pw5KqxJv55gV0lSOcKHYuEZPGbQrOOXr/bamRk= github.com/natefinch/wrap v0.2.0/go.mod h1:6gMHlAl12DwYEfKP3TkuykYUfLSEAvHw67itm4/KAS8= -github.com/nats-io/jwt/v2 v2.5.8 h1:uvdSzwWiEGWGXf+0Q+70qv6AQdvcvxrv9hPM0RiPamE= -github.com/nats-io/jwt/v2 v2.5.8/go.mod h1:ZdWS1nZa6WMZfFwwgpEaqBV8EPGVgOTDHN/wTbz0Y5A= -github.com/nats-io/nats-server/v2 v2.10.22 h1:Yt63BGu2c3DdMoBZNcR6pjGQwk/asrKU7VX846ibxDA= -github.com/nats-io/nats-server/v2 v2.10.22/go.mod h1:X/m1ye9NYansUXYFrbcDwUi/blHkrgHh2rgCJaakonk= -github.com/nats-io/nats.go v1.37.0 h1:07rauXbVnnJvv1gfIyghFEo6lUcYRY0WXc3x7x0vUxE= -github.com/nats-io/nats.go v1.37.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= -github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI= -github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= +github.com/nats-io/jwt/v2 v2.7.3 h1:6bNPK+FXgBeAqdj4cYQ0F8ViHRbi7woQLq4W29nUAzE= +github.com/nats-io/jwt/v2 v2.7.3/go.mod h1:GvkcbHhKquj3pkioy5put1wvPxs78UlZ7D/pY+BgZk4= +github.com/nats-io/nats-server/v2 v2.10.24 h1:KcqqQAD0ZZcG4yLxtvSFJY7CYKVYlnlWoAiVZ6i/IY4= +github.com/nats-io/nats-server/v2 v2.10.24/go.mod h1:olvKt8E5ZlnjyqBGbAXtxvSQKsPodISK5Eo/euIta4s= +github.com/nats-io/nats.go v1.38.0 h1:A7P+g7Wjp4/NWqDOOP/K6hfhr54DvdDQUznt5JFg9XA= +github.com/nats-io/nats.go v1.38.0/go.mod h1:IGUM++TwokGnXPs82/wCuiHS02/aKrdYUQkU8If6yjw= +github.com/nats-io/nkeys v0.4.9 h1:qe9Faq2Gxwi6RZnZMXfmGMZkg3afLLOtrU+gDZJ35b0= +github.com/nats-io/nkeys v0.4.9/go.mod h1:jcMqs+FLG+W5YO36OX6wFIFcmpdAns+w1Wm6D3I/evE= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= @@ -822,14 +846,14 @@ github.com/oklog/ulid/v2 v2.1.0 h1:+9lhoxAP56we25tyYETBBY1YLA2SaoLvUFgrP2miPJU= github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= -github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= +github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= +github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/open-feature/go-sdk v1.13.1 h1:RJbS70eyi7Jd3Zm5bFnaahNKNDXn+RAVnctpGu+uPis= github.com/open-feature/go-sdk v1.13.1/go.mod h1:O8r4mhgeRIsjJ0ZBXlnE0BtbT/79W44gQceR7K8KYgo= github.com/open-feature/go-sdk-contrib/providers/go-feature-flag-in-process v0.1.0 h1:EFIT5QBQ/T3lNVLmma69SNQbAWBgAl+EtcH0VfrdM7Y= github.com/open-feature/go-sdk-contrib/providers/go-feature-flag-in-process v0.1.0/go.mod h1:DpptytCB+FbUIoRjTGtSDEA82aojWC4MIxL8GOK26Rs= -github.com/open-policy-agent/opa v0.69.0 h1:s2igLw2Z6IvGWGuXSfugWkVultDMsM9pXiDuMp7ckWw= -github.com/open-policy-agent/opa v0.69.0/go.mod h1:+qyXJGkpEJ6kpB1kGo8JSwHtVXbTdsGdQYPWWNYNj+4= +github.com/open-policy-agent/opa v0.70.0 h1:B3cqCN2iQAyKxK6+GI+N40uqkin+wzIrM7YA60t9x1U= +github.com/open-policy-agent/opa v0.70.0/go.mod h1:Y/nm5NY0BX0BqjBriKUiV81sCl8XOjjvqQG7dXrggtI= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= @@ -838,14 +862,14 @@ github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/selinux v1.11.1 h1:nHFvthhM0qY8/m+vfhJylliSshm8G1jJ2jDMcgULaH8= github.com/opencontainers/selinux v1.11.1/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= -github.com/openfga/api/proto v0.0.0-20240906203051-102620ef2a66 h1:pAYrdyIKxPsMs/nRcTEnS9za2io11g7Rt7ng7HK82hk= -github.com/openfga/api/proto v0.0.0-20240906203051-102620ef2a66/go.mod h1:gil5LBD8tSdFQbUkCQdnXsoeU9kDJdJgbGdHkgJfcd0= +github.com/openfga/api/proto v0.0.0-20241213152732-0bb89b73d655 h1:SNuWYca+fV7EW7O5ZkYR/8sanVP30oqSEjukbCPGE5w= +github.com/openfga/api/proto v0.0.0-20241213152732-0bb89b73d655/go.mod h1:gil5LBD8tSdFQbUkCQdnXsoeU9kDJdJgbGdHkgJfcd0= github.com/openfga/go-sdk v0.6.3 h1:FO3uDYeV+1y844iVvD7MJYKtmIEP1r4mis7kWCaDG2A= github.com/openfga/go-sdk v0.6.3/go.mod h1:zui7pHE3eLAYh2fFmEMrWg9XbxYns2WW5Xr/GEgili4= -github.com/openfga/language/pkg/go v0.2.0-beta.2 h1:PH4AOYSREgkMZSHO+RLOwkCLcg/i1cTxrVJraM6/YT4= -github.com/openfga/language/pkg/go v0.2.0-beta.2/go.mod h1:ll/hN6kS4EE6B/7J/PbZqac9Nuv7ZHpI+Jfh36JLrbs= -github.com/openfga/openfga v1.6.1 h1:I4xlmmaFbi1Z2otdZs22D6kr3O1n4WFQLjFZeJQmEkE= -github.com/openfga/openfga v1.6.1/go.mod h1:nfldf6oWZWKOXKc8NHy7VDWUd3wil8JtXLSh89aARng= +github.com/openfga/language/pkg/go v0.2.0-beta.2.0.20241115164311-10e575c8e47c h1:1y84C0V4NRfPtRi4MqQ7+gnFtYgeBKPIeIAPLdVJ7j4= +github.com/openfga/language/pkg/go v0.2.0-beta.2.0.20241115164311-10e575c8e47c/go.mod h1:12RMe/HuRNyOzS33RQa53jwdcxE2znr8ycXMlVbgQN4= +github.com/openfga/openfga v1.8.2 h1:cbwyMXj7iUUse93Kie1vXX/TkBP8G18na/FiSatPzZo= +github.com/openfga/openfga v1.8.2/go.mod h1:h3vI8Jk7q6NNhfr2H+MJcGphrnGV0lyFwPbEO+D+ssI= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= @@ -864,6 +888,8 @@ github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -873,8 +899,8 @@ github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pressly/goose/v3 v3.22.0 h1:wd/7kNiPTuNAztWun7iaB98DrhulbWPrzMAaw2DEZNw= -github.com/pressly/goose/v3 v3.22.0/go.mod h1:yJM3qwSj2pp7aAaCvso096sguezamNb2OBgxCnh/EYg= +github.com/pressly/goose/v3 v3.23.1 h1:bwjOXvep4HtuiiIqtrXmCkQu0IW9O9JAqA6UQNY9ntk= +github.com/pressly/goose/v3 v3.23.1/go.mod h1:0oK0zcK7cmNqJSVwMIOiUUW0ox2nDIz+UfPMSOaw2zY= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= @@ -885,12 +911,14 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.60.0 h1:+V9PAREWNvJMAuJ1x1BaWl9dewMW4YrHZQbx0sJNllA= -github.com/prometheus/common v0.60.0/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= +github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ= +github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/protobom/protobom v0.5.0 h1:jJYqGpdHq99zwh0/n1SOPl1aickCBZdA8pHS9V/f+XQ= +github.com/protobom/protobom v0.5.0/go.mod h1:HL47tggz7SXYXgNm3WjQQrWB6iOirYnrATsXAEyTUkI= github.com/puzpuzpuz/xsync v1.5.2 h1:yRAP4wqSOZG+/4pxJ08fPTwrfL0IzE/LKQ/cw509qGY= github.com/puzpuzpuz/xsync v1.5.2/go.mod h1:K98BYhX3k1dQ2M63t1YNVDanbwUPmBCAhNmVrrxfiGg= github.com/puzpuzpuz/xsync/v3 v3.4.0 h1:DuVBAdXuGFHv8adVXjWWZ63pJq+NRXOWVXlKDBZ+mJ4= @@ -926,6 +954,8 @@ github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWR github.com/sahilm/fuzzy v0.1.1 h1:ceu5RHF8DGgoi+/dR5PsECjCDH1BE3Fnmpo7aVXOdRA= github.com/sahilm/fuzzy v0.1.1/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 h1:PKK9DyHxif4LZo+uQSgXNqs0jj5+xZwwfKHgph2lxBw= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.1/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= github.com/sassoftware/relic v7.2.1+incompatible h1:Pwyh1F3I0r4clFJXkSI8bOyJINGqpgjJU3DYAZeI05A= github.com/sassoftware/relic v7.2.1+incompatible/go.mod h1:CWfAxv73/iLZ17rbyhIEq3K9hs5w6FpNMdUT//qR+zk= github.com/sassoftware/relic/v7 v7.6.2 h1:rS44Lbv9G9eXsukknS4mSjIAuuX+lMq/FnStgmZlUv4= @@ -940,12 +970,12 @@ github.com/sethvargo/go-retry v0.3.0 h1:EEt31A35QhrcRZtrYFDTBg91cqZVnFL2navjDrah github.com/sethvargo/go-retry v0.3.0/go.mod h1:mNX17F0C/HguQMyMyJxcnU471gOZGxCLyYaFyAZraas= github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI= github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE= -github.com/signalfx/splunk-otel-go/instrumentation/database/sql/splunksql v1.21.0 h1:iAjhwKLJ8YTvJwc8uE2qAnxd8MZ7pUgaao3l5X3JZF4= -github.com/signalfx/splunk-otel-go/instrumentation/database/sql/splunksql v1.21.0/go.mod h1:uijUVI3jYfgjYJHYEAx30JcCcPxTAzMo7qRPxzqoQAk= -github.com/signalfx/splunk-otel-go/instrumentation/github.com/lib/pq/splunkpq v1.21.0 h1:/5wRsSw5KXAcyfYWFZ5YojBsHuAKqJYvLYH4SzH4U4s= -github.com/signalfx/splunk-otel-go/instrumentation/github.com/lib/pq/splunkpq v1.21.0/go.mod h1:8zNL+pc6qJCAQAPRzK2WkOxM5xHSlcE+IdkFoweKKjo= -github.com/signalfx/splunk-otel-go/instrumentation/internal v1.21.0 h1:xIir8gtgl3ZzgOfxh8WKlgPywK87TXEpwKkMsguS4to= -github.com/signalfx/splunk-otel-go/instrumentation/internal v1.21.0/go.mod h1:US/EtChAeR/wziTYoViUJ90gzi1f+ywKEDZT9qSwCpM= +github.com/signalfx/splunk-otel-go/instrumentation/database/sql/splunksql v1.23.0 h1:YWDCD/RjgVYDXchw2M8NMfQvi+qJVlJOBj3QEtmqqbE= +github.com/signalfx/splunk-otel-go/instrumentation/database/sql/splunksql v1.23.0/go.mod h1:tIqvy/8gB/DKqA3S2fkIQW47LvPCGuH8s89sTy2mVf4= +github.com/signalfx/splunk-otel-go/instrumentation/github.com/lib/pq/splunkpq v1.23.0 h1:HcYvUB+yDBBkjtqkUUl26sXMZOGD7ohTajCrRwBeuXE= +github.com/signalfx/splunk-otel-go/instrumentation/github.com/lib/pq/splunkpq v1.23.0/go.mod h1:Q3b56bBZToJwo4hrjBReHvjNMjEt3V8rDJnPuQjXAcM= +github.com/signalfx/splunk-otel-go/instrumentation/internal v1.23.0 h1:+P4X4X1Bf5Gki+jLK5zf+lQCcImHibMbDVTVh5dfoso= +github.com/signalfx/splunk-otel-go/instrumentation/internal v1.23.0/go.mod h1:tcBILkl/rviWlsQQBXF9KUmftLtwEsdtr3YbpsEzk6A= github.com/sigstore/protobuf-specs v0.3.2 h1:nCVARCN+fHjlNCk3ThNXwrZRqIommIeNKWwQvORuRQo= github.com/sigstore/protobuf-specs v0.3.2/go.mod h1:RZ0uOdJR4OB3tLQeAyWoJFbNCBFrPQdcokntde4zRBA= github.com/sigstore/rekor v1.3.6 h1:QvpMMJVWAp69a3CHzdrLelqEqpTM3ByQRt5B5Kspbi8= @@ -995,8 +1025,10 @@ github.com/sqlc-dev/pqtype v0.3.0 h1:b09TewZ3cSnO5+M1Kqq05y0+OjqIptxELaSayg7bmqk github.com/sqlc-dev/pqtype v0.3.0/go.mod h1:oyUjp5981ctiL9UYvj1bVvCKi8OXkCa0u645hce7CAs= github.com/stacklok/frizbee v0.1.4 h1:00v6/2HBmwzNdOyVAP4e1isOeUAIWTlb5eggoNUpHmk= github.com/stacklok/frizbee v0.1.4/go.mod h1:rFA90VkGFYLb7qCiUniAihmkgXfZAj2BnfF6jR8Csro= -github.com/stacklok/trusty-sdk-go v0.2.1 h1:4y0nVAmM3nSi3MCU6AO1rY3Iqdg/cQIqVxqxj+977c8= -github.com/stacklok/trusty-sdk-go v0.2.1/go.mod h1:JjZ0KWyQ5Hbgr9J4vAcKn/uBaWk+WrthWkk7G6HXeMs= +github.com/stacklok/trusty-sdk-go v0.2.3-0.20241121160719-089f44e88687 h1:TIZiO871n9V6sSN+bKsG5SwQ4ZHwGtxcmfcL3siimcY= +github.com/stacklok/trusty-sdk-go v0.2.3-0.20241121160719-089f44e88687/go.mod h1:QR01jLW/yfwcXY38dwDpgeEjVc2MAR1LycH1fXtoSXs= +github.com/std-uritemplate/std-uritemplate/go/v2 v2.0.1 h1:/m2cTZHpqgofDsrwPqsASI6fSNMNhb+9EmUYtHEV2Uk= +github.com/std-uritemplate/std-uritemplate/go/v2 v2.0.1/go.mod h1:Z5KcoM0YLC7INlNhEezeIZ0TZNYf7WSNO0Lvah4DSeQ= github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs= github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -1014,10 +1046,11 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/styrainc/regal v0.28.0 h1:R6uOmxYZVR7DnH2Yk4TzzzuLvOxe77nn2SU5ZzpKzIc= -github.com/styrainc/regal v0.28.0/go.mod h1:qdyQh625znKSWPZHR8snZp3Jlw0VtMC8gtn+DlIGVK4= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/styrainc/regal v0.29.2 h1:pDaYJr7Zx+DIFqz58jyIN1kdlwKIjTrSFKld1a1JKeU= +github.com/styrainc/regal v0.29.2/go.mod h1:fG5nGgkAKR4L0vWTDfNj4mLN7dT8s+RZ2cHYRGvfHXo= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/tchap/go-patricia/v2 v2.3.1 h1:6rQp39lgIYZ+MHmdEq4xzuk1t7OdC35z/xm0BGhTkes= @@ -1030,10 +1063,10 @@ github.com/theupdateframework/go-tuf v0.7.0 h1:CqbQFrWo1ae3/I0UCblSbczevCCbS31Qv github.com/theupdateframework/go-tuf v0.7.0/go.mod h1:uEB7WSY+7ZIugK6R1hiBMBjQftaFzn7ZCDJcp1tCUug= github.com/theupdateframework/go-tuf/v2 v2.0.2 h1:PyNnjV9BJNzN1ZE6BcWK+5JbF+if370jjzO84SS+Ebo= github.com/theupdateframework/go-tuf/v2 v2.0.2/go.mod h1:baB22nBHeHBCeuGZcIlctNq4P61PcOdyARlplg5xmLA= -github.com/thomaspoignant/go-feature-flag v1.37.0 h1:7nfRPExdCkjyadQp/FCMJ8lQyGACScsznC4zrT6sURE= -github.com/thomaspoignant/go-feature-flag v1.37.0/go.mod h1:qINXgvSqfTW7KL8vDAL5HHR251cCX1gXYbQKHau2Eo0= -github.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94= -github.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/thomaspoignant/go-feature-flag v1.40.0 h1:BKNPwA9C1ZI8z34YrPv0Q4AhXFX8nSWXLeDC0/RGfe0= +github.com/thomaspoignant/go-feature-flag v1.40.0/go.mod h1:/R0ehOI15+7inVQvqm8ZCcqVkOFcRtrDqrb0qxRE7HY= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= @@ -1048,11 +1081,8 @@ github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6Kllzaw github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/vbatts/tar-split v0.11.6 h1:4SjTW5+PU11n6fZenf2IPoV8/tz3AaYHMWjf23envGs= github.com/vbatts/tar-split v0.11.6/go.mod h1:dqKNtesIOr2j2Qv3W/cHjnvk9I8+G7oAkFDFN6TCBEI= -github.com/xanzy/go-gitlab v0.112.0 h1:6Z0cqEooCvBMfBIHw+CgO4AKGRV8na/9781xOb0+DKw= -github.com/xanzy/go-gitlab v0.112.0/go.mod h1:wKNKh3GkYDMOsGmnfuX+ITCmDuSDWFO0G+C4AygL9RY= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= @@ -1077,14 +1107,22 @@ github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic= github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yuin/goldmark-emoji v1.0.4 h1:vCwMkPZSNefSUnOW2ZKRUjBSD5Ok3W78IXhGxxAEF90= github.com/yuin/goldmark-emoji v1.0.4/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U= +github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M= +github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= github.com/zalando/go-keyring v0.2.3 h1:v9CUu9phlABObO4LPWycf+zwMG7nlbb3t/B5wa97yms= github.com/zalando/go-keyring v0.2.3/go.mod h1:HL4k+OXQfJUWaMnqyuSOc0drfGPX2b51Du6K+MRgZMk= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= github.com/zitadel/logging v0.6.1 h1:Vyzk1rl9Kq9RCevcpX6ujUaTYFX43aa4LkvV1TvUk+Y= github.com/zitadel/logging v0.6.1/go.mod h1:Y4CyAXHpl3Mig6JOszcV5Rqqsojj+3n7y2F591Mp/ow= -github.com/zitadel/oidc/v3 v3.31.0 h1:XQcTVHTYpSkNxjGccEb6pRfrGJdUhkTgXOIzSqRXdo0= -github.com/zitadel/oidc/v3 v3.31.0/go.mod h1:DyE/XClysRK/ozFaZSqlYamKVnTh4l6Ln25ihSNI03w= +github.com/zitadel/oidc/v3 v3.33.1 h1:e3w9PDV0Mh50/ZiJWtzyT0E4uxJ6RXll+hqVDnqGbTU= +github.com/zitadel/oidc/v3 v3.33.1/go.mod h1:zkoZ1Oq6CweX3BaLrftLEGCs6YK6zDpjjVGZrP10AWU= github.com/zitadel/schema v1.3.0 h1:kQ9W9tvIwZICCKWcMvCEweXET1OcOyGEuFbHs4o5kg0= github.com/zitadel/schema v1.3.0/go.mod h1:NptN6mkBDFvERUCvZHlvWmmME+gmZ44xzwRXwhzsbtc= +gitlab.com/gitlab-org/api/client-go v0.116.0 h1:Dy534gtZPMrnm3fAcmQRMadrcoUyFO4FQ4rXlSAdHAw= +gitlab.com/gitlab-org/api/client-go v0.116.0/go.mod h1:B29OfnZklmaoiR7uHANh9jTyfWEgmXvZLVEnosw2Dx0= go.etcd.io/bbolt v1.3.11 h1:yGEzV1wPz2yVCLsD8ZAiGHhHVlczyC9d1rP43/VCRJ0= go.etcd.io/bbolt v1.3.11/go.mod h1:dksAq7YMXoljX0xu6VF5DMZGbhYYoLUalEiSySYAS4I= go.mongodb.org/mongo-driver v1.17.1 h1:Wic5cJIwJgSpBhe3lx3+/RybR5PiYRMpVFgO7cOHyIM= @@ -1096,34 +1134,36 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/detectors/gcp v1.29.0 h1:TiaiXB4DpGD3sdzNlYQxruQngn5Apwzi1X0DRhuGvDQ= -go.opentelemetry.io/contrib/detectors/gcp v1.29.0/go.mod h1:GW2aWZNwR2ZxDLdv8OyC2G8zkRoQBuURgV7RPQgcPoU= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= -go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= -go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 h1:lUsI2TYsQw2r1IASwoROaCnjdj2cvC2+Jbxvk6nHnWU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0/go.mod h1:2HpZxxQurfGxJlJDblybejHB6RX6pmExPNe517hREw4= -go.opentelemetry.io/otel/exporters/prometheus v0.53.0 h1:QXobPHrwiGLM4ufrY3EOmDPJpo2P90UuFau4CDPJA/I= -go.opentelemetry.io/otel/exporters/prometheus v0.53.0/go.mod h1:WOAXGr3D00CfzmFxtTV1eR0GpoHuPEu+HJT8UWW2SIU= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6BmckTU+9Rxn04m2bD3gD6Mk0OIOCPk= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64= -go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= -go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= -go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= -go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= -go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= -go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= -go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= -go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/contrib/detectors/gcp v1.31.0 h1:G1JQOreVrfhRkner+l4mrGxmfqYCAuy76asTDAo0xsA= +go.opentelemetry.io/contrib/detectors/gcp v1.31.0/go.mod h1:tzQL6E1l+iV44YFTkcAeNQqzXUiekSYP9jjJjXwEd00= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 h1:PS8wXpbyaDJQ2VDHHncMe9Vct0Zn1fEjpsjrLxGJoSc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0/go.mod h1:HDBUsEjOuRC0EzKZ1bSaRGZWUBAzo+MhAcUUORSr4D0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 h1:yd02MEjBdJkG3uabWP9apV+OuWRIXGDuJEUJbOHmCFU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q= +go.opentelemetry.io/otel v1.33.0 h1:/FerN9bax5LoK51X/sI0SVYrjSE0/yUL7DpxW4K3FWw= +go.opentelemetry.io/otel v1.33.0/go.mod h1:SUUkR6csvUQl+yjReHu5uM3EtVV7MBm5FHKRlNx4I8I= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 h1:Vh5HayB/0HHfOQA7Ctx69E/Y/DcQSMPpKANYVMQ7fBA= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0/go.mod h1:cpgtDBaqD/6ok/UG0jT15/uKjAY8mRA53diogHBg3UI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0 h1:5pojmb1U1AogINhN3SurB+zm/nIcusopeBNp42f45QM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0/go.mod h1:57gTHJSE5S1tqg+EKsLPlTWhpHMsWlVmer+LA926XiA= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI= +go.opentelemetry.io/otel/exporters/prometheus v0.55.0 h1:sSPw658Lk2NWAv74lkD3B/RSDb+xRFx46GjkrL3VUZo= +go.opentelemetry.io/otel/exporters/prometheus v0.55.0/go.mod h1:nC00vyCmQixoeaxF6KNyP42II/RHa9UdruK02qBmHvI= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.33.0 h1:W5AWUn/IVe8RFb5pZx1Uh9Laf/4+Qmm4kJL5zPuvR+0= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.33.0/go.mod h1:mzKxJywMNBdEX8TSJais3NnsVZUaJ+bAy6UxPTng2vk= +go.opentelemetry.io/otel/metric v1.33.0 h1:r+JOocAyeRVXD8lZpjdQjzMadVZp2M4WmQ+5WtEnklQ= +go.opentelemetry.io/otel/metric v1.33.0/go.mod h1:L9+Fyctbp6HFTddIxClbQkjtubW6O9QS3Ann/M82u6M= +go.opentelemetry.io/otel/sdk v1.33.0 h1:iax7M131HuAm9QkZotNHEfstof92xM+N8sr3uHXc2IM= +go.opentelemetry.io/otel/sdk v1.33.0/go.mod h1:A1Q5oi7/9XaMlIWzPSxLRWOI8nG3FnzHJNbiENQuihM= +go.opentelemetry.io/otel/sdk/metric v1.33.0 h1:Gs5VK9/WUJhNXZgn8MR6ITatvAmKeIuCtNbsP3JkNqU= +go.opentelemetry.io/otel/sdk/metric v1.33.0/go.mod h1:dL5ykHZmm1B1nVRk9dDjChwDmt81MjVp3gLkQRwKf/Q= +go.opentelemetry.io/otel/trace v1.33.0 h1:cCJuF7LRjUFso9LPnEAHJDB2pqzp+hbO8eu1qqW2d/s= +go.opentelemetry.io/otel/trace v1.33.0/go.mod h1:uIcdVUZMpTAmz0tI1z04GoVSezK37CbGV4fr1f2nBck= +go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg= +go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY= go.step.sm/crypto v0.51.1 h1:ktUg/2hetEMiBAqgz502ktZDGoDoGrcHFg3XpkmkvvA= go.step.sm/crypto v0.51.1/go.mod h1:PdrhttNU/tG9/YsVd4fdlysBN+UV503p0o2irFZQlAw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -1150,8 +1190,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= -golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1186,8 +1226,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= -golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1224,16 +1264,16 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= -golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20220524215830-622c5d57e401/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1246,8 +1286,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1296,15 +1336,15 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= -golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1315,13 +1355,13 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= -golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= +golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1377,6 +1417,8 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1393,8 +1435,8 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.201.0 h1:+7AD9JNM3tREtawRMu8sOjSbb8VYcYXJG/2eEOmfDu0= -google.golang.org/api v0.201.0/go.mod h1:HVY0FCHVs89xIW9fzf/pBvOEm+OolHa86G/txFezyq4= +google.golang.org/api v0.210.0 h1:HMNffZ57OoZCRYSbdWVRoqOa8V8NIHLL0CzdBPLztWk= +google.golang.org/api v0.210.0/go.mod h1:B9XDZGnx2NtyjzVkOVTGrFSAVZgPcbedzKg/gTLwqBs= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1432,12 +1474,12 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 h1:Q3nlH8iSQSRUwOskjbcSMcF2jiYMNiQYZ0c2KEJLKKU= -google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38/go.mod h1:xBI+tzfqGGN2JBeSebfKXFSdBpWVQ7sLW40PTupVRm4= -google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 h1:2oV8dfuIkM1Ti7DwXc0BJfnwr9csz4TDXI9EmiI+Rbw= -google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38/go.mod h1:vuAjtvlwkDKF6L1GQ0SokiRLCGFfeBUXWr/aFFkHACc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 h1:zciRKQ4kBpFgpfC5QQCVtnnNAcLIqweL7plyZRQHVpI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 h1:ToEetK57OidYuqD4Q5w+vfEnPvPpuTwedCNVohYJfNk= +google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc= +google.golang.org/genproto/googleapis/api v0.0.0-20241219192143-6b3ec007d9bb h1:B7GIB7sr443wZ/EAEl7VZjmh1V6qzkt5V+RYcUYtS1U= +google.golang.org/genproto/googleapis/api v0.0.0-20241219192143-6b3ec007d9bb/go.mod h1:E5//3O5ZIG2l71Xnt+P/CYUY8Bxs8E7WMoZ9tlcMbAY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241219192143-6b3ec007d9bb h1:3oy2tynMOP1QbTC0MsNNAV+Se8M2Bd0A5+x1QHyw+pI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241219192143-6b3ec007d9bb/go.mod h1:lcTa1sDdWEIHMWlITnIczmw5w60CF9ffkb8Z+DVmmjA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1451,10 +1493,8 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= -google.golang.org/grpc/stats/opentelemetry v0.0.0-20240907200651-3ffb98b2c93a h1:UIpYSuWdWHSzjwcAFRLjKcPXFZVVLXGEM23W+NWqipw= -google.golang.org/grpc/stats/opentelemetry v0.0.0-20240907200651-3ffb98b2c93a/go.mod h1:9i1T9n4ZinTUZGgzENMi8MDDgbGC5mqTS75JAv6xN3A= +google.golang.org/grpc v1.69.2 h1:U3S9QEtbXC0bYNvRtcoklF3xGtLViumSYxWykJS+7AU= +google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1467,8 +1507,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk= +google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1480,6 +1520,8 @@ gopkg.in/h2non/gock.v1 v1.1.2 h1:jBbHXgGBK/AoPVfJh5x4r/WxIrElvbLel8TCZkkZJoY= gopkg.in/h2non/gock.v1 v1.1.2/go.mod h1:n7UGz/ckNChHiK05rDoiC4MYSunEC/lyaUm2WWaDva0= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 h1:6D+BvnJ/j6e222UW8s2qTSe3wGBtvo0MbVQG/c5k8RE= +gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473/go.mod h1:N1eN2tsCx0Ydtgjl4cqmbRCsY4/+z4cYDeqwZTk6zog= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1500,14 +1542,14 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/apimachinery v0.31.2 h1:i4vUt2hPK56W6mlT7Ry+AO8eEsyxMD1U44NR22CLTYw= -k8s.io/apimachinery v0.31.2/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= -k8s.io/client-go v0.31.2 h1:Y2F4dxU5d3AQj+ybwSMqQnpZH9F30//1ObxOKlTI9yc= -k8s.io/client-go v0.31.2/go.mod h1:NPa74jSVR/+eez2dFsEIHNa+3o09vtNaWwWwb1qSxSs= +k8s.io/apimachinery v0.32.0 h1:cFSE7N3rmEEtv4ei5X6DaJPHHX0C+upp+v5lVPiEwpg= +k8s.io/apimachinery v0.32.0/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +k8s.io/client-go v0.32.0 h1:DimtMcnN/JIKZcrSrstiwvvZvLjG0aSxy8PxN8IChp8= +k8s.io/client-go v0.32.0/go.mod h1:boDWvdM1Drk4NJj/VddSLnx59X3OPgwrOo0vGbtq9+8= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/utils v0.0.0-20240921022957-49e7df575cb6 h1:MDF6h2H/h4tbzmtIKTuctcwZmY0tY9mD9fNT47QO6HI= -k8s.io/utils v0.0.0-20240921022957-49e7df575cb6/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ= modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ= modernc.org/ccgo/v4 v4.19.2 h1:lwQZgvboKD0jBwdaeVCTouxhxAyN6iawF3STraAal8Y= @@ -1528,8 +1570,8 @@ modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= -modernc.org/sqlite v1.32.0 h1:6BM4uGza7bWypsw4fdLRsLxut6bHe4c58VeqjRgST8s= -modernc.org/sqlite v1.32.0/go.mod h1:UqoylwmTb9F+IqXERT8bW9zzOWN8qwAIcLdzeBZs4hA= +modernc.org/sqlite v1.34.2 h1:J9n76TPsfYYkFkZ9Uy1QphILYifiVEwwOT7yP5b++2Y= +modernc.org/sqlite v1.34.2/go.mod h1:dnR723UrTtjKpoHCAMN0Q/gZ9MT4r+iRvIBb9umWFkU= modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= diff --git a/internal/api/api.go b/internal/api/api.go new file mode 100644 index 0000000000..ca13cdb0cf --- /dev/null +++ b/internal/api/api.go @@ -0,0 +1,92 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package api package api provides a gRPC interceptor that validates incoming requests. +package api + +import ( + "context" + "errors" + "fmt" + "strings" + + "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + "github.com/bufbuild/protovalidate-go" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" + + "github.com/mindersec/minder/internal/util" +) + +// ProtoValidationInterceptor is a gRPC interceptor that validates incoming requests. +func ProtoValidationInterceptor(validator *protovalidate.Validator) grpc.UnaryServerInterceptor { + return func(ctx context.Context, req interface{}, _ *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { + // Assert that req implements proto.Message + msg, ok := req.(proto.Message) + if !ok { + // Handle the error: req is not a proto.Message + return nil, status.Errorf(codes.Internal, "Request does not implement proto.Message") + } + + // Validate the incoming request + if err := validator.Validate(msg); err != nil { + var validationErr *protovalidate.ValidationError + if errors.As(err, &validationErr) { + // Convert ValidationError to validate.Violations + violations := validationErr.ToProto() + // Convert violations to a util.NiceStatus message and return it + return nil, util.UserVisibleError(codes.InvalidArgument, "Validation failed:\n%s", formatViolations(violations)) + } + // Default to generic validation error + return nil, status.Errorf(codes.InvalidArgument, "Validation failed: %v", err) + } + // Proceed to the handler + return handler(ctx, req) + } +} + +// NewValidator creates a new validator. +func NewValidator() (*protovalidate.Validator, error) { + options := []protovalidate.ValidatorOption{ + protovalidate.WithUTC(true), + // TODO: add protovalidate.WithDescriptors() in the future + } + return protovalidate.New(options...) +} + +// formatViolations is a helper function to format violations +func formatViolations(violations *validate.Violations) string { + var res []string + for _, v := range violations.Violations { + res = append(res, fmt.Sprintf("- Field '%s': %s", getFullPath(v.Field), *v.Message)) + } + return strings.Join(res, "\n") +} + +func getFullPath(field *validate.FieldPath) string { + var pathElements []string + for _, element := range field.GetElements() { + if element.GetFieldName() != "" { + pathElements = append(pathElements, element.GetFieldName()) + } else if element.GetFieldNumber() != 0 { + pathElements = append(pathElements, fmt.Sprintf("%d", element.GetFieldNumber())) + } + if element.GetSubscript() != nil { + switch subscript := element.GetSubscript().(type) { + case *validate.FieldPathElement_Index: + pathElements[len(pathElements)-1] = fmt.Sprintf("%s[%d]", pathElements[len(pathElements)-1], subscript.Index) + case *validate.FieldPathElement_BoolKey: + pathElements[len(pathElements)-1] = fmt.Sprintf("%s[%t]", pathElements[len(pathElements)-1], subscript.BoolKey) + case *validate.FieldPathElement_IntKey: + pathElements[len(pathElements)-1] = fmt.Sprintf("%s[%d]", pathElements[len(pathElements)-1], subscript.IntKey) + case *validate.FieldPathElement_UintKey: + pathElements[len(pathElements)-1] = fmt.Sprintf("%s[%d]", pathElements[len(pathElements)-1], subscript.UintKey) + case *validate.FieldPathElement_StringKey: + pathElements[len(pathElements)-1] = fmt.Sprintf("%s[%s]", pathElements[len(pathElements)-1], subscript.StringKey) + } + } + } + return strings.Join(pathElements, ".") +} diff --git a/internal/api/api_test.go b/internal/api/api_test.go new file mode 100644 index 0000000000..e124b6d566 --- /dev/null +++ b/internal/api/api_test.go @@ -0,0 +1,95 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package api + +import ( + "context" + "testing" + + "github.com/google/uuid" + "github.com/stretchr/testify/require" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" + + "github.com/mindersec/minder/internal/util/ptr" + v1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" +) + +func TestProtoValidationInterceptor(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + req proto.Message + errMsg string + errCode codes.Code + }{ + { + name: "valid request", + req: &v1.GetProviderRequest{ + Context: &v1.Context{ + Project: ptr.Ptr(uuid.New().String()), + }, + Name: "valid-name", + }, + }, + { + name: "invalid request", + req: &v1.GetProviderRequest{ + Context: &v1.Context{ + Project: ptr.Ptr(uuid.New().String()), + }, + Name: "-?invalid", + }, + errMsg: "Validation failed:\n- Field 'name': value does not match regex pattern", + errCode: codes.InvalidArgument, + }, + { + name: "invalid request with nested field", + req: &v1.ListEvaluationResultsRequest{ + Context: &v1.Context{ + Project: ptr.Ptr(uuid.New().String()), + }, + Entity: []*v1.EntityTypedId{ + { + Id: "invalid-id", + }, + }, + }, + errMsg: "Validation failed:\n- Field 'entity[0].id': value must be a valid UUID", + errCode: codes.InvalidArgument, + }, + } + + validator, err := NewValidator() + require.NoError(t, err) + + interceptor := ProtoValidationInterceptor(validator) + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + handler := func(_ context.Context, _ interface{}) (interface{}, error) { + return "response", nil + } + resp, err := interceptor(context.Background(), tt.req, nil, handler) + if tt.errMsg != "" { + require.Error(t, err) + require.Nil(t, resp) + st, ok := status.FromError(err) + require.True(t, ok) + require.Equal(t, tt.errCode, st.Code()) + require.Contains(t, st.Message(), tt.errMsg) + return + } + + require.NoError(t, err) + require.Equal(t, "response", resp) + }) + } +} diff --git a/internal/auth/keycloak/client/client.gen.go b/internal/auth/keycloak/client/client.gen.go index fb39351520..a5eb496059 100644 --- a/internal/auth/keycloak/client/client.gen.go +++ b/internal/auth/keycloak/client/client.gen.go @@ -1,6 +1,6 @@ // Package client provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/deepmap/oapi-codegen/v2 version v2.2.0 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.4.1 DO NOT EDIT. package client import ( diff --git a/internal/authz/model/minder.fga b/internal/authz/model/minder.fga index 6cdc639212..461bf7344e 100644 --- a/internal/authz/model/minder.fga +++ b/internal/authz/model/minder.fga @@ -84,3 +84,8 @@ type project define profile_status_get: viewer define entity_reconciliation_task_create: editor + + define data_source_get: viewer + define data_source_create: admin + define data_source_update: admin + define data_source_delete: admin diff --git a/internal/authz/model/minder.generated.json b/internal/authz/model/minder.generated.json index b0d921957e..b523566968 100644 --- a/internal/authz/model/minder.generated.json +++ b/internal/authz/model/minder.generated.json @@ -1 +1 @@ -{"schema_version":"1.1","type_definitions":[{"type":"user"},{"metadata":{"relations":{"admin":{"directly_related_user_types":[{"type":"user"},{"relation":"member","type":"group"}]},"member":{"directly_related_user_types":[{"type":"user"},{"relation":"member","type":"group"}]}}},"relations":{"admin":{"this":{}},"member":{"union":{"child":[{"this":{}},{"computedUserset":{"relation":"admin"}}]}}},"type":"group"},{"metadata":{"relations":{"admin":{"directly_related_user_types":[{"type":"user"},{"relation":"member","type":"group"}]},"artifact_create":{},"artifact_delete":{},"artifact_get":{},"artifact_update":{},"create":{},"delete":{},"editor":{"directly_related_user_types":[{"type":"user"},{"relation":"member","type":"group"}]},"entity_reconcile":{},"entity_reconciliation_task_create":{},"get":{},"parent":{"directly_related_user_types":[{"type":"project"}]},"permissions_manager":{"directly_related_user_types":[{"type":"user"},{"relation":"member","type":"group"}]},"policy_writer":{"directly_related_user_types":[{"type":"user"},{"relation":"member","type":"group"}]},"pr_create":{},"pr_delete":{},"pr_get":{},"pr_update":{},"profile_create":{},"profile_delete":{},"profile_get":{},"profile_status_get":{},"profile_update":{},"provider_create":{},"provider_delete":{},"provider_get":{},"provider_update":{},"remote_repo_get":{},"repo_create":{},"repo_delete":{},"repo_get":{},"repo_update":{},"role_assignment_create":{},"role_assignment_list":{},"role_assignment_remove":{},"role_assignment_update":{},"role_list":{},"rule_type_create":{},"rule_type_delete":{},"rule_type_get":{},"rule_type_update":{},"update":{},"viewer":{"directly_related_user_types":[{"type":"user"},{"relation":"member","type":"group"}]}}},"relations":{"admin":{"union":{"child":[{"this":{}},{"tupleToUserset":{"computedUserset":{"relation":"admin"},"tupleset":{"relation":"parent"}}}]}},"artifact_create":{"computedUserset":{"relation":"editor"}},"artifact_delete":{"computedUserset":{"relation":"editor"}},"artifact_get":{"computedUserset":{"relation":"viewer"}},"artifact_update":{"computedUserset":{"relation":"editor"}},"create":{"computedUserset":{"relation":"admin"}},"delete":{"computedUserset":{"relation":"admin"}},"editor":{"union":{"child":[{"this":{}},{"computedUserset":{"relation":"admin"}},{"tupleToUserset":{"computedUserset":{"relation":"editor"},"tupleset":{"relation":"parent"}}}]}},"entity_reconcile":{"computedUserset":{"relation":"editor"}},"entity_reconciliation_task_create":{"computedUserset":{"relation":"editor"}},"get":{"computedUserset":{"relation":"viewer"}},"parent":{"this":{}},"permissions_manager":{"union":{"child":[{"this":{}},{"tupleToUserset":{"computedUserset":{"relation":"permissions_manager"},"tupleset":{"relation":"parent"}}}]}},"policy_writer":{"union":{"child":[{"this":{}},{"tupleToUserset":{"computedUserset":{"relation":"policy_writer"},"tupleset":{"relation":"parent"}}}]}},"pr_create":{"computedUserset":{"relation":"editor"}},"pr_delete":{"computedUserset":{"relation":"editor"}},"pr_get":{"computedUserset":{"relation":"viewer"}},"pr_update":{"computedUserset":{"relation":"editor"}},"profile_create":{"union":{"child":[{"computedUserset":{"relation":"editor"}},{"computedUserset":{"relation":"policy_writer"}}]}},"profile_delete":{"union":{"child":[{"computedUserset":{"relation":"editor"}},{"computedUserset":{"relation":"policy_writer"}}]}},"profile_get":{"computedUserset":{"relation":"viewer"}},"profile_status_get":{"computedUserset":{"relation":"viewer"}},"profile_update":{"union":{"child":[{"computedUserset":{"relation":"editor"}},{"computedUserset":{"relation":"policy_writer"}}]}},"provider_create":{"computedUserset":{"relation":"admin"}},"provider_delete":{"computedUserset":{"relation":"admin"}},"provider_get":{"computedUserset":{"relation":"viewer"}},"provider_update":{"computedUserset":{"relation":"admin"}},"remote_repo_get":{"computedUserset":{"relation":"editor"}},"repo_create":{"computedUserset":{"relation":"editor"}},"repo_delete":{"computedUserset":{"relation":"editor"}},"repo_get":{"computedUserset":{"relation":"viewer"}},"repo_update":{"computedUserset":{"relation":"editor"}},"role_assignment_create":{"union":{"child":[{"computedUserset":{"relation":"admin"}},{"computedUserset":{"relation":"permissions_manager"}}]}},"role_assignment_list":{"union":{"child":[{"computedUserset":{"relation":"admin"}},{"computedUserset":{"relation":"permissions_manager"}}]}},"role_assignment_remove":{"union":{"child":[{"computedUserset":{"relation":"admin"}},{"computedUserset":{"relation":"permissions_manager"}}]}},"role_assignment_update":{"union":{"child":[{"computedUserset":{"relation":"admin"}},{"computedUserset":{"relation":"permissions_manager"}}]}},"role_list":{"union":{"child":[{"computedUserset":{"relation":"admin"}},{"computedUserset":{"relation":"permissions_manager"}}]}},"rule_type_create":{"union":{"child":[{"computedUserset":{"relation":"editor"}},{"computedUserset":{"relation":"policy_writer"}}]}},"rule_type_delete":{"union":{"child":[{"computedUserset":{"relation":"editor"}},{"computedUserset":{"relation":"policy_writer"}}]}},"rule_type_get":{"computedUserset":{"relation":"viewer"}},"rule_type_update":{"union":{"child":[{"computedUserset":{"relation":"editor"}},{"computedUserset":{"relation":"policy_writer"}}]}},"update":{"computedUserset":{"relation":"admin"}},"viewer":{"union":{"child":[{"this":{}},{"computedUserset":{"relation":"editor"}},{"tupleToUserset":{"computedUserset":{"relation":"viewer"},"tupleset":{"relation":"parent"}}}]}}},"type":"project"}]} +{"schema_version":"1.1","type_definitions":[{"type":"user"},{"metadata":{"relations":{"admin":{"directly_related_user_types":[{"type":"user"},{"relation":"member","type":"group"}]},"member":{"directly_related_user_types":[{"type":"user"},{"relation":"member","type":"group"}]}}},"relations":{"admin":{"this":{}},"member":{"union":{"child":[{"this":{}},{"computedUserset":{"relation":"admin"}}]}}},"type":"group"},{"metadata":{"relations":{"admin":{"directly_related_user_types":[{"type":"user"},{"relation":"member","type":"group"}]},"artifact_create":{},"artifact_delete":{},"artifact_get":{},"artifact_update":{},"create":{},"data_source_create":{},"data_source_delete":{},"data_source_get":{},"data_source_update":{},"delete":{},"editor":{"directly_related_user_types":[{"type":"user"},{"relation":"member","type":"group"}]},"entity_reconcile":{},"entity_reconciliation_task_create":{},"get":{},"parent":{"directly_related_user_types":[{"type":"project"}]},"permissions_manager":{"directly_related_user_types":[{"type":"user"},{"relation":"member","type":"group"}]},"policy_writer":{"directly_related_user_types":[{"type":"user"},{"relation":"member","type":"group"}]},"pr_create":{},"pr_delete":{},"pr_get":{},"pr_update":{},"profile_create":{},"profile_delete":{},"profile_get":{},"profile_status_get":{},"profile_update":{},"provider_create":{},"provider_delete":{},"provider_get":{},"provider_update":{},"remote_repo_get":{},"repo_create":{},"repo_delete":{},"repo_get":{},"repo_update":{},"role_assignment_create":{},"role_assignment_list":{},"role_assignment_remove":{},"role_assignment_update":{},"role_list":{},"rule_type_create":{},"rule_type_delete":{},"rule_type_get":{},"rule_type_update":{},"update":{},"viewer":{"directly_related_user_types":[{"type":"user"},{"relation":"member","type":"group"}]}}},"relations":{"admin":{"union":{"child":[{"this":{}},{"tupleToUserset":{"computedUserset":{"relation":"admin"},"tupleset":{"relation":"parent"}}}]}},"artifact_create":{"computedUserset":{"relation":"editor"}},"artifact_delete":{"computedUserset":{"relation":"editor"}},"artifact_get":{"computedUserset":{"relation":"viewer"}},"artifact_update":{"computedUserset":{"relation":"editor"}},"create":{"computedUserset":{"relation":"admin"}},"data_source_create":{"computedUserset":{"relation":"admin"}},"data_source_delete":{"computedUserset":{"relation":"admin"}},"data_source_get":{"computedUserset":{"relation":"viewer"}},"data_source_update":{"computedUserset":{"relation":"admin"}},"delete":{"computedUserset":{"relation":"admin"}},"editor":{"union":{"child":[{"this":{}},{"computedUserset":{"relation":"admin"}},{"tupleToUserset":{"computedUserset":{"relation":"editor"},"tupleset":{"relation":"parent"}}}]}},"entity_reconcile":{"computedUserset":{"relation":"editor"}},"entity_reconciliation_task_create":{"computedUserset":{"relation":"editor"}},"get":{"computedUserset":{"relation":"viewer"}},"parent":{"this":{}},"permissions_manager":{"union":{"child":[{"this":{}},{"tupleToUserset":{"computedUserset":{"relation":"permissions_manager"},"tupleset":{"relation":"parent"}}}]}},"policy_writer":{"union":{"child":[{"this":{}},{"tupleToUserset":{"computedUserset":{"relation":"policy_writer"},"tupleset":{"relation":"parent"}}}]}},"pr_create":{"computedUserset":{"relation":"editor"}},"pr_delete":{"computedUserset":{"relation":"editor"}},"pr_get":{"computedUserset":{"relation":"viewer"}},"pr_update":{"computedUserset":{"relation":"editor"}},"profile_create":{"union":{"child":[{"computedUserset":{"relation":"editor"}},{"computedUserset":{"relation":"policy_writer"}}]}},"profile_delete":{"union":{"child":[{"computedUserset":{"relation":"editor"}},{"computedUserset":{"relation":"policy_writer"}}]}},"profile_get":{"computedUserset":{"relation":"viewer"}},"profile_status_get":{"computedUserset":{"relation":"viewer"}},"profile_update":{"union":{"child":[{"computedUserset":{"relation":"editor"}},{"computedUserset":{"relation":"policy_writer"}}]}},"provider_create":{"computedUserset":{"relation":"admin"}},"provider_delete":{"computedUserset":{"relation":"admin"}},"provider_get":{"computedUserset":{"relation":"viewer"}},"provider_update":{"computedUserset":{"relation":"admin"}},"remote_repo_get":{"computedUserset":{"relation":"editor"}},"repo_create":{"computedUserset":{"relation":"editor"}},"repo_delete":{"computedUserset":{"relation":"editor"}},"repo_get":{"computedUserset":{"relation":"viewer"}},"repo_update":{"computedUserset":{"relation":"editor"}},"role_assignment_create":{"union":{"child":[{"computedUserset":{"relation":"admin"}},{"computedUserset":{"relation":"permissions_manager"}}]}},"role_assignment_list":{"union":{"child":[{"computedUserset":{"relation":"admin"}},{"computedUserset":{"relation":"permissions_manager"}}]}},"role_assignment_remove":{"union":{"child":[{"computedUserset":{"relation":"admin"}},{"computedUserset":{"relation":"permissions_manager"}}]}},"role_assignment_update":{"union":{"child":[{"computedUserset":{"relation":"admin"}},{"computedUserset":{"relation":"permissions_manager"}}]}},"role_list":{"union":{"child":[{"computedUserset":{"relation":"admin"}},{"computedUserset":{"relation":"permissions_manager"}}]}},"rule_type_create":{"union":{"child":[{"computedUserset":{"relation":"editor"}},{"computedUserset":{"relation":"policy_writer"}}]}},"rule_type_delete":{"union":{"child":[{"computedUserset":{"relation":"editor"}},{"computedUserset":{"relation":"policy_writer"}}]}},"rule_type_get":{"computedUserset":{"relation":"viewer"}},"rule_type_update":{"union":{"child":[{"computedUserset":{"relation":"editor"}},{"computedUserset":{"relation":"policy_writer"}}]}},"update":{"computedUserset":{"relation":"admin"}},"viewer":{"union":{"child":[{"this":{}},{"computedUserset":{"relation":"editor"}},{"tupleToUserset":{"computedUserset":{"relation":"viewer"},"tupleset":{"relation":"parent"}}}]}}},"type":"project"}]} diff --git a/internal/controlplane/common.go b/internal/controlplane/common.go index 1c479ee400..9127c420e3 100644 --- a/internal/controlplane/common.go +++ b/internal/controlplane/common.go @@ -47,7 +47,7 @@ type HasProtoContextV2Compat interface { // HasProtoContextV2 is an interface that can be implemented by a request type HasProtoContextV2 interface { - GetContextV2() *pb.ContextV2 + GetContext() *pb.ContextV2 } // HasProtoContext is an interface that can be implemented by a request @@ -74,13 +74,13 @@ func getProjectFromContextV2Compat(accessor HasProtoContextV2Compat) (uuid.UUID, } func getProjectFromContextV2(accessor HasProtoContextV2) (uuid.UUID, error) { - if accessor.GetContextV2() == nil { + if accessor.GetContext() == nil { return uuid.Nil, util.UserVisibleError(codes.InvalidArgument, "context cannot be nil") } // First check if the context is V2 - if accessor.GetContextV2() != nil && accessor.GetContextV2().GetProjectId() != "" { - return parseProject(accessor.GetContextV2().GetProjectId()) + if accessor.GetContext() != nil && accessor.GetContext().GetProjectId() != "" { + return parseProject(accessor.GetContext().GetProjectId()) } return uuid.Nil, ErrNoProjectInContext diff --git a/internal/controlplane/handlers_authz.go b/internal/controlplane/handlers_authz.go index 8bf3a532f3..b44c946e82 100644 --- a/internal/controlplane/handlers_authz.go +++ b/internal/controlplane/handlers_authz.go @@ -155,7 +155,7 @@ func getProviderFromContext(req any) string { } return req.GetContext().GetProvider() case HasProtoContextV2: - return req.GetContextV2().GetProvider() + return req.GetContext().GetProvider() case HasProtoContext: return req.GetContext().GetProvider() default: diff --git a/internal/controlplane/handlers_datasource.go b/internal/controlplane/handlers_datasource.go new file mode 100644 index 0000000000..5a1837abf0 --- /dev/null +++ b/internal/controlplane/handlers_datasource.go @@ -0,0 +1,280 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package controlplane + +import ( + "context" + + "github.com/google/uuid" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "github.com/mindersec/minder/internal/datasources/service" + "github.com/mindersec/minder/internal/engine/engcontext" + "github.com/mindersec/minder/internal/flags" + minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" +) + +// CreateDataSource creates a data source +func (s *Server) CreateDataSource(ctx context.Context, + in *minderv1.CreateDataSourceRequest) (*minderv1.CreateDataSourceResponse, error) { + + // Check if the DataSources feature is enabled + if !flags.Bool(ctx, s.featureFlags, flags.DataSources) { + return nil, status.Errorf(codes.Unavailable, "DataSources feature is disabled") + } + + // Get the data source from the request + dsReq := in.GetDataSource() + if dsReq == nil { + return nil, status.Errorf(codes.InvalidArgument, "missing data source") + } + + if err := s.forceDataSourceProject(ctx, dsReq); err != nil { + return nil, err + } + + // Process the request + ret, err := s.dataSourcesService.Create(ctx, dsReq, nil) + if err != nil { + return nil, err + } + + // Return the response + return &minderv1.CreateDataSourceResponse{DataSource: ret}, nil +} + +// GetDataSourceById retrieves a data source by ID +func (s *Server) GetDataSourceById(ctx context.Context, + in *minderv1.GetDataSourceByIdRequest) (*minderv1.GetDataSourceByIdResponse, error) { + + // Check if the DataSources feature is enabled + if !flags.Bool(ctx, s.featureFlags, flags.DataSources) { + return nil, status.Errorf(codes.Unavailable, "DataSources feature is disabled") + } + + // Get the data source ID from the request + dsIDstr := in.GetId() + if dsIDstr == "" { + return nil, status.Errorf(codes.InvalidArgument, "missing data source ID") + } + + // Parse the data source ID + dsID, err := uuid.Parse(dsIDstr) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "invalid data source ID: %v", err) + } + + // Get the project ID from the request context + entityCtx := engcontext.EntityFromContext(ctx) + + // Ensure the project is valid and exist in the db + err = entityCtx.ValidateProject(ctx, s.store) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "error in entity context: %v", err) + } + + // Get the data source by ID + ds, err := s.dataSourcesService.GetByID(ctx, dsID, entityCtx.Project.ID, &service.ReadOptions{}) + if err != nil { + return nil, err + } + + // Return the response + return &minderv1.GetDataSourceByIdResponse{DataSource: ds}, nil +} + +// GetDataSourceByName retrieves a data source by name +func (s *Server) GetDataSourceByName(ctx context.Context, + in *minderv1.GetDataSourceByNameRequest) (*minderv1.GetDataSourceByNameResponse, error) { + + // Check if the DataSources feature is enabled + if !flags.Bool(ctx, s.featureFlags, flags.DataSources) { + return nil, status.Errorf(codes.Unavailable, "DataSources feature is disabled") + } + + // Get the data source name from the request + dsName := in.GetName() + if dsName == "" { + return nil, status.Errorf(codes.InvalidArgument, "missing data source name") + } + + // Get the project ID from the request context + entityCtx := engcontext.EntityFromContext(ctx) + + // Ensure the project is valid and exist in the db + err := entityCtx.ValidateProject(ctx, s.store) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "error in entity context: %v", err) + } + + // Get the data source by name + ds, err := s.dataSourcesService.GetByName(ctx, dsName, entityCtx.Project.ID, &service.ReadOptions{}) + if err != nil { + return nil, err + } + + // Return the response + return &minderv1.GetDataSourceByNameResponse{DataSource: ds}, nil +} + +// ListDataSources lists all data sources +func (s *Server) ListDataSources(ctx context.Context, + _ *minderv1.ListDataSourcesRequest) (*minderv1.ListDataSourcesResponse, error) { + + // Check if the DataSources feature is enabled + if !flags.Bool(ctx, s.featureFlags, flags.DataSources) { + return nil, status.Errorf(codes.Unavailable, "DataSources feature is disabled") + } + + // Get the project ID from the request context + entityCtx := engcontext.EntityFromContext(ctx) + + // Ensure the project is valid and exist in the db + err := entityCtx.ValidateProject(ctx, s.store) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "error in entity context: %v", err) + } + + // Get all data sources + ret, err := s.dataSourcesService.List(ctx, entityCtx.Project.ID, &service.ReadOptions{}) + if err != nil { + return nil, err + } + + // Return the response + return &minderv1.ListDataSourcesResponse{DataSources: ret}, nil +} + +// UpdateDataSource updates a data source +func (s *Server) UpdateDataSource(ctx context.Context, + in *minderv1.UpdateDataSourceRequest) (*minderv1.UpdateDataSourceResponse, error) { + + // Check if the DataSources feature is enabled + if !flags.Bool(ctx, s.featureFlags, flags.DataSources) { + return nil, status.Errorf(codes.Unavailable, "DataSources feature is disabled") + } + + // Get the data source from the request + dsReq := in.GetDataSource() + if dsReq == nil { + return nil, status.Errorf(codes.InvalidArgument, "missing data source") + } + + if err := s.forceDataSourceProject(ctx, dsReq); err != nil { + return nil, err + } + + // Process the request + ret, err := s.dataSourcesService.Update(ctx, dsReq, nil) + if err != nil { + return nil, err + } + + // Return the response + return &minderv1.UpdateDataSourceResponse{DataSource: ret}, nil +} + +// DeleteDataSourceById deletes a data source by ID +func (s *Server) DeleteDataSourceById(ctx context.Context, + in *minderv1.DeleteDataSourceByIdRequest) (*minderv1.DeleteDataSourceByIdResponse, error) { + + // Check if the DataSources feature is enabled + if !flags.Bool(ctx, s.featureFlags, flags.DataSources) { + return nil, status.Errorf(codes.Unavailable, "DataSources feature is disabled") + } + + // Get the data source ID from the request + dsIDstr := in.GetId() + if dsIDstr == "" { + return nil, status.Errorf(codes.InvalidArgument, "missing data source ID") + } + + // Parse the data source ID + dsID, err := uuid.Parse(dsIDstr) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "invalid data source ID: %v", err) + } + + // Get the project ID from the request context + entityCtx := engcontext.EntityFromContext(ctx) + + // Ensure the project is valid and exist in the db + err = entityCtx.ValidateProject(ctx, s.store) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "error in entity context: %v", err) + } + + // Delete the data source by ID + err = s.dataSourcesService.Delete(ctx, dsID, entityCtx.Project.ID, nil) + if err != nil { + return nil, err + } + + // Return the response + return &minderv1.DeleteDataSourceByIdResponse{Id: dsIDstr}, nil +} + +// DeleteDataSourceByName deletes a data source by name +func (s *Server) DeleteDataSourceByName(ctx context.Context, + in *minderv1.DeleteDataSourceByNameRequest) (*minderv1.DeleteDataSourceByNameResponse, error) { + + // Check if the DataSources feature is enabled + if !flags.Bool(ctx, s.featureFlags, flags.DataSources) { + return nil, status.Errorf(codes.Unavailable, "DataSources feature is disabled") + } + + // Get the data source name from the request + dsName := in.GetName() + if dsName == "" { + return nil, status.Errorf(codes.InvalidArgument, "missing data source name") + } + + // Get the project ID from the request context + entityCtx := engcontext.EntityFromContext(ctx) + + // Ensure the project is valid and exist in the db + err := entityCtx.ValidateProject(ctx, s.store) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "error in entity context: %v", err) + } + + // Get the data source id by name + ds, err := s.dataSourcesService.GetByName(ctx, dsName, entityCtx.Project.ID, &service.ReadOptions{}) + if err != nil { + return nil, err + } + + // Parse the data source ID + dsId, err := uuid.Parse(ds.Id) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "invalid data source ID: %v", err) + } + + // Delete the data source by its ID after getting it by name + err = s.dataSourcesService.Delete(ctx, dsId, entityCtx.Project.ID, nil) + if err != nil { + return nil, err + } + + // Return the response + return &minderv1.DeleteDataSourceByNameResponse{Name: dsName}, nil +} + +func (s *Server) forceDataSourceProject(ctx context.Context, in *minderv1.DataSource) error { + entityCtx := engcontext.EntityFromContext(ctx) + + // Ensure the project is valid and exist in the db + if err := entityCtx.ValidateProject(ctx, s.store); err != nil { + return status.Errorf(codes.InvalidArgument, "error in entity context: %v", err) + } + + // Force the context to have the observed project ID + if in.GetContext() == nil { + in.Context = &minderv1.ContextV2{} + } + in.GetContext().ProjectId = entityCtx.Project.ID.String() + + return nil +} diff --git a/internal/controlplane/handlers_datasource_test.go b/internal/controlplane/handlers_datasource_test.go new file mode 100644 index 0000000000..1593da1f93 --- /dev/null +++ b/internal/controlplane/handlers_datasource_test.go @@ -0,0 +1,723 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package controlplane + +import ( + "context" + "testing" + + "github.com/google/uuid" + "github.com/stretchr/testify/require" + "go.uber.org/mock/gomock" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + mockdb "github.com/mindersec/minder/database/mock" + mock_service "github.com/mindersec/minder/internal/datasources/service/mock" + "github.com/mindersec/minder/internal/db" + "github.com/mindersec/minder/internal/engine/engcontext" + "github.com/mindersec/minder/internal/flags" + minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" +) + +func TestCreateDataSource(t *testing.T) { + t.Parallel() + + projectID := uuid.New() + tests := []struct { + name string + setupMocks func(*mock_service.MockDataSourcesService, *flags.FakeClient) + request *minderv1.CreateDataSourceRequest + expectedResponse *minderv1.CreateDataSourceResponse + expectedErrorCode codes.Code + }{ + { + name: "happy path", + setupMocks: func(dsService *mock_service.MockDataSourcesService, featureClient *flags.FakeClient) { + featureClient.Data = map[string]interface{}{"data_sources": true} + dsService.EXPECT(). + Create(gomock.Any(), gomock.Any(), gomock.Any()). + Return(&minderv1.DataSource{Name: "test-ds"}, nil) + }, + request: &minderv1.CreateDataSourceRequest{ + DataSource: &minderv1.DataSource{Name: "test-ds"}, + }, + expectedResponse: &minderv1.CreateDataSourceResponse{ + DataSource: &minderv1.DataSource{Name: "test-ds"}, + }, + expectedErrorCode: codes.OK, + }, + { + name: "missing data source", + setupMocks: func(_ *mock_service.MockDataSourcesService, featureClient *flags.FakeClient) { + featureClient.Data = map[string]interface{}{"data_sources": true} + }, + request: &minderv1.CreateDataSourceRequest{}, + expectedResponse: nil, + expectedErrorCode: codes.InvalidArgument, + }, + { + name: "feature disabled", + setupMocks: func(_ *mock_service.MockDataSourcesService, featureClient *flags.FakeClient) { + featureClient.Data = map[string]interface{}{"data_sources": false} + }, + request: &minderv1.CreateDataSourceRequest{ + DataSource: &minderv1.DataSource{Name: "test-ds"}, + }, + expectedResponse: nil, + expectedErrorCode: codes.Unavailable, + }, + } + + for _, tt := range tests { + tt := tt // capture range variable + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + mockStore := mockdb.NewMockStore(ctrl) + // project validation + mockStore.EXPECT().GetProjectByID(gomock.Any(), projectID).Return(db.Project{ + ID: projectID, + }, nil).AnyTimes() + + mockDataSourceService := mock_service.NewMockDataSourcesService(ctrl) + featureClient := &flags.FakeClient{} + + if tt.setupMocks != nil { + tt.setupMocks(mockDataSourceService, featureClient) + } + + srv := newDefaultServer(t, mockStore, nil, nil, nil) + srv.dataSourcesService = mockDataSourceService + srv.featureFlags = featureClient + + ctx := context.Background() + ctx = engcontext.WithEntityContext(ctx, &engcontext.EntityContext{ + Project: engcontext.Project{ID: projectID}, + Provider: engcontext.Provider{Name: "testing"}, + }) + + resp, err := srv.CreateDataSource(ctx, tt.request) + if tt.expectedErrorCode != codes.OK { + require.Error(t, err) + st, ok := status.FromError(err) + require.True(t, ok) + require.Equal(t, tt.expectedErrorCode, st.Code()) + require.Nil(t, resp) + } else { + require.NoError(t, err) + require.Equal(t, tt.expectedResponse, resp) + } + }) + } +} + +func TestGetDataSourceById(t *testing.T) { + t.Parallel() + + projectID := uuid.New() + dsID := uuid.New() + dsIDStr := dsID.String() + tests := []struct { + name string + setupMocks func(*mock_service.MockDataSourcesService, *flags.FakeClient, *mockdb.MockStore) + request *minderv1.GetDataSourceByIdRequest + expectedResponse *minderv1.GetDataSourceByIdResponse + expectedErrorCode codes.Code + }{ + { + name: "happy path", + setupMocks: func(dsService *mock_service.MockDataSourcesService, featureClient *flags.FakeClient, mockStore *mockdb.MockStore) { + featureClient.Data = map[string]interface{}{"data_sources": true} + mockStore.EXPECT(). + GetProjectByID(gomock.Any(), projectID). + Return(db.Project{}, nil) + dsService.EXPECT(). + GetByID(gomock.Any(), dsID, projectID, gomock.Any()). + Return(&minderv1.DataSource{Id: dsIDStr, Name: "test-ds"}, nil) + }, + request: &minderv1.GetDataSourceByIdRequest{ + Id: dsIDStr, + }, + expectedResponse: &minderv1.GetDataSourceByIdResponse{ + DataSource: &minderv1.DataSource{Id: dsIDStr, Name: "test-ds"}, + }, + expectedErrorCode: codes.OK, + }, + { + name: "missing data source ID", + setupMocks: func(_ *mock_service.MockDataSourcesService, featureClient *flags.FakeClient, _ *mockdb.MockStore) { + featureClient.Data = map[string]interface{}{"data_sources": true} + // No need to set up mockStore expectations here + }, + request: &minderv1.GetDataSourceByIdRequest{}, + expectedResponse: nil, + expectedErrorCode: codes.InvalidArgument, + }, + { + name: "invalid data source ID format", + setupMocks: func(_ *mock_service.MockDataSourcesService, featureClient *flags.FakeClient, _ *mockdb.MockStore) { + featureClient.Data = map[string]interface{}{"data_sources": true} + // No need to set up mockStore expectations here + }, + request: &minderv1.GetDataSourceByIdRequest{ + Id: "invalid-uuid", + }, + expectedResponse: nil, + expectedErrorCode: codes.InvalidArgument, + }, + { + name: "feature disabled", + setupMocks: func(_ *mock_service.MockDataSourcesService, featureClient *flags.FakeClient, _ *mockdb.MockStore) { + featureClient.Data = map[string]interface{}{"data_sources": false} + // No need to set up mockStore expectations here + }, + request: &minderv1.GetDataSourceByIdRequest{ + Id: dsIDStr, + }, + expectedResponse: nil, + expectedErrorCode: codes.Unavailable, + }, + } + + for _, tt := range tests { + tt := tt // capture range variable + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + mockStore := mockdb.NewMockStore(ctrl) + mockDataSourceService := mock_service.NewMockDataSourcesService(ctrl) + featureClient := &flags.FakeClient{} + + if tt.setupMocks != nil { + tt.setupMocks(mockDataSourceService, featureClient, mockStore) + } + + srv := newDefaultServer(t, mockStore, nil, nil, nil) + srv.dataSourcesService = mockDataSourceService + srv.featureFlags = featureClient + + ctx := context.Background() + ctx = engcontext.WithEntityContext(ctx, &engcontext.EntityContext{ + Project: engcontext.Project{ID: projectID}, + Provider: engcontext.Provider{Name: "testing"}, + }) + + resp, err := srv.GetDataSourceById(ctx, tt.request) + if tt.expectedErrorCode != codes.OK { + require.Error(t, err) + st, ok := status.FromError(err) + require.True(t, ok) + require.Equal(t, tt.expectedErrorCode, st.Code()) + require.Nil(t, resp) + } else { + require.NoError(t, err) + require.Equal(t, tt.expectedResponse, resp) + } + }) + } +} + +func TestGetDataSourceByName(t *testing.T) { + t.Parallel() + + projectID := uuid.New() + dsName := "test-ds" + tests := []struct { + name string + setupMocks func(*mock_service.MockDataSourcesService, *flags.FakeClient, *mockdb.MockStore) + request *minderv1.GetDataSourceByNameRequest + expectedResponse *minderv1.GetDataSourceByNameResponse + expectedErrorCode codes.Code + }{ + { + name: "happy path", + setupMocks: func(dsService *mock_service.MockDataSourcesService, featureClient *flags.FakeClient, mockStore *mockdb.MockStore) { + featureClient.Data = map[string]interface{}{"data_sources": true} + mockStore.EXPECT(). + GetProjectByID(gomock.Any(), projectID). + Return(db.Project{}, nil) + dsService.EXPECT(). + GetByName(gomock.Any(), dsName, projectID, gomock.Any()). + Return(&minderv1.DataSource{Name: dsName}, nil) + }, + request: &minderv1.GetDataSourceByNameRequest{ + Name: dsName, + }, + expectedResponse: &minderv1.GetDataSourceByNameResponse{ + DataSource: &minderv1.DataSource{Name: dsName}, + }, + expectedErrorCode: codes.OK, + }, + { + name: "missing data source name", + setupMocks: func(_ *mock_service.MockDataSourcesService, featureClient *flags.FakeClient, _ *mockdb.MockStore) { + featureClient.Data = map[string]interface{}{"data_sources": true} + // No need to set up mockStore expectations here + }, + request: &minderv1.GetDataSourceByNameRequest{}, + expectedResponse: nil, + expectedErrorCode: codes.InvalidArgument, + }, + { + name: "feature disabled", + setupMocks: func(_ *mock_service.MockDataSourcesService, featureClient *flags.FakeClient, _ *mockdb.MockStore) { + featureClient.Data = map[string]interface{}{"data_sources": false} + // No need to set up mockStore expectations here + }, + request: &minderv1.GetDataSourceByNameRequest{ + Name: dsName, + }, + expectedResponse: nil, + expectedErrorCode: codes.Unavailable, + }, + } + + for _, tt := range tests { + tt := tt // capture range variable + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + mockStore := mockdb.NewMockStore(ctrl) + mockDataSourceService := mock_service.NewMockDataSourcesService(ctrl) + featureClient := &flags.FakeClient{} + + if tt.setupMocks != nil { + tt.setupMocks(mockDataSourceService, featureClient, mockStore) + } + + srv := newDefaultServer(t, mockStore, nil, nil, nil) + srv.dataSourcesService = mockDataSourceService + srv.featureFlags = featureClient + + ctx := context.Background() + ctx = engcontext.WithEntityContext(ctx, &engcontext.EntityContext{ + Project: engcontext.Project{ID: projectID}, + Provider: engcontext.Provider{Name: "testing"}, + }) + + resp, err := srv.GetDataSourceByName(ctx, tt.request) + if tt.expectedErrorCode != codes.OK { + require.Error(t, err) + st, ok := status.FromError(err) + require.True(t, ok) + require.Equal(t, tt.expectedErrorCode, st.Code()) + require.Nil(t, resp) + } else { + require.NoError(t, err) + require.Equal(t, tt.expectedResponse, resp) + } + }) + } +} + +func TestListDataSources(t *testing.T) { + t.Parallel() + + projectID := uuid.New() + dsList := []*minderv1.DataSource{ + {Name: "ds1"}, + {Name: "ds2"}, + } + tests := []struct { + name string + setupMocks func(*mock_service.MockDataSourcesService, *flags.FakeClient, *mockdb.MockStore) + expectedResponse *minderv1.ListDataSourcesResponse + expectedErrorCode codes.Code + }{ + { + name: "happy path", + setupMocks: func(dsService *mock_service.MockDataSourcesService, featureClient *flags.FakeClient, mockStore *mockdb.MockStore) { + featureClient.Data = map[string]interface{}{"data_sources": true} + mockStore.EXPECT(). + GetProjectByID(gomock.Any(), projectID). + Return(db.Project{}, nil) + dsService.EXPECT(). + List(gomock.Any(), projectID, gomock.Any()). + Return(dsList, nil) + }, + expectedResponse: &minderv1.ListDataSourcesResponse{ + DataSources: dsList, + }, + expectedErrorCode: codes.OK, + }, + { + name: "feature disabled", + setupMocks: func(_ *mock_service.MockDataSourcesService, featureClient *flags.FakeClient, _ *mockdb.MockStore) { + featureClient.Data = map[string]interface{}{"data_sources": false} + // No need to set up mockStore expectations here + }, + expectedResponse: nil, + expectedErrorCode: codes.Unavailable, + }, + } + + for _, tt := range tests { + tt := tt // capture range variable + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + mockStore := mockdb.NewMockStore(ctrl) + mockDataSourceService := mock_service.NewMockDataSourcesService(ctrl) + featureClient := &flags.FakeClient{} + + if tt.setupMocks != nil { + tt.setupMocks(mockDataSourceService, featureClient, mockStore) + } + + srv := newDefaultServer(t, mockStore, nil, nil, nil) + srv.dataSourcesService = mockDataSourceService + srv.featureFlags = featureClient + + ctx := context.Background() + ctx = engcontext.WithEntityContext(ctx, &engcontext.EntityContext{ + Project: engcontext.Project{ID: projectID}, + Provider: engcontext.Provider{Name: "testing"}, + }) + + resp, err := srv.ListDataSources(ctx, &minderv1.ListDataSourcesRequest{}) + if tt.expectedErrorCode != codes.OK { + require.Error(t, err) + st, ok := status.FromError(err) + require.True(t, ok) + require.Equal(t, tt.expectedErrorCode, st.Code()) + require.Nil(t, resp) + } else { + require.NoError(t, err) + require.Equal(t, tt.expectedResponse, resp) + } + }) + } +} + +func TestUpdateDataSource(t *testing.T) { + t.Parallel() + + projectID := uuid.New() + dsID := uuid.New() + dsIDStr := dsID.String() + tests := []struct { + name string + setupMocks func(*mock_service.MockDataSourcesService, *flags.FakeClient, *mockdb.MockStore) + request *minderv1.UpdateDataSourceRequest + expectedResponse *minderv1.UpdateDataSourceResponse + expectedErrorCode codes.Code + }{ + { + name: "happy path", + setupMocks: func(dsService *mock_service.MockDataSourcesService, featureClient *flags.FakeClient, _ *mockdb.MockStore) { + featureClient.Data = map[string]interface{}{"data_sources": true} + dsService.EXPECT(). + Update(gomock.Any(), gomock.Any(), gomock.Any()). + Return(&minderv1.DataSource{Id: dsIDStr, Name: "updated-ds"}, nil) + }, + request: &minderv1.UpdateDataSourceRequest{ + DataSource: &minderv1.DataSource{Id: dsIDStr, Name: "updated-ds"}, + }, + expectedResponse: &minderv1.UpdateDataSourceResponse{ + DataSource: &minderv1.DataSource{Id: dsIDStr, Name: "updated-ds"}, + }, + expectedErrorCode: codes.OK, + }, + { + name: "missing data source", + setupMocks: func(_ *mock_service.MockDataSourcesService, featureClient *flags.FakeClient, _ *mockdb.MockStore) { + featureClient.Data = map[string]interface{}{"data_sources": true} + // No need to set up dsService expectations here + }, + request: &minderv1.UpdateDataSourceRequest{}, + expectedResponse: nil, + expectedErrorCode: codes.InvalidArgument, + }, + { + name: "feature disabled", + setupMocks: func(_ *mock_service.MockDataSourcesService, featureClient *flags.FakeClient, _ *mockdb.MockStore) { + featureClient.Data = map[string]interface{}{"data_sources": false} + // No need to set up dsService expectations here + }, + request: &minderv1.UpdateDataSourceRequest{ + DataSource: &minderv1.DataSource{Id: dsIDStr, Name: "updated-ds"}, + }, + expectedResponse: nil, + expectedErrorCode: codes.Unavailable, + }, + } + + for _, tt := range tests { + tt := tt // capture range variable + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + mockStore := mockdb.NewMockStore(ctrl) + // project validation + mockStore.EXPECT().GetProjectByID(gomock.Any(), projectID).Return(db.Project{ + ID: projectID, + }, nil).AnyTimes() + + mockDataSourceService := mock_service.NewMockDataSourcesService(ctrl) + featureClient := &flags.FakeClient{} + + if tt.setupMocks != nil { + tt.setupMocks(mockDataSourceService, featureClient, mockStore) + } + + srv := newDefaultServer(t, mockStore, nil, nil, nil) + srv.dataSourcesService = mockDataSourceService + srv.featureFlags = featureClient + + ctx := context.Background() + ctx = engcontext.WithEntityContext(ctx, &engcontext.EntityContext{ + Project: engcontext.Project{ID: projectID}, + Provider: engcontext.Provider{Name: "testing"}, + }) + + resp, err := srv.UpdateDataSource(ctx, tt.request) + if tt.expectedErrorCode != codes.OK { + require.Error(t, err) + st, ok := status.FromError(err) + require.True(t, ok) + require.Equal(t, tt.expectedErrorCode, st.Code()) + require.Nil(t, resp) + } else { + require.NoError(t, err) + require.Equal(t, tt.expectedResponse, resp) + } + }) + } +} + +func TestDeleteDataSourceById(t *testing.T) { + t.Parallel() + + projectID := uuid.New() + dsID := uuid.New() + dsIDStr := dsID.String() + tests := []struct { + name string + setupMocks func(*mock_service.MockDataSourcesService, *flags.FakeClient, *mockdb.MockStore) + request *minderv1.DeleteDataSourceByIdRequest + expectedResponse *minderv1.DeleteDataSourceByIdResponse + expectedErrorCode codes.Code + }{ + { + name: "happy path", + setupMocks: func(dsService *mock_service.MockDataSourcesService, featureClient *flags.FakeClient, mockStore *mockdb.MockStore) { + featureClient.Data = map[string]interface{}{"data_sources": true} + mockStore.EXPECT(). + GetProjectByID(gomock.Any(), projectID). + Return(db.Project{}, nil) + dsService.EXPECT(). + Delete(gomock.Any(), dsID, projectID, gomock.Any()). + Return(nil) + }, + request: &minderv1.DeleteDataSourceByIdRequest{ + Id: dsIDStr, + }, + expectedResponse: &minderv1.DeleteDataSourceByIdResponse{ + Id: dsIDStr, + }, + expectedErrorCode: codes.OK, + }, + { + name: "missing data source ID", + setupMocks: func(_ *mock_service.MockDataSourcesService, featureClient *flags.FakeClient, _ *mockdb.MockStore) { + featureClient.Data = map[string]interface{}{"data_sources": true} + // No need to set up dsService expectations here + }, + request: &minderv1.DeleteDataSourceByIdRequest{}, + expectedResponse: nil, + expectedErrorCode: codes.InvalidArgument, + }, + { + name: "invalid data source ID format", + setupMocks: func(_ *mock_service.MockDataSourcesService, featureClient *flags.FakeClient, _ *mockdb.MockStore) { + featureClient.Data = map[string]interface{}{"data_sources": true} + // No need to set up dsService expectations here + }, + request: &minderv1.DeleteDataSourceByIdRequest{ + Id: "invalid-uuid", + }, + expectedResponse: nil, + expectedErrorCode: codes.InvalidArgument, + }, + { + name: "feature disabled", + setupMocks: func(_ *mock_service.MockDataSourcesService, featureClient *flags.FakeClient, _ *mockdb.MockStore) { + featureClient.Data = map[string]interface{}{"data_sources": false} + // No need to set up dsService expectations here + }, + request: &minderv1.DeleteDataSourceByIdRequest{ + Id: dsIDStr, + }, + expectedResponse: nil, + expectedErrorCode: codes.Unavailable, + }, + } + + for _, tt := range tests { + tt := tt // capture range variable + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + mockStore := mockdb.NewMockStore(ctrl) + mockDataSourceService := mock_service.NewMockDataSourcesService(ctrl) + featureClient := &flags.FakeClient{} + + if tt.setupMocks != nil { + tt.setupMocks(mockDataSourceService, featureClient, mockStore) + } + + srv := newDefaultServer(t, mockStore, nil, nil, nil) + srv.dataSourcesService = mockDataSourceService + srv.featureFlags = featureClient + + ctx := context.Background() + ctx = engcontext.WithEntityContext(ctx, &engcontext.EntityContext{ + Project: engcontext.Project{ID: projectID}, + Provider: engcontext.Provider{Name: "testing"}, + }) + + resp, err := srv.DeleteDataSourceById(ctx, tt.request) + if tt.expectedErrorCode != codes.OK { + require.Error(t, err) + st, ok := status.FromError(err) + require.True(t, ok) + require.Equal(t, tt.expectedErrorCode, st.Code()) + require.Nil(t, resp) + } else { + require.NoError(t, err) + require.Equal(t, tt.expectedResponse, resp) + } + }) + } +} + +func TestDeleteDataSourceByName(t *testing.T) { + t.Parallel() + + projectID := uuid.New() + dsName := "test-ds" + dsID := uuid.New() + dsIDStr := dsID.String() + tests := []struct { + name string + setupMocks func(*mock_service.MockDataSourcesService, *flags.FakeClient, *mockdb.MockStore) + request *minderv1.DeleteDataSourceByNameRequest + expectedResponse *minderv1.DeleteDataSourceByNameResponse + expectedErrorCode codes.Code + }{ + { + name: "happy path", + setupMocks: func(dsService *mock_service.MockDataSourcesService, featureClient *flags.FakeClient, mockStore *mockdb.MockStore) { + featureClient.Data = map[string]interface{}{"data_sources": true} + mockStore.EXPECT(). + GetProjectByID(gomock.Any(), projectID). + Return(db.Project{}, nil) + dsService.EXPECT(). + GetByName(gomock.Any(), dsName, projectID, gomock.Any()). + Return(&minderv1.DataSource{Id: dsIDStr, Name: dsName}, nil) + dsService.EXPECT(). + Delete(gomock.Any(), dsID, projectID, gomock.Any()). + Return(nil) + }, + request: &minderv1.DeleteDataSourceByNameRequest{ + Name: dsName, + }, + expectedResponse: &minderv1.DeleteDataSourceByNameResponse{ + Name: dsName, + }, + expectedErrorCode: codes.OK, + }, + { + name: "missing data source name", + setupMocks: func(_ *mock_service.MockDataSourcesService, featureClient *flags.FakeClient, _ *mockdb.MockStore) { + featureClient.Data = map[string]interface{}{"data_sources": true} + // No need to set up dsService expectations here + }, + request: &minderv1.DeleteDataSourceByNameRequest{}, + expectedResponse: nil, + expectedErrorCode: codes.InvalidArgument, + }, + { + name: "invalid data source ID format", + setupMocks: func(dsService *mock_service.MockDataSourcesService, featureClient *flags.FakeClient, mockStore *mockdb.MockStore) { + featureClient.Data = map[string]interface{}{"data_sources": true} + mockStore.EXPECT(). + GetProjectByID(gomock.Any(), projectID). + Return(db.Project{}, nil) + dsService.EXPECT(). + GetByName(gomock.Any(), dsName, projectID, gomock.Any()). + Return(&minderv1.DataSource{Id: "invalid-uuid", Name: dsName}, nil) + }, + request: &minderv1.DeleteDataSourceByNameRequest{ + Name: dsName, + }, + expectedResponse: nil, + expectedErrorCode: codes.InvalidArgument, + }, + { + name: "feature disabled", + setupMocks: func(_ *mock_service.MockDataSourcesService, featureClient *flags.FakeClient, _ *mockdb.MockStore) { + featureClient.Data = map[string]interface{}{"data_sources": false} + // No need to set up dsService expectations here + }, + request: &minderv1.DeleteDataSourceByNameRequest{ + Name: dsName, + }, + expectedResponse: nil, + expectedErrorCode: codes.Unavailable, + }, + } + + for _, tt := range tests { + tt := tt // capture range variable + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + mockStore := mockdb.NewMockStore(ctrl) + mockDataSourceService := mock_service.NewMockDataSourcesService(ctrl) + featureClient := &flags.FakeClient{} + + if tt.setupMocks != nil { + tt.setupMocks(mockDataSourceService, featureClient, mockStore) + } + + srv := newDefaultServer(t, mockStore, nil, nil, nil) + srv.dataSourcesService = mockDataSourceService + srv.featureFlags = featureClient + + ctx := context.Background() + ctx = engcontext.WithEntityContext(ctx, &engcontext.EntityContext{ + Project: engcontext.Project{ID: projectID}, + Provider: engcontext.Provider{Name: "testing"}, + }) + + resp, err := srv.DeleteDataSourceByName(ctx, tt.request) + if tt.expectedErrorCode != codes.OK { + require.Error(t, err) + st, ok := status.FromError(err) + require.True(t, ok) + require.Equal(t, tt.expectedErrorCode, st.Code()) + require.Nil(t, resp) + } else { + require.NoError(t, err) + require.Equal(t, tt.expectedResponse, resp) + } + }) + } +} diff --git a/internal/controlplane/handlers_evalstatus.go b/internal/controlplane/handlers_evalstatus.go index 27726ce81b..0809e8f447 100644 --- a/internal/controlplane/handlers_evalstatus.go +++ b/internal/controlplane/handlers_evalstatus.go @@ -131,6 +131,7 @@ func (s *Server) ListEvaluationHistory( opts = append(opts, FilterOptsFromStrings(in.GetEntityType(), history.WithEntityType)...) opts = append(opts, FilterOptsFromStrings(in.GetEntityName(), history.WithEntityName)...) opts = append(opts, FilterOptsFromStrings(in.GetProfileName(), history.WithProfileName)...) + opts = append(opts, FilterOptsFromStrings(in.GetLabelFilter(), history.WithLabel)...) opts = append(opts, FilterOptsFromStrings(in.GetStatus(), history.WithStatus)...) opts = append(opts, FilterOptsFromStrings(in.GetRemediation(), history.WithRemediation)...) opts = append(opts, FilterOptsFromStrings(in.GetAlert(), history.WithAlert)...) diff --git a/internal/controlplane/handlers_oauth_test.go b/internal/controlplane/handlers_oauth_test.go index d70440e016..eb0237c4a8 100644 --- a/internal/controlplane/handlers_oauth_test.go +++ b/internal/controlplane/handlers_oauth_test.go @@ -212,8 +212,7 @@ func TestGetAuthorizationURL(t *testing.T) { Provider: &githubProviderClass, Project: &projectIdStr, }, - Port: 8080, - Cli: true, + Cli: true, }, buildStubs: func(store *mockdb.MockStore) { store.EXPECT(). @@ -248,8 +247,7 @@ func TestGetAuthorizationURL(t *testing.T) { Provider: &githubAppProviderClass, Project: &projectIdStr, }, - Port: 8080, - Cli: true, + Cli: true, }, buildStubs: func(store *mockdb.MockStore) { store.EXPECT(). @@ -283,8 +281,7 @@ func TestGetAuthorizationURL(t *testing.T) { Provider: &nonGithubProviderName, Project: &projectIdStr, }, - Port: 8080, - Cli: true, + Cli: true, }, buildStubs: func(_ *mockdb.MockStore) {}, @@ -303,8 +300,7 @@ func TestGetAuthorizationURL(t *testing.T) { Provider: &githubProviderClass, Project: &projectIdStr, }, - Port: 8080, - Cli: true, + Cli: true, }, buildStubs: func(store *mockdb.MockStore) { store.EXPECT(). diff --git a/internal/controlplane/handlers_projects.go b/internal/controlplane/handlers_projects.go index c9c24728bf..dbc1fd0c05 100644 --- a/internal/controlplane/handlers_projects.go +++ b/internal/controlplane/handlers_projects.go @@ -201,6 +201,15 @@ func (s *Server) CreateProject( return nil, status.Errorf(codes.Internal, "error creating subproject: %v", err) } + // Retrieve the membership-to-feature mapping from the configuration + projectFeatures := s.cfg.Features.GetFeaturesForMemberships(ctx) + if err := qtx.CreateEntitlements(ctx, db.CreateEntitlementsParams{ + Features: projectFeatures, + ProjectID: subProject.ID, + }); err != nil { + return nil, status.Errorf(codes.Internal, "error creating entitlements: %v", err) + } + if err := s.authzClient.Adopt(ctx, parent.ID, subProject.ID); err != nil { return nil, status.Errorf(codes.Internal, "error creating subproject: %v", err) } diff --git a/internal/controlplane/handlers_providers.go b/internal/controlplane/handlers_providers.go index 844e7c35e8..eb18523104 100644 --- a/internal/controlplane/handlers_providers.go +++ b/internal/controlplane/handlers_providers.go @@ -39,6 +39,10 @@ func (s *Server) CreateProvider( return nil, status.Errorf(codes.InvalidArgument, "provider is required") } + if provider.GetVersion() == "" { + provider.Version = "v1" + } + var provConfig json.RawMessage if provider.Config != nil { var marshallErr error @@ -237,6 +241,10 @@ func (s *Server) PatchProvider( return nil, status.Errorf(codes.InvalidArgument, "provider name is required") } + if req.GetPatch() != nil && req.GetPatch().GetVersion() == "" { + req.Patch.Version = "v1" + } + err := s.providerManager.PatchProviderConfig(ctx, providerName, projectID, req.GetPatch().GetConfig().AsMap()) if err != nil { if errors.Is(err, sql.ErrNoRows) { @@ -283,6 +291,7 @@ func protobufProviderFromDB( } return &minderv1.Provider{ + Id: p.ID.String(), Name: p.Name, Project: p.ProjectID.String(), Version: p.Version, diff --git a/internal/controlplane/handlers_ruletype.go b/internal/controlplane/handlers_ruletype.go index 15267853b8..42fbf75424 100644 --- a/internal/controlplane/handlers_ruletype.go +++ b/internal/controlplane/handlers_ruletype.go @@ -14,6 +14,7 @@ import ( "github.com/google/uuid" "github.com/microcosm-cc/bluemonday" + "github.com/open-feature/go-sdk/openfeature" "github.com/yuin/goldmark" "github.com/yuin/goldmark/extension" "github.com/yuin/goldmark/parser" @@ -23,6 +24,8 @@ import ( "github.com/mindersec/minder/internal/db" "github.com/mindersec/minder/internal/engine/engcontext" + "github.com/mindersec/minder/internal/engine/ingester/git" + "github.com/mindersec/minder/internal/flags" "github.com/mindersec/minder/internal/logger" "github.com/mindersec/minder/internal/util" minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" @@ -174,14 +177,21 @@ func (s *Server) CreateRuleType( return nil, util.UserVisibleError(codes.InvalidArgument, "%s", err) } + ruleDef := crt.GetRuleType().GetDef() + if err := checkRuleDefinitionFlags(ctx, s.featureFlags, ruleDef); err != nil { + return nil, err + } + newRuleType, err := db.WithTransaction(s.store, func(qtx db.ExtendQuerier) (*minderv1.RuleType, error) { return s.ruleTypes.CreateRuleType(ctx, projectID, uuid.Nil, crt.GetRuleType(), qtx) }) if err != nil { if errors.Is(err, ruletypes.ErrRuleTypeInvalid) { - return nil, status.Errorf(codes.InvalidArgument, "invalid rule type definition: %s", err) + return nil, util.UserVisibleError(codes.InvalidArgument, "invalid rule type definition: %s", err) } else if errors.Is(err, ruletypes.ErrRuleAlreadyExists) { - return nil, status.Errorf(codes.AlreadyExists, "rule type %s already exists", crt.RuleType.GetName()) + return nil, util.UserVisibleError(codes.AlreadyExists, "rule type %s already exists", crt.RuleType.GetName()) + } else if errors.Is(err, ruletypes.ErrDataSourceNotFound) { + return nil, util.UserVisibleError(codes.InvalidArgument, "%s", err.Error()) } return nil, status.Errorf(codes.Unknown, "failed to create rule type: %s", err) } @@ -191,6 +201,27 @@ func (s *Server) CreateRuleType( }, nil } +func checkRuleDefinitionFlags( + ctx context.Context, featureFlags openfeature.IClient, ruleDef *minderv1.RuleType_Definition) *util.NiceStatus { + ruleDS := ruleDef.GetEval().GetDataSources() + if len(ruleDS) > 0 && !flags.Bool(ctx, featureFlags, flags.DataSources) { + return util.UserVisibleError(codes.InvalidArgument, "DataSources feature is disabled") + } + + prCommentAlert := ruleDef.GetAlert().GetPullRequestComment() + if prCommentAlert != nil && !flags.Bool(ctx, featureFlags, flags.PRCommentAlert) { + return util.UserVisibleError(codes.InvalidArgument, "Pull request comment alert type is disabled") + } + + usesGitPR := ruleDef.GetIngest().GetType() == git.GitRuleDataIngestType && + ruleDef.GetInEntity() == minderv1.PullRequestEntity.String() + if usesGitPR && !flags.Bool(ctx, featureFlags, flags.GitPRDiffs) { + return util.UserVisibleError(codes.InvalidArgument, "Git pull request ingest is disabled") + } + + return nil +} + // UpdateRuleType is a method to update a rule type func (s *Server) UpdateRuleType( ctx context.Context, @@ -214,12 +245,17 @@ func (s *Server) UpdateRuleType( return nil, util.UserVisibleError(codes.InvalidArgument, "%s", err) } + ruleDef := urt.GetRuleType().GetDef() + if err := checkRuleDefinitionFlags(ctx, s.featureFlags, ruleDef); err != nil { + return nil, err + } + updatedRuleType, err := db.WithTransaction(s.store, func(qtx db.ExtendQuerier) (*minderv1.RuleType, error) { return s.ruleTypes.UpdateRuleType(ctx, projectID, uuid.Nil, urt.GetRuleType(), qtx) }) if err != nil { if errors.Is(err, ruletypes.ErrRuleTypeInvalid) { - return nil, status.Errorf(codes.InvalidArgument, "invalid rule type definition: %s", err) + return nil, util.UserVisibleError(codes.InvalidArgument, "invalid rule type definition: %s", err) } else if errors.Is(err, ruletypes.ErrRuleNotFound) { return nil, status.Errorf(codes.NotFound, "rule type %s not found", urt.RuleType.GetName()) } diff --git a/internal/controlplane/handlers_ruletype_test.go b/internal/controlplane/handlers_ruletype_test.go index f36facbab5..88f2dc0e40 100644 --- a/internal/controlplane/handlers_ruletype_test.go +++ b/internal/controlplane/handlers_ruletype_test.go @@ -5,6 +5,7 @@ package controlplane import ( "context" + "errors" "strings" "testing" @@ -14,26 +15,49 @@ import ( mockdb "github.com/mindersec/minder/database/mock" df "github.com/mindersec/minder/database/mock/fixtures" + dsf "github.com/mindersec/minder/internal/datasources/service/mock/fixtures" db "github.com/mindersec/minder/internal/db" + "github.com/mindersec/minder/internal/engine/engcontext" + "github.com/mindersec/minder/internal/flags" minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" sf "github.com/mindersec/minder/pkg/ruletypes/mock/fixtures" ) +const ruleDefJSON = ` +{ + "rule_schema": {}, + "ingest": { + "type": "git", + "git": {} + }, + "eval": { + "type": "jq", + "jq": [{ + "ingested": {"def": ".abc"}, + "profile": {"def": ".xyz"} + }] + } +} +` + func TestCreateRuleType(t *testing.T) { t.Parallel() + projectID := uuid.New() tests := []struct { - name string - mockStoreFunc df.MockStoreBuilder - ruleTypeServiceFunc sf.RuleTypeSvcMockBuilder - request *minderv1.CreateRuleTypeRequest - error bool + name string + mockStoreFunc df.MockStoreBuilder + ruleTypeServiceFunc sf.RuleTypeSvcMockBuilder + dataSourcesServiceFunc dsf.DataSourcesSvcMockBuilder + features map[string]any + request *minderv1.CreateRuleTypeRequest + error bool }{ { name: "happy path", mockStoreFunc: df.NewMockStore( df.WithTransaction(), - WithSuccessfulGetProjectByID(uuid.Nil), + WithSuccessfulGetProjectByID(projectID), ), ruleTypeServiceFunc: sf.NewRuleTypeServiceMock( sf.WithSuccessfulCreateRuleType, @@ -45,7 +69,7 @@ func TestCreateRuleType(t *testing.T) { { name: "guidance sanitize error", mockStoreFunc: df.NewMockStore( - WithSuccessfulGetProjectByID(uuid.Nil), + WithSuccessfulGetProjectByID(projectID), ), ruleTypeServiceFunc: sf.NewRuleTypeServiceMock(), request: &minderv1.CreateRuleTypeRequest{ @@ -58,7 +82,7 @@ func TestCreateRuleType(t *testing.T) { { name: "guidance not utf-8", mockStoreFunc: df.NewMockStore( - WithSuccessfulGetProjectByID(uuid.Nil), + WithSuccessfulGetProjectByID(projectID), ), ruleTypeServiceFunc: sf.NewRuleTypeServiceMock(), request: &minderv1.CreateRuleTypeRequest{ @@ -71,7 +95,7 @@ func TestCreateRuleType(t *testing.T) { { name: "guidance too long", mockStoreFunc: df.NewMockStore( - WithSuccessfulGetProjectByID(uuid.Nil), + WithSuccessfulGetProjectByID(projectID), ), ruleTypeServiceFunc: sf.NewRuleTypeServiceMock(), request: &minderv1.CreateRuleTypeRequest{ @@ -103,10 +127,27 @@ func TestCreateRuleType(t *testing.T) { mockSvc = tt.ruleTypeServiceFunc(ctrl) } + var mockDsSvc dsf.DataSourcesSvcMock + if tt.dataSourcesServiceFunc != nil { + mockDsSvc = tt.dataSourcesServiceFunc(ctrl) + } + + featureClient := &flags.FakeClient{} + if tt.features != nil { + featureClient.Data = tt.features + } + srv := newDefaultServer(t, mockStore, nil, nil, nil) srv.ruleTypes = mockSvc + srv.dataSourcesService = mockDsSvc + srv.featureFlags = featureClient - resp, err := srv.CreateRuleType(context.Background(), tt.request) + ctx := context.Background() + ctx = engcontext.WithEntityContext(ctx, &engcontext.EntityContext{ + Project: engcontext.Project{ID: projectID}, + Provider: engcontext.Provider{Name: "testing"}, + }) + resp, err := srv.CreateRuleType(ctx, tt.request) if tt.error { require.Error(t, err) require.Nil(t, resp) @@ -122,18 +163,21 @@ func TestCreateRuleType(t *testing.T) { func TestUpdateRuleType(t *testing.T) { t.Parallel() + projectID := uuid.New() tests := []struct { - name string - mockStoreFunc df.MockStoreBuilder - ruleTypeServiceFunc sf.RuleTypeSvcMockBuilder - request *minderv1.UpdateRuleTypeRequest - error bool + name string + mockStoreFunc df.MockStoreBuilder + ruleTypeServiceFunc sf.RuleTypeSvcMockBuilder + dataSourcesServiceFunc dsf.DataSourcesSvcMockBuilder + features map[string]any + request *minderv1.UpdateRuleTypeRequest + error bool }{ { name: "happy path", mockStoreFunc: df.NewMockStore( df.WithTransaction(), - WithSuccessfulGetProjectByID(uuid.Nil), + WithSuccessfulGetProjectByID(projectID), ), ruleTypeServiceFunc: sf.NewRuleTypeServiceMock( sf.WithSuccessfulUpdateRuleType, @@ -145,7 +189,7 @@ func TestUpdateRuleType(t *testing.T) { { name: "guidance sanitize error", mockStoreFunc: df.NewMockStore( - WithSuccessfulGetProjectByID(uuid.Nil), + WithSuccessfulGetProjectByID(projectID), ), ruleTypeServiceFunc: sf.NewRuleTypeServiceMock(), request: &minderv1.UpdateRuleTypeRequest{ @@ -158,7 +202,7 @@ func TestUpdateRuleType(t *testing.T) { { name: "guidance not utf-8", mockStoreFunc: df.NewMockStore( - WithSuccessfulGetProjectByID(uuid.Nil), + WithSuccessfulGetProjectByID(projectID), ), ruleTypeServiceFunc: sf.NewRuleTypeServiceMock(), request: &minderv1.UpdateRuleTypeRequest{ @@ -171,7 +215,7 @@ func TestUpdateRuleType(t *testing.T) { { name: "guidance too long", mockStoreFunc: df.NewMockStore( - WithSuccessfulGetProjectByID(uuid.Nil), + WithSuccessfulGetProjectByID(projectID), ), ruleTypeServiceFunc: sf.NewRuleTypeServiceMock(), request: &minderv1.UpdateRuleTypeRequest{ @@ -203,10 +247,110 @@ func TestUpdateRuleType(t *testing.T) { mockSvc = tt.ruleTypeServiceFunc(ctrl) } + var mockDsSvc dsf.DataSourcesSvcMock + if tt.dataSourcesServiceFunc != nil { + mockDsSvc = tt.dataSourcesServiceFunc(ctrl) + } + + featureClient := &flags.FakeClient{} + if tt.features != nil { + featureClient.Data = tt.features + } + srv := newDefaultServer(t, mockStore, nil, nil, nil) srv.ruleTypes = mockSvc + srv.dataSourcesService = mockDsSvc + srv.featureFlags = featureClient + + ctx := context.Background() + ctx = engcontext.WithEntityContext(ctx, &engcontext.EntityContext{ + Project: engcontext.Project{ID: projectID}, + Provider: engcontext.Provider{Name: "testing"}, + }) + resp, err := srv.UpdateRuleType(ctx, tt.request) + if tt.error { + require.Error(t, err) + require.Nil(t, resp) + return + } + + require.NoError(t, err) + require.NotNil(t, resp) + }) + } +} + +func TestListRuleTypes(t *testing.T) { + t.Parallel() + + projectID := uuid.New() + ruleTypeList := []db.RuleType{ + {ID: uuid.New(), Name: "rule1", ProjectID: projectID, Definition: []byte(ruleDefJSON)}, + {ID: uuid.New(), Name: "rule2", ProjectID: projectID, Definition: []byte(ruleDefJSON)}, + } + tests := []struct { + name string + mockStoreFunc df.MockStoreBuilder + ruleTypes []db.RuleType + error bool + }{ + { + name: "success with rule types", + mockStoreFunc: df.NewMockStore( + WithSuccessfulGetProjectByID(projectID), + WithSuccessfulListRuleTypesByProject(projectID, ruleTypeList), + ), + ruleTypes: ruleTypeList, + }, + { + name: "success with no rule types", + mockStoreFunc: df.NewMockStore( + WithSuccessfulGetProjectByID(projectID), + WithSuccessfulListRuleTypesByProject(projectID, []db.RuleType{}), + ), + ruleTypes: []db.RuleType{}, + }, + { + name: "error in entity context", + mockStoreFunc: df.NewMockStore( + WithFailedGetProjectByID(), + ), + error: true, + }, + { + name: "failed to get rule types", + mockStoreFunc: df.NewMockStore( + WithSuccessfulGetProjectByID(projectID), + WithFailedListRuleTypesByProject(projectID), + ), + error: true, + }, + } - resp, err := srv.UpdateRuleType(context.Background(), tt.request) + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + var mockStore *mockdb.MockStore + if tt.mockStoreFunc != nil { + mockStore = tt.mockStoreFunc(ctrl) + } else { + mockStore = mockdb.NewMockStore(ctrl) + } + + srv := newDefaultServer(t, mockStore, nil, nil, nil) + + ctx := context.Background() + ctx = engcontext.WithEntityContext(ctx, &engcontext.EntityContext{ + Project: engcontext.Project{ID: projectID}, + Provider: engcontext.Provider{Name: "testing"}, + }) + + resp, err := srv.ListRuleTypes(ctx, &minderv1.ListRuleTypesRequest{}) if tt.error { require.Error(t, err) require.Nil(t, resp) @@ -215,10 +359,35 @@ func TestUpdateRuleType(t *testing.T) { require.NoError(t, err) require.NotNil(t, resp) + require.Len(t, resp.RuleTypes, len(tt.ruleTypes)) }) } } +func WithSuccessfulListRuleTypesByProject(projectID uuid.UUID, ruleTypes []db.RuleType) func(*mockdb.MockStore) { + return func(mockStore *mockdb.MockStore) { + mockStore.EXPECT(). + ListRuleTypesByProject(gomock.Any(), projectID). + Return(ruleTypes, nil) + } +} + +func WithFailedListRuleTypesByProject(projectID uuid.UUID) func(*mockdb.MockStore) { + return func(mockStore *mockdb.MockStore) { + mockStore.EXPECT(). + ListRuleTypesByProject(gomock.Any(), projectID). + Return(nil, errors.New("failed to list rule types")) + } +} + +func WithFailedGetProjectByID() func(*mockdb.MockStore) { + return func(mockStore *mockdb.MockStore) { + mockStore.EXPECT(). + GetProjectByID(gomock.Any(), gomock.Any()). + Return(db.Project{}, errors.New("failed to get project by ID")) + } +} + func WithSuccessfulGetProjectByID(projectID uuid.UUID) func(*mockdb.MockStore) { return func(mockStore *mockdb.MockStore) { mockStore.EXPECT(). diff --git a/internal/controlplane/handlers_user_test.go b/internal/controlplane/handlers_user_test.go index 75d07224e0..c71028e4ce 100644 --- a/internal/controlplane/handlers_user_test.go +++ b/internal/controlplane/handlers_user_test.go @@ -83,6 +83,8 @@ func TestCreateUser_gRPC(t *testing.T) { store.EXPECT(). CreateUser(gomock.Any(), gomock.Any()). Return(returnedUser, nil) + store.EXPECT().CreateEntitlements(gomock.Any(), gomock.Any()). + Return(nil) store.EXPECT().Commit(gomock.Any()) store.EXPECT().Rollback(gomock.Any()) tokenResult, _ := openid.NewBuilder().GivenName("Foo").FamilyName("Bar").Email("test@stacklok.com").Subject("subject1").Build() @@ -262,6 +264,7 @@ func TestCreateUser_gRPC(t *testing.T) { authz, marketplaces.NewNoopMarketplace(), &serverconfig.DefaultProfilesConfig{}, + &serverconfig.FeaturesConfig{}, ), } diff --git a/internal/controlplane/register_handlers.go b/internal/controlplane/register_handlers.go index 10a1f9fc15..709caec5cc 100644 --- a/internal/controlplane/register_handlers.go +++ b/internal/controlplane/register_handlers.go @@ -74,6 +74,11 @@ func RegisterGatewayHTTPHandlers(ctx context.Context, gwmux *runtime.ServeMux, g if err := pb.RegisterInviteServiceHandlerFromEndpoint(ctx, gwmux, grpcAddress, opts); err != nil { log.Fatal().Err(err).Msg("failed to register gateway") } + + // Register the DataSource service + if err := pb.RegisterDataSourceServiceHandlerFromEndpoint(ctx, gwmux, grpcAddress, opts); err != nil { + log.Fatal().Err(err).Msg("failed to register gateway") + } } // RegisterGRPCServices registers the GRPC services @@ -113,4 +118,7 @@ func RegisterGRPCServices(s *Server) { // Register the InviteService service pb.RegisterInviteServiceServer(s.grpcServer, s) + + // Register the DataSource service + pb.RegisterDataSourceServiceServer(s.grpcServer, s) } diff --git a/internal/controlplane/server.go b/internal/controlplane/server.go index 1c53847574..b00714ae57 100644 --- a/internal/controlplane/server.go +++ b/internal/controlplane/server.go @@ -39,12 +39,14 @@ import ( "google.golang.org/grpc/reflection" "google.golang.org/grpc/status" + "github.com/mindersec/minder/internal/api" "github.com/mindersec/minder/internal/assets" "github.com/mindersec/minder/internal/auth" "github.com/mindersec/minder/internal/auth/jwt" "github.com/mindersec/minder/internal/authz" "github.com/mindersec/minder/internal/controlplane/metrics" "github.com/mindersec/minder/internal/crypto" + datasourcessvc "github.com/mindersec/minder/internal/datasources/service" "github.com/mindersec/minder/internal/db" propSvc "github.com/mindersec/minder/internal/entities/properties/service" "github.com/mindersec/minder/internal/history" @@ -95,6 +97,7 @@ type Server struct { props propSvc.PropertiesService invites invites.InviteService ruleTypes ruletypes.RuleTypeService + dataSourcesService datasourcessvc.DataSourcesService repos reposvc.RepositoryService roles roles.RoleService profiles profiles.ProfileService @@ -121,6 +124,7 @@ type Server struct { pb.UnimplementedProvidersServiceServer pb.UnimplementedEvalResultsServiceServer pb.UnimplementedInviteServiceServer + pb.UnimplementedDataSourceServiceServer } // NewServer creates a new server instance @@ -140,6 +144,7 @@ func NewServer( profileService profiles.ProfileService, historyService history.EvaluationHistoryService, ruleService ruletypes.RuleTypeService, + dataSourcesService datasourcessvc.DataSourcesService, ghProviders service.GitHubProviderService, providerManager manager.ProviderManager, providerAuthManager manager.AuthManager, @@ -159,6 +164,7 @@ func NewServer( profiles: profileService, history: historyService, ruleTypes: ruleService, + dataSourcesService: dataSourcesService, providerStore: providerStore, featureFlags: featureFlagClient, ghClient: &ghprov.ClientServiceImplementation{}, @@ -234,10 +240,16 @@ func (s *Server) StartGRPCServer(ctx context.Context) error { return fmt.Errorf("failed to listen: %v", err) } + validator, err := api.NewValidator() + if err != nil { + return fmt.Errorf("failed to create validator: %w", err) + } + // add logger and tracing (if enabled) interceptors := []grpc.UnaryServerInterceptor{ // TODO: this has no test coverage! util.SanitizingInterceptor(), + api.ProtoValidationInterceptor(validator), // This adds `Grpc-Metadata-Request-Id` to the // response. logger.RequestIDInterceptor("request-id"), diff --git a/internal/controlplane/server_test.go b/internal/controlplane/server_test.go index e35dfb08cd..e7aae7b7fe 100644 --- a/internal/controlplane/server_test.go +++ b/internal/controlplane/server_test.go @@ -68,6 +68,7 @@ func init() { // It would be nice if we could Close() the httpServer, but we leak it in the test instead } +// nolint: unparam func newDefaultServer( t *testing.T, mockStore *mockdb.MockStore, diff --git a/internal/datasources/factory.go b/internal/datasources/factory.go new file mode 100644 index 0000000000..67ca3f90f5 --- /dev/null +++ b/internal/datasources/factory.go @@ -0,0 +1,35 @@ +// SPDX-FileCopyrightText: Copyright 2023 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package datasources implements data sources for Minder. +package datasources + +import ( + "fmt" + + "github.com/mindersec/minder/internal/datasources/rest" + "github.com/mindersec/minder/internal/datasources/structured" + minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + v1datasources "github.com/mindersec/minder/pkg/datasources/v1" +) + +// BuildFromProtobuf is a factory function that builds a new data source based on the given +// data source type. +func BuildFromProtobuf(ds *minderv1.DataSource) (v1datasources.DataSource, error) { + if ds == nil { + return nil, fmt.Errorf("data source is nil") + } + + if ds.GetDriver() == nil { + return nil, fmt.Errorf("data source driver is nil") + } + + switch ds.GetDriver().(type) { + case *minderv1.DataSource_Structured: + return structured.NewStructDataSource(ds.GetStructured()) + case *minderv1.DataSource_Rest: + return rest.NewRestDataSource(ds.GetRest()) + default: + return nil, fmt.Errorf("unknown data source type: %T", ds) + } +} diff --git a/internal/datasources/rest/handler.go b/internal/datasources/rest/handler.go new file mode 100644 index 0000000000..06a9045283 --- /dev/null +++ b/internal/datasources/rest/handler.go @@ -0,0 +1,279 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package rest + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "io" + "net/http" + "strings" + "time" + + "github.com/cenkalti/backoff/v4" + "github.com/santhosh-tekuri/jsonschema/v6" + uritemplate "github.com/std-uritemplate/std-uritemplate/go/v2" + "google.golang.org/protobuf/types/known/structpb" + + "github.com/mindersec/minder/internal/util" + "github.com/mindersec/minder/internal/util/schemaupdate" + "github.com/mindersec/minder/internal/util/schemavalidate" + minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" +) + +const ( + // MaxBytesLimit is the maximum number of bytes to read from the response body + // We limit to 1MB to prevent abuse + MaxBytesLimit int64 = 1 << 20 +) + +type restHandler struct { + rawInputSchema *structpb.Struct + inputSchema *jsonschema.Schema + endpointTmpl string + method string + // contains the request body or the key + body string + bodyFromInput bool + headers map[string]string + parse string + // TODO implement fallback + // TODO implement auth +} + +func newHandlerFromDef(def *minderv1.RestDataSource_Def) (*restHandler, error) { + if def == nil { + return nil, errors.New("rest data source handler definition is nil") + } + + // schema may be nil + schema, err := schemavalidate.CompileSchemaFromPB(def.GetInputSchema()) + if err != nil { + return nil, err + } + + bodyFromInput, body := parseRequestBodyConfig(def) + + return &restHandler{ + rawInputSchema: def.GetInputSchema(), + inputSchema: schema, + endpointTmpl: def.GetEndpoint(), + method: util.HttpMethodFromString(def.GetMethod(), http.MethodGet), + headers: def.GetHeaders(), + body: body, + bodyFromInput: bodyFromInput, + parse: def.GetParse(), + }, nil +} + +func (h *restHandler) GetArgsSchema() any { + return h.rawInputSchema +} + +func (h *restHandler) ValidateArgs(args any) error { + if h.inputSchema == nil { + return errors.New("input schema cannot be nil") + } + + mapobj, ok := args.(map[string]any) + if !ok { + return errors.New("args is not a map") + } + + return schemavalidate.ValidateAgainstSchema(h.inputSchema, mapobj) +} + +func (h *restHandler) ValidateUpdate(obj any) error { + if obj == nil { + return errors.New("update schema cannot be nil") + } + + switch castedobj := obj.(type) { + case *structpb.Struct: + if _, err := schemavalidate.CompileSchemaFromPB(castedobj); err != nil { + return fmt.Errorf("update validation failed due to invalid schema: %w", err) + } + return schemaupdate.ValidateSchemaUpdate(h.rawInputSchema, castedobj) + case map[string]any: + if _, err := schemavalidate.CompileSchemaFromMap(castedobj); err != nil { + return fmt.Errorf("update validation failed due to invalid schema: %w", err) + } + return schemaupdate.ValidateSchemaUpdateMap(h.rawInputSchema.AsMap(), castedobj) + default: + return errors.New("invalid type") + } +} + +func (h *restHandler) Call(ctx context.Context, args any) (any, error) { + argsMap, ok := args.(map[string]any) + if !ok { + return nil, errors.New("args is not a map") + } + + expandedEndpoint, err := uritemplate.Expand(h.endpointTmpl, argsMap) + if err != nil { + return nil, err + } + + // TODO: Add option to use custom client + cli := &http.Client{ + // TODO: Make timeout configurable + Timeout: 5 * time.Second, + } + + b, err := h.getBody(argsMap) + if err != nil { + return nil, err + } + + req, err := http.NewRequestWithContext(ctx, h.method, expandedEndpoint, b) + if err != nil { + return nil, err + } + + for k, v := range h.headers { + req.Header.Add(k, v) + } + + return h.doRequest(cli, req) +} + +func (h *restHandler) doRequest(cli *http.Client, req *http.Request) (any, error) { + resp, err := retriableDo(cli, req) + if err != nil { + return nil, err + } + + defer resp.Body.Close() + + bout, err := h.parseResponseBody(resp.Body) + if err != nil { + return nil, err + } + + // TODO: Handle fallback here. + + return buildRestOutput(resp.StatusCode, bout), nil +} + +func (h *restHandler) getBody(args map[string]any) (io.Reader, error) { + if h.bodyFromInput { + return h.getBodyFromInput(args) + } + + if h.body == "" { + return nil, nil + } + + return strings.NewReader(h.body), nil +} + +func (h *restHandler) getBodyFromInput(args map[string]any) (io.Reader, error) { + if h.body == "" { + return nil, errors.New("body key is empty") + } + + body, ok := args[h.body] + if !ok { + return nil, fmt.Errorf("body key %q not found in args", h.body) + } + + switch outb := body.(type) { + case string: + return strings.NewReader(outb), nil + case map[string]any: + // stringify the object + obj, err := json.Marshal(outb) + if err != nil { + return nil, fmt.Errorf("cannot marshal body object: %w", err) + } + + return strings.NewReader(string(obj)), nil + default: + return nil, fmt.Errorf("body key %q is not a string or object", h.body) + } +} + +func (h *restHandler) parseResponseBody(body io.Reader) (any, error) { + var data any + + if body == nil { + return nil, nil + } + + lr := io.LimitReader(body, MaxBytesLimit) + + if h.parse == "json" { + var jsonData any + dec := json.NewDecoder(lr) + if err := dec.Decode(&jsonData); err != nil { + return nil, fmt.Errorf("cannot decode json: %w", err) + } + + data = jsonData + } else { + bytedata, err := io.ReadAll(lr) + if err != nil { + return nil, fmt.Errorf("cannot read response body: %w", err) + } + + data = string(bytedata) + } + + return data, nil +} + +func parseRequestBodyConfig(def *minderv1.RestDataSource_Def) (bool, string) { + defBody := def.GetBody() + if defBody == nil { + return false, "" + } + + switch defBody.(type) { + case *minderv1.RestDataSource_Def_Bodyobj: + // stringify the object + obj, err := json.Marshal(def.GetBodyobj()) + if err != nil { + return false, "" + } + + return false, string(obj) + case *minderv1.RestDataSource_Def_BodyFromField: + return true, def.GetBodyFromField() + } + + return false, def.GetBodystr() +} + +func buildRestOutput(statusCode int, body any) any { + return map[string]any{ + "status_code": statusCode, + "body": body, + } +} + +func retriableDo(cli *http.Client, req *http.Request) (*http.Response, error) { + var resp *http.Response + err := backoff.Retry(func() error { + var err error + resp, err = cli.Do(req) + if err != nil { + return err + } + + if resp.StatusCode == http.StatusTooManyRequests { + return errors.New("rate limited") + } + + return nil + }, backoff.WithMaxRetries(backoff.NewExponentialBackOff(), 5)) + + if err != nil { + return nil, err + } + + return resp, nil +} diff --git a/internal/datasources/rest/handler_test.go b/internal/datasources/rest/handler_test.go new file mode 100644 index 0000000000..a9616816e6 --- /dev/null +++ b/internal/datasources/rest/handler_test.go @@ -0,0 +1,475 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package rest + +import ( + "context" + "net/http" + "net/http/httptest" + "testing" + + "github.com/santhosh-tekuri/jsonschema/v6" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/structpb" + + "github.com/mindersec/minder/internal/util/schemavalidate" + minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" +) + +func Test_newHandlerFromDef(t *testing.T) { + t.Parallel() + + type args struct { + def *minderv1.RestDataSource_Def + } + tests := []struct { + name string + args args + want *restHandler + wantErr bool + }{ + { + name: "Nil definition", + args: args{ + def: nil, + }, + want: nil, + wantErr: true, + }, + { + name: "Valid definition", + args: args{ + def: &minderv1.RestDataSource_Def{ + InputSchema: &structpb.Struct{}, + Endpoint: "http://example.com", + Method: "GET", + Headers: map[string]string{"Content-Type": "application/json"}, + Parse: "json", + }, + }, + want: &restHandler{ + rawInputSchema: &structpb.Struct{}, + inputSchema: &jsonschema.Schema{}, + endpointTmpl: "http://example.com", + method: "GET", + headers: map[string]string{"Content-Type": "application/json"}, + body: "", + parse: "json", + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + got, err := newHandlerFromDef(tt.args.def) + if tt.wantErr { + require.Error(t, err) + } else { + require.NoError(t, err) + + assert.Equal(t, tt.want.rawInputSchema.AsMap(), got.rawInputSchema.AsMap()) + assert.Equal(t, tt.want.endpointTmpl, got.endpointTmpl) + assert.Equal(t, tt.want.method, got.method) + assert.Equal(t, tt.want.headers, got.headers) + assert.Equal(t, tt.want.body, got.body) + assert.Equal(t, tt.want.parse, got.parse) + } + }) + } +} + +func Test_parseRequestBodyConfig(t *testing.T) { + t.Parallel() + + type args struct { + def *minderv1.RestDataSource_Def + } + tests := []struct { + name string + args args + want string + wantFromInput bool + }{ + { + name: "Nil body", + args: args{ + def: &minderv1.RestDataSource_Def{}, + }, + want: "", + }, + { + name: "Body as string", + args: args{ + def: &minderv1.RestDataSource_Def{ + Body: &minderv1.RestDataSource_Def_Bodystr{Bodystr: "test body"}, + }, + }, + want: "test body", + }, + { + name: "Body as object", + args: args{ + def: &minderv1.RestDataSource_Def{ + Body: &minderv1.RestDataSource_Def_Bodyobj{ + Bodyobj: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "key": structpb.NewStringValue("value"), + }, + }, + }, + }, + }, + want: `{"key":"value"}`, + }, + { + name: "Body from input", + args: args{ + def: &minderv1.RestDataSource_Def{ + Body: &minderv1.RestDataSource_Def_BodyFromField{ + BodyFromField: "key", + }, + }, + }, + want: "key", + wantFromInput: true, + }, + } + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + gotFromInput, gotStr := parseRequestBodyConfig(tt.args.def) + assert.Equal(t, tt.want, gotStr) + assert.Equal(t, tt.wantFromInput, gotFromInput) + }) + } +} + +func Test_restHandler_Call(t *testing.T) { + t.Parallel() + + type fields struct { + endpointTmpl string + method string + body string + headers map[string]string + parse string + } + type args struct { + args any + } + tests := []struct { + name string + fields fields + args args + want any + wantErr bool + mockStatus int + mockBody string + }{ + { + name: "Example test case", + fields: fields{ + endpointTmpl: "/example", + method: "GET", + headers: map[string]string{"Content-Type": "application/json"}, + // No parsing + parse: "", + }, + args: args{args: map[string]any{}}, + want: buildRestOutput(http.StatusOK, `{"key":"value"}`), + wantErr: false, + mockStatus: http.StatusOK, + mockBody: `{"key":"value"}`, + }, + { + name: "Invalid method", + fields: fields{ + endpointTmpl: "/invalid-method", + method: "INVALID", + headers: map[string]string{"Content-Type": "application/json"}, + parse: "", + }, + args: args{args: map[string]any{}}, + want: buildRestOutput(http.StatusMethodNotAllowed, `{"error":"method not allowed"}`), + wantErr: false, + mockStatus: http.StatusMethodNotAllowed, + mockBody: `{"error":"method not allowed"}`, + }, + { + name: "JSON parsing", + fields: fields{ + endpointTmpl: "/json", + method: "GET", + headers: map[string]string{"Content-Type": "application/json"}, + parse: "json", + }, + args: args{args: map[string]any{}}, + want: buildRestOutput(http.StatusOK, map[string]any{"key": "value"}), + wantErr: false, + mockStatus: http.StatusOK, + mockBody: `{"key":"value"}`, + }, + { + name: "Non-JSON response", + fields: fields{ + endpointTmpl: "/non-json", + method: "GET", + headers: map[string]string{"Content-Type": "application/json"}, + parse: "", + }, + args: args{args: map[string]any{}}, + want: buildRestOutput(http.StatusOK, "plain text response"), + wantErr: false, + mockStatus: http.StatusOK, + mockBody: "plain text response", + }, + } + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + // Create a new httptest.Server + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(tt.mockStatus) + _, err := w.Write([]byte(tt.mockBody)) + require.NoError(t, err) + })) + defer server.Close() + + // Update endpointTmpl to use the test server URL + tt.fields.endpointTmpl = server.URL + tt.fields.endpointTmpl + + h := &restHandler{ + endpointTmpl: tt.fields.endpointTmpl, + method: tt.fields.method, + body: tt.fields.body, + headers: tt.fields.headers, + parse: tt.fields.parse, + } + got, err := h.Call(context.Background(), tt.args.args) + if tt.wantErr { + assert.Error(t, err) + } else { + assert.NoError(t, err) + } + assert.Equal(t, tt.want, got) + }) + } +} + +func Test_restHandler_ValidateArgs(t *testing.T) { + t.Parallel() + + type fields struct { + inputSchema *jsonschema.Schema + endpointTmpl string + method string + body string + headers map[string]string + parse string + } + type args struct { + args any + } + tests := []struct { + name string + fields fields + args args + wantErr bool + }{ + { + name: "Valid args", + fields: fields{ + inputSchema: func() *jsonschema.Schema { + schema, err := schemavalidate.CompileSchemaFromMap( + map[string]any{"type": "object", "properties": map[string]any{"key": map[string]any{"type": "string"}}}, + ) + require.NoError(t, err) + return schema + }(), + }, + args: args{ + args: map[string]any{"key": "value"}, + }, + wantErr: false, + }, + { + name: "Invalid args type", + fields: fields{ + inputSchema: func() *jsonschema.Schema { + schema, err := schemavalidate.CompileSchemaFromMap( + map[string]any{"type": "object", "properties": map[string]any{"key": map[string]any{"type": "string"}}}, + ) + require.NoError(t, err) + return schema + }(), + }, + args: args{ + args: "invalid_type", + }, + wantErr: true, + }, + { + name: "Invalid args value", + fields: fields{ + inputSchema: func() *jsonschema.Schema { + schema, err := schemavalidate.CompileSchemaFromMap( + map[string]any{"type": "object", "properties": map[string]any{"key": map[string]any{"type": "string"}}}, + ) + require.NoError(t, err) + return schema + }(), + }, + args: args{ + args: map[string]any{"key": 123}, + }, + wantErr: true, + }, + { + name: "No schema", + fields: fields{ + inputSchema: nil, + }, + args: args{ + args: map[string]any{"key": "value"}, + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + h := &restHandler{ + inputSchema: tt.fields.inputSchema, + endpointTmpl: tt.fields.endpointTmpl, + method: tt.fields.method, + body: tt.fields.body, + headers: tt.fields.headers, + parse: tt.fields.parse, + } + err := h.ValidateArgs(tt.args.args) + if tt.wantErr { + assert.Error(t, err) + } else { + assert.NoError(t, err) + } + }) + } +} + +func Test_restHandler_ValidateUpdate(t *testing.T) { + t.Parallel() + + type args struct { + updateSchema any + } + tests := []struct { + name string + inputSchema map[string]any + args args + wantErr bool + }{ + { + name: "Valid structpb.Struct", + inputSchema: map[string]any{ + "type": "object", + "properties": map[string]any{ + "key": map[string]any{ + "type": "string", + }, + }, + }, + args: args{ + updateSchema: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "type": structpb.NewStringValue("object"), + "properties": structpb.NewStructValue(&structpb.Struct{ + Fields: map[string]*structpb.Value{ + "key": structpb.NewStructValue(&structpb.Struct{ + Fields: map[string]*structpb.Value{ + "type": structpb.NewStringValue("string"), + }, + }), + "new_key": structpb.NewStructValue(&structpb.Struct{ + Fields: map[string]*structpb.Value{ + "type": structpb.NewStringValue("number"), + }, + }), + }, + }), + }, + }, + }, + wantErr: false, + }, + { + name: "Valid map[string]any", + inputSchema: map[string]any{ + "type": "object", + "properties": map[string]any{"key": map[string]any{"type": "string"}}, + }, + args: args{ + updateSchema: map[string]any{ + "type": "object", + "properties": map[string]any{ + "key": map[string]any{"type": "string"}, + "new_key": map[string]any{"type": "number"}, + }, + }, + }, + wantErr: false, + }, + { + name: "Invalid type", + inputSchema: map[string]any{ + "type": "object", + "properties": map[string]any{"key": map[string]any{"type": "string"}}, + }, + args: args{ + updateSchema: "invalid_type", + }, + wantErr: true, + }, + { + name: "nil update schema", + inputSchema: map[string]any{ + "type": "object", + "properties": map[string]any{"key": map[string]any{"type": "string"}}, + }, + args: args{ + updateSchema: nil, + }, + wantErr: true, + }, + } + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + s, err := structpb.NewStruct(tt.inputSchema) + require.NoError(t, err, "failed to create structpb.Struct") + + h := &restHandler{ + rawInputSchema: s, + } + + // Validate that the input schema is a valid JSON schema + _, err = schemavalidate.CompileSchemaFromMap(tt.inputSchema) + require.NoError(t, err, "input schema is not a valid JSON schema") + + err = h.ValidateUpdate(tt.args.updateSchema) + if tt.wantErr { + assert.Error(t, err) + } else { + assert.NoError(t, err) + } + }) + } +} diff --git a/internal/datasources/rest/rest.go b/internal/datasources/rest/rest.go new file mode 100644 index 0000000000..312a02406e --- /dev/null +++ b/internal/datasources/rest/rest.go @@ -0,0 +1,67 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package rest implements a REST data source. +// +// The REST data source is a data source that can be used to fetch data from a +// REST API. The data source is defined in the Minder API as a REST data source +// definition. The definition contains a set of handlers that define how to +// fetch data from the REST API. +// +// It gives the caller a simple structured output to represent the +// result of the REST call. +// +// An example of the output is: +// +// { +// "status_code": 200, +// "body": { +// "key": "value" +// } +// } +package rest + +import ( + "errors" + + minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + v1datasources "github.com/mindersec/minder/pkg/datasources/v1" +) + +type restDataSource struct { + handlers map[v1datasources.DataSourceFuncKey]v1datasources.DataSourceFuncDef +} + +// ensure that restDataSource implements the v1datasources.DataSource interface +var _ v1datasources.DataSource = (*restDataSource)(nil) + +// GetFuncs implements the v1datasources.DataSource interface. +func (r *restDataSource) GetFuncs() map[v1datasources.DataSourceFuncKey]v1datasources.DataSourceFuncDef { + return r.handlers +} + +// NewRestDataSource builds a new REST data source. +func NewRestDataSource(rest *minderv1.RestDataSource) (v1datasources.DataSource, error) { + if rest == nil { + return nil, errors.New("rest data source is nil") + } + + if rest.GetDef() == nil { + return nil, errors.New("rest data source definition is nil") + } + + out := &restDataSource{ + handlers: make(map[v1datasources.DataSourceFuncKey]v1datasources.DataSourceFuncDef, len(rest.GetDef())), + } + + for key, handlerCfg := range rest.GetDef() { + handler, err := newHandlerFromDef(handlerCfg) + if err != nil { + return nil, err + } + + out.handlers[v1datasources.DataSourceFuncKey(key)] = handler + } + + return out, nil +} diff --git a/internal/datasources/service/convert.go b/internal/datasources/service/convert.go new file mode 100644 index 0000000000..ee772504e9 --- /dev/null +++ b/internal/datasources/service/convert.go @@ -0,0 +1,88 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package service + +import ( + "errors" + "fmt" + + "google.golang.org/protobuf/encoding/protojson" + + "github.com/mindersec/minder/internal/db" + minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + v1datasources "github.com/mindersec/minder/pkg/datasources/v1" +) + +func dataSourceDBToProtobuf(ds db.DataSource, dsfuncs []db.DataSourcesFunction) (*minderv1.DataSource, error) { + outds := &minderv1.DataSource{ + Version: minderv1.VersionV1, + Type: string(minderv1.DataSourceResource), + Id: ds.ID.String(), + Name: ds.Name, + Context: &minderv1.ContextV2{ + ProjectId: ds.ProjectID.String(), + }, + } + + if len(dsfuncs) == 0 { + return nil, errors.New("data source is invalid and has no defintions") + } + + // All data source types should be equal... so we'll just take the first one. + dsfType := dsfuncs[0].Type + + switch dsfType { + case v1datasources.DataSourceDriverStruct: + return dataSourceStructDBToProtobuf(outds, dsfuncs) + case v1datasources.DataSourceDriverRest: + return dataSourceRestDBToProtobuf(outds, dsfuncs) + default: + return nil, fmt.Errorf("unknown data source type: %s", dsfType) + } +} + +func dataSourceRestDBToProtobuf(ds *minderv1.DataSource, dsfuncs []db.DataSourcesFunction) (*minderv1.DataSource, error) { + // At this point we have already validated that we have at least one function. + ds.Driver = &minderv1.DataSource_Rest{ + Rest: &minderv1.RestDataSource{ + Def: make(map[string]*minderv1.RestDataSource_Def, len(dsfuncs)), + }, + } + + for _, dsf := range dsfuncs { + key := dsf.Name + dsfToParse := &minderv1.RestDataSource_Def{} + if err := protojson.Unmarshal(dsf.Definition, dsfToParse); err != nil { + return nil, fmt.Errorf("failed to unmarshal data source definition for %s: %w", key, err) + } + + ds.GetRest().Def[key] = dsfToParse + } + + return ds, nil +} + +func dataSourceStructDBToProtobuf(ds *minderv1.DataSource, dsfuncs []db.DataSourcesFunction) (*minderv1.DataSource, error) { + structured := &minderv1.StructDataSource{ + Def: make(map[string]*minderv1.StructDataSource_Def, len(dsfuncs)), + } + + for _, dsf := range dsfuncs { + key := dsf.Name + dsfToParse := &minderv1.StructDataSource_Def{ + Path: &minderv1.StructDataSource_Def_Path{}, + } + if err := protojson.Unmarshal(dsf.Definition, dsfToParse); err != nil { + return nil, fmt.Errorf("failed to unmarshal data source definition for %s: %w", key, err) + } + + structured.Def[key] = dsfToParse + } + + ds.Driver = &minderv1.DataSource_Structured{ + Structured: structured, + } + + return ds, nil +} diff --git a/internal/datasources/service/helpers.go b/internal/datasources/service/helpers.go new file mode 100644 index 0000000000..58111e86e5 --- /dev/null +++ b/internal/datasources/service/helpers.go @@ -0,0 +1,145 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package service + +import ( + "context" + "errors" + "fmt" + + "github.com/google/uuid" + "google.golang.org/grpc/codes" + + "github.com/mindersec/minder/internal/datasources" + "github.com/mindersec/minder/internal/db" + "github.com/mindersec/minder/internal/util" + minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" +) + +func (d *dataSourceService) getDataSourceSomehow( + ctx context.Context, + project uuid.UUID, + opts *ReadOptions, + theSomehow func(ctx context.Context, qtx db.ExtendQuerier, projs []uuid.UUID) (db.DataSource, error), +) (*minderv1.DataSource, error) { + stx, err := d.txBuilder(d, opts) + if err != nil { + return nil, fmt.Errorf("failed to start transaction: %w", err) + } + + //nolint:gosec // we'll log this error later. + defer stx.Rollback() + + tx := stx.Q() + + var projs []uuid.UUID + if len(opts.hierarchy) > 0 { + projs = opts.hierarchy + } else { + prjs, err := listRelevantProjects(ctx, tx, project, opts.canSearchHierarchical()) + if err != nil { + return nil, fmt.Errorf("failed to list relevant projects: %w", err) + } + + projs = prjs + } + + ds, err := theSomehow(ctx, tx, projs) + if err != nil { + return nil, fmt.Errorf("failed to get data source by name: %w", err) + } + + dsfuncs, err := tx.ListDataSourceFunctions(ctx, db.ListDataSourceFunctionsParams{ + DataSourceID: ds.ID, + ProjectID: ds.ProjectID, + }) + if err != nil { + return nil, fmt.Errorf("failed to get data source functions: %w", err) + } + + // NOTE: We currently treat data sources without functions as an error. + // The only reason for this is that I (Ozz) currently see no use-case for + // data sources without functions. If we ever have a use-case for this, we + // should remove this check. + if len(dsfuncs) == 0 { + return nil, errors.New("data source has no functions") + } + + if err := stx.Commit(); err != nil { + return nil, fmt.Errorf("failed to commit transaction: %w", err) + } + + return dataSourceDBToProtobuf(ds, dsfuncs) +} + +func (d *dataSourceService) instantiateDataSource( + ctx context.Context, + ref *minderv1.DataSourceReference, + projectHierarchy []uuid.UUID, + tx db.ExtendQuerier, +) (*minderv1.DataSource, error) { + // If we end up supporting other ways of referencing a data source, this + // would be the place to validate them. + if ref.GetName() == "" { + return nil, errors.New("data source name is empty") + } + + ds, err := d.GetByName(ctx, ref.GetName(), uuid.Nil, + ReadBuilder().withHierarchy(projectHierarchy).WithTransaction(tx)) + if err != nil { + return nil, fmt.Errorf("failed to get data source by name: %w", err) + } + + return ds, nil +} + +func listRelevantProjects( + ctx context.Context, tx db.ExtendQuerier, project uuid.UUID, hierarchical bool, +) ([]uuid.UUID, error) { + if hierarchical { + projs, err := tx.GetParentProjects(ctx, project) + if err != nil { + return nil, err + } + + return projs, nil + } + + return []uuid.UUID{project}, nil +} + +func validateDataSourceFunctionsUpdate( + existingDS, newDS *minderv1.DataSource, +) error { + existingImpl, err := datasources.BuildFromProtobuf(existingDS) + if err != nil { + // If we got here, it means the existing data source is invalid. + return fmt.Errorf("failed to build data source from protobuf: %w", err) + } + + updatedImpl, err := datasources.BuildFromProtobuf(newDS) + if err != nil { + return fmt.Errorf("failed to build data source from protobuf: %w", err) + } + + // We can't validate that the function is not being used. So, we + // prevent folks from deleting functions. + // Updates are thus limited to adding new functions and updating existing ones. + newFuncs := updatedImpl.GetFuncs() + for key, def := range existingImpl.GetFuncs() { + newFunc, ok := newFuncs[key] + if !ok { + return util.UserVisibleError(codes.InvalidArgument, + "function %s is missing in the update", key) + } + + // we validate that the schema update is valid + if err := def.ValidateUpdate(newFunc.GetArgsSchema()); err != nil { + return util.UserVisibleError(codes.InvalidArgument, + "function %s update is invalid: %v", key, err) + } + } + + return nil +} diff --git a/internal/datasources/service/mock/fixtures/service.go b/internal/datasources/service/mock/fixtures/service.go new file mode 100644 index 0000000000..8bb3f00174 --- /dev/null +++ b/internal/datasources/service/mock/fixtures/service.go @@ -0,0 +1,77 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package fixtures contains code for creating DataSourceService +// fixtures and is used in various parts of the code. For testing use +// only. +// +//nolint:all +package fixtures + +import ( + "errors" + + "github.com/google/uuid" + mockdssvc "github.com/mindersec/minder/internal/datasources/service/mock" + minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + "go.uber.org/mock/gomock" +) + +type ( + DataSourcesSvcMock = *mockdssvc.MockDataSourcesService + DataSourcesSvcMockBuilder = func(*gomock.Controller) DataSourcesSvcMock +) + +func NewDataSourcesServiceMock(opts ...func(mock DataSourcesSvcMock)) DataSourcesSvcMockBuilder { + return func(ctrl *gomock.Controller) DataSourcesSvcMock { + mock := mockdssvc.NewMockDataSourcesService(ctrl) + for _, opt := range opts { + opt(mock) + } + return mock + } +} + +var ( + errDefault = errors.New("error during data sources service operation") +) + +func WithSuccessfulListDataSources(datasources ...*minderv1.DataSource) func(DataSourcesSvcMock) { + return func(mock DataSourcesSvcMock) { + mock.EXPECT(). + List(gomock.Any(), gomock.Any(), gomock.Any()). + Return(datasources, nil) + } +} + +func WithFailedListDataSources() func(DataSourcesSvcMock) { + return func(mock DataSourcesSvcMock) { + mock.EXPECT(). + List(gomock.Any(), gomock.Any(), gomock.Any()). + Return(nil, errDefault) + } +} + +func WithSuccessfulGetByName(projectID uuid.UUID, datasource *minderv1.DataSource) func(DataSourcesSvcMock) { + return func(mock DataSourcesSvcMock) { + mock.EXPECT(). + GetByName(gomock.Any(), datasource.Name, projectID, gomock.Any()). + Return(datasource, nil) + } +} + +func WithNotFoundGetByName(projectID uuid.UUID) func(DataSourcesSvcMock) { + return func(mock DataSourcesSvcMock) { + mock.EXPECT(). + GetByName(gomock.Any(), gomock.Any(), projectID, gomock.Any()). + Return(&minderv1.DataSource{}, errDefault) + } +} + +func WithFailedGetByName() func(DataSourcesSvcMock) { + return func(mock DataSourcesSvcMock) { + mock.EXPECT(). + GetByName(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()). + Return(nil, errDefault) + } +} diff --git a/internal/datasources/service/mock/service.go b/internal/datasources/service/mock/service.go new file mode 100644 index 0000000000..73e38dacf2 --- /dev/null +++ b/internal/datasources/service/mock/service.go @@ -0,0 +1,149 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: ./service.go +// +// Generated by this command: +// +// mockgen -package mock_service -destination=./mock/service.go -source=./service.go +// + +// Package mock_service is a generated GoMock package. +package mock_service + +import ( + context "context" + reflect "reflect" + + uuid "github.com/google/uuid" + service "github.com/mindersec/minder/internal/datasources/service" + v1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + v10 "github.com/mindersec/minder/pkg/datasources/v1" + gomock "go.uber.org/mock/gomock" +) + +// MockDataSourcesService is a mock of DataSourcesService interface. +type MockDataSourcesService struct { + ctrl *gomock.Controller + recorder *MockDataSourcesServiceMockRecorder + isgomock struct{} +} + +// MockDataSourcesServiceMockRecorder is the mock recorder for MockDataSourcesService. +type MockDataSourcesServiceMockRecorder struct { + mock *MockDataSourcesService +} + +// NewMockDataSourcesService creates a new mock instance. +func NewMockDataSourcesService(ctrl *gomock.Controller) *MockDataSourcesService { + mock := &MockDataSourcesService{ctrl: ctrl} + mock.recorder = &MockDataSourcesServiceMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockDataSourcesService) EXPECT() *MockDataSourcesServiceMockRecorder { + return m.recorder +} + +// BuildDataSourceRegistry mocks base method. +func (m *MockDataSourcesService) BuildDataSourceRegistry(ctx context.Context, rt *v1.RuleType, opts *service.Options) (*v10.DataSourceRegistry, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BuildDataSourceRegistry", ctx, rt, opts) + ret0, _ := ret[0].(*v10.DataSourceRegistry) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// BuildDataSourceRegistry indicates an expected call of BuildDataSourceRegistry. +func (mr *MockDataSourcesServiceMockRecorder) BuildDataSourceRegistry(ctx, rt, opts any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BuildDataSourceRegistry", reflect.TypeOf((*MockDataSourcesService)(nil).BuildDataSourceRegistry), ctx, rt, opts) +} + +// Create mocks base method. +func (m *MockDataSourcesService) Create(ctx context.Context, ds *v1.DataSource, opts *service.Options) (*v1.DataSource, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Create", ctx, ds, opts) + ret0, _ := ret[0].(*v1.DataSource) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Create indicates an expected call of Create. +func (mr *MockDataSourcesServiceMockRecorder) Create(ctx, ds, opts any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*MockDataSourcesService)(nil).Create), ctx, ds, opts) +} + +// Delete mocks base method. +func (m *MockDataSourcesService) Delete(ctx context.Context, id, project uuid.UUID, opts *service.Options) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Delete", ctx, id, project, opts) + ret0, _ := ret[0].(error) + return ret0 +} + +// Delete indicates an expected call of Delete. +func (mr *MockDataSourcesServiceMockRecorder) Delete(ctx, id, project, opts any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockDataSourcesService)(nil).Delete), ctx, id, project, opts) +} + +// GetByID mocks base method. +func (m *MockDataSourcesService) GetByID(ctx context.Context, id, project uuid.UUID, opts *service.ReadOptions) (*v1.DataSource, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetByID", ctx, id, project, opts) + ret0, _ := ret[0].(*v1.DataSource) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetByID indicates an expected call of GetByID. +func (mr *MockDataSourcesServiceMockRecorder) GetByID(ctx, id, project, opts any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetByID", reflect.TypeOf((*MockDataSourcesService)(nil).GetByID), ctx, id, project, opts) +} + +// GetByName mocks base method. +func (m *MockDataSourcesService) GetByName(ctx context.Context, name string, project uuid.UUID, opts *service.ReadOptions) (*v1.DataSource, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetByName", ctx, name, project, opts) + ret0, _ := ret[0].(*v1.DataSource) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetByName indicates an expected call of GetByName. +func (mr *MockDataSourcesServiceMockRecorder) GetByName(ctx, name, project, opts any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetByName", reflect.TypeOf((*MockDataSourcesService)(nil).GetByName), ctx, name, project, opts) +} + +// List mocks base method. +func (m *MockDataSourcesService) List(ctx context.Context, project uuid.UUID, opts *service.ReadOptions) ([]*v1.DataSource, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "List", ctx, project, opts) + ret0, _ := ret[0].([]*v1.DataSource) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// List indicates an expected call of List. +func (mr *MockDataSourcesServiceMockRecorder) List(ctx, project, opts any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockDataSourcesService)(nil).List), ctx, project, opts) +} + +// Update mocks base method. +func (m *MockDataSourcesService) Update(ctx context.Context, ds *v1.DataSource, opts *service.Options) (*v1.DataSource, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Update", ctx, ds, opts) + ret0, _ := ret[0].(*v1.DataSource) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Update indicates an expected call of Update. +func (mr *MockDataSourcesServiceMockRecorder) Update(ctx, ds, opts any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockDataSourcesService)(nil).Update), ctx, ds, opts) +} diff --git a/internal/datasources/service/options.go b/internal/datasources/service/options.go new file mode 100644 index 0000000000..1ece616433 --- /dev/null +++ b/internal/datasources/service/options.go @@ -0,0 +1,90 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package service + +import ( + "github.com/google/uuid" + + "github.com/mindersec/minder/internal/db" +) + +// Options is a struct that contains the options for a service call +type Options struct { + qtx db.ExtendQuerier +} + +// OptionsBuilder is a function that returns a new Options struct +func OptionsBuilder() *Options { + return &Options{} +} + +// WithTransaction is a function that sets the transaction field in the Options struct +func (o *Options) WithTransaction(qtx db.ExtendQuerier) *Options { + if o == nil { + return nil + } + o.qtx = qtx + return o +} + +func (o *Options) getTransaction() db.ExtendQuerier { + if o == nil { + return nil + } + return o.qtx +} + +type txGetter interface { + getTransaction() db.ExtendQuerier +} + +// ReadOptions is a struct that contains the options for a read service call +// This extends the Options struct and adds a hierarchical field. +type ReadOptions struct { + Options + hierarchical bool + + // Use the actual project hierarchy to search for the data source. + hierarchy []uuid.UUID +} + +// ReadBuilder is a function that returns a new ReadOptions struct +func ReadBuilder() *ReadOptions { + return &ReadOptions{} +} + +// Hierarchical allows the service to search in the project hierarchy +func (o *ReadOptions) Hierarchical() *ReadOptions { + if o == nil { + return nil + } + o.hierarchical = true + return o +} + +// WithTransaction is a function that sets the transaction field in the Options struct +func (o *ReadOptions) WithTransaction(qtx db.ExtendQuerier) *ReadOptions { + if o == nil { + return nil + } + o.qtx = qtx + return o +} + +// withHierarchy allows the service to search in the project hierarchy. +// This is left internal for now to disallow external use. +func (o *ReadOptions) withHierarchy(projs []uuid.UUID) *ReadOptions { + if o == nil { + return nil + } + o.hierarchy = projs + return o +} + +func (o *ReadOptions) canSearchHierarchical() bool { + if o == nil { + return false + } + return o.hierarchical +} diff --git a/internal/datasources/service/service.go b/internal/datasources/service/service.go new file mode 100644 index 0000000000..375f0eadc9 --- /dev/null +++ b/internal/datasources/service/service.go @@ -0,0 +1,472 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package service encodes the business logic for dealing with data sources. +package service + +import ( + "context" + "database/sql" + "errors" + "fmt" + + "github.com/google/uuid" + "github.com/rs/zerolog" + "google.golang.org/grpc/codes" + "google.golang.org/protobuf/encoding/protojson" + + "github.com/mindersec/minder/internal/datasources" + "github.com/mindersec/minder/internal/db" + "github.com/mindersec/minder/internal/util" + minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + v1datasources "github.com/mindersec/minder/pkg/datasources/v1" +) + +//go:generate go run go.uber.org/mock/mockgen -package mock_$GOPACKAGE -destination=./mock/$GOFILE -source=./$GOFILE + +// DataSourcesService is an interface that defines the methods for the data sources service. +type DataSourcesService interface { + // GetByName returns a data source by name. + GetByName(ctx context.Context, name string, project uuid.UUID, opts *ReadOptions) (*minderv1.DataSource, error) + + // GetByID returns a data source by ID. + GetByID(ctx context.Context, id uuid.UUID, project uuid.UUID, opts *ReadOptions) (*minderv1.DataSource, error) + + // List lists all data sources in the given project. + List(ctx context.Context, project uuid.UUID, opts *ReadOptions) ([]*minderv1.DataSource, error) + + // Create creates a new data source. + Create(ctx context.Context, ds *minderv1.DataSource, opts *Options) (*minderv1.DataSource, error) + + // Update updates an existing data source. + Update(ctx context.Context, ds *minderv1.DataSource, opts *Options) (*minderv1.DataSource, error) + + // Delete deletes a data source in the given project. + // + // Note that one cannot delete a data source that is in use by a rule type. + Delete(ctx context.Context, id uuid.UUID, project uuid.UUID, opts *Options) error + + // BuildDataSourceRegistry bundles up all data sources referenced in the rule type + // into a registry. + BuildDataSourceRegistry(ctx context.Context, rt *minderv1.RuleType, opts *Options) (*v1datasources.DataSourceRegistry, error) +} + +type dataSourceService struct { + store db.Store + + // This is a function that will begin a transaction for the service. + // We make this a function so that we can mock it in tests. + txBuilder func(d *dataSourceService, opts txGetter) (serviceTX, error) +} + +// NewDataSourceService creates a new data source service. +func NewDataSourceService(store db.Store) *dataSourceService { + return &dataSourceService{ + store: store, + txBuilder: beginTx, + } +} + +// WithTransactionBuilder sets the transaction builder for the data source service. +// +// Note this is mostly just useful for testing. +func (d *dataSourceService) WithTransactionBuilder(txBuilder func(d *dataSourceService, opts txGetter) (serviceTX, error)) { + d.txBuilder = txBuilder +} + +// Ensure that dataSourceService implements DataSourcesService. +var _ DataSourcesService = (*dataSourceService)(nil) + +func (d *dataSourceService) GetByName( + ctx context.Context, name string, project uuid.UUID, opts *ReadOptions) (*minderv1.DataSource, error) { + return d.getDataSourceSomehow( + ctx, project, opts, func(ctx context.Context, tx db.ExtendQuerier, projs []uuid.UUID, + ) (db.DataSource, error) { + ds, err := tx.GetDataSourceByName(ctx, db.GetDataSourceByNameParams{ + Name: name, + Projects: projs, + }) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return db.DataSource{}, util.UserVisibleError(codes.NotFound, + "data source of name %s not found", name) + } + return db.DataSource{}, fmt.Errorf("failed to get data source by name: %w", err) + } + + return ds, nil + }) +} + +func (d *dataSourceService) GetByID( + ctx context.Context, id uuid.UUID, project uuid.UUID, opts *ReadOptions) (*minderv1.DataSource, error) { + return d.getDataSourceSomehow( + ctx, project, opts, func(ctx context.Context, tx db.ExtendQuerier, projs []uuid.UUID, + ) (db.DataSource, error) { + ds, err := tx.GetDataSource(ctx, db.GetDataSourceParams{ + ID: id, + Projects: projs, + }) + if errors.Is(err, sql.ErrNoRows) { + return db.DataSource{}, util.UserVisibleError(codes.NotFound, + "data source of id %s not found", id.String()) + } + if err != nil { + return db.DataSource{}, fmt.Errorf("failed to get data source by name: %w", err) + } + + return ds, nil + }) +} + +func (d *dataSourceService) List( + ctx context.Context, project uuid.UUID, opts *ReadOptions) ([]*minderv1.DataSource, error) { + stx, err := d.txBuilder(d, opts) + if err != nil { + return nil, fmt.Errorf("failed to start transaction: %w", err) + } + + //nolint:gosec // we'll log this error later. + defer stx.Rollback() + + tx := stx.Q() + + projs, err := listRelevantProjects(ctx, tx, project, opts.canSearchHierarchical()) + if err != nil { + return nil, fmt.Errorf("failed to list relevant projects: %w", err) + } + + dss, err := tx.ListDataSources(ctx, projs) + if err != nil { + return nil, fmt.Errorf("failed to list data sources: %w", err) + } + + outDS := make([]*minderv1.DataSource, len(dss)) + + for i, ds := range dss { + dsfuncs, err := tx.ListDataSourceFunctions(ctx, db.ListDataSourceFunctionsParams{ + DataSourceID: ds.ID, + ProjectID: ds.ProjectID, + }) + if err != nil { + return nil, fmt.Errorf("failed to list data source functions: %w", err) + } + + dsProtobuf, err := dataSourceDBToProtobuf(ds, dsfuncs) + if err != nil { + return nil, fmt.Errorf("failed to convert data source to protobuf: %w", err) + } + + outDS[i] = dsProtobuf + } + + if err := stx.Commit(); err != nil { + return nil, fmt.Errorf("failed to commit transaction: %w", err) + } + + return outDS, nil +} + +// Create creates a new data source. +// +// Create handles data source creation by using a transaction to ensure atomicity. +// We first validate the data source name uniqueness, then create the data source record. +// Finally, we create function records based on the driver type. +func (d *dataSourceService) Create( + ctx context.Context, ds *minderv1.DataSource, opts *Options) (*minderv1.DataSource, error) { + if err := ds.Validate(); err != nil { + return nil, fmt.Errorf("data source validation failed: %w", err) + } + + stx, err := d.txBuilder(d, opts) + if err != nil { + return nil, fmt.Errorf("failed to start transaction: %w", err) + } + + defer func(stx serviceTX) { + err := stx.Rollback() + if err != nil { + zerolog.Ctx(ctx).Error().Err(err).Msg("failed to rollback transaction") + } + }(stx) + + tx := stx.Q() + + projectID, err := uuid.Parse(ds.GetContext().GetProjectId()) + if err != nil { + return nil, fmt.Errorf("invalid project ID: %w", err) + } + + // Check if such data source already exists in project hierarchy + projs, err := listRelevantProjects(ctx, tx, projectID, true) + if err != nil { + return nil, fmt.Errorf("failed to list relevant projects: %w", err) + } + existing, err := tx.GetDataSourceByName(ctx, db.GetDataSourceByNameParams{ + Name: ds.GetName(), + Projects: projs, + }) + if err != nil && !errors.Is(err, sql.ErrNoRows) { + return nil, fmt.Errorf("failed to check for existing data source: %w", err) + } + if existing.ID != uuid.Nil { + return nil, util.UserVisibleError(codes.AlreadyExists, + "data source with name %s already exists", ds.GetName()) + } + + // Create data source record + dsRecord, err := tx.CreateDataSource(ctx, db.CreateDataSourceParams{ + ProjectID: projectID, + Name: ds.GetName(), + DisplayName: ds.GetName(), + }) + if err != nil { + return nil, fmt.Errorf("failed to create data source: %w", err) + } + + // Create function records based on driver type + if err := addDataSourceFunctions(ctx, tx, ds, dsRecord.ID, projectID); err != nil { + return nil, fmt.Errorf("failed to create data source functions: %w", err) + } + + if err := stx.Commit(); err != nil { + return nil, fmt.Errorf("failed to commit transaction: %w", err) + } + + return ds, nil +} + +// Update updates an existing data source and its functions. +// +// Update handles data source modifications by using a transaction to ensure atomicity. +// We first validate and verify the data source exists, then update its basic info. +// For functions, we take a "delete and recreate" approach rather than individual updates +// because it's simpler and safer - it ensures consistency and avoids partial updates. +// All functions must use the same driver type to maintain data source integrity. +func (d *dataSourceService) Update( + ctx context.Context, ds *minderv1.DataSource, opts *Options) (*minderv1.DataSource, error) { + if err := ds.Validate(); err != nil { + return nil, fmt.Errorf("data source validation failed: %w", err) + } + + stx, err := d.txBuilder(d, opts) + if err != nil { + return nil, fmt.Errorf("failed to start transaction: %w", err) + } + + defer func(stx serviceTX) { + err := stx.Rollback() + if err != nil { + zerolog.Ctx(ctx).Error().Err(err).Msg("failed to rollback transaction") + } + }(stx) + + tx := stx.Q() + + projectID, err := uuid.Parse(ds.GetContext().GetProjectId()) + if err != nil { + return nil, fmt.Errorf("invalid project ID: %w", err) + } + + // Build existing data source + existingDS, err := d.GetByName(ctx, ds.GetName(), projectID, ReadBuilder().WithTransaction(tx)) + if err != nil { + return nil, fmt.Errorf("failed to get existing data source: %w", err) + } + + existingDSID, err := uuid.Parse(existingDS.Id) + if err != nil { + // This should not happen + return nil, fmt.Errorf("invalid data source ID: %w", err) + } + + if err := validateDataSourceFunctionsUpdate(existingDS, ds); err != nil { + return nil, err + } + + if _, err := tx.UpdateDataSource(ctx, db.UpdateDataSourceParams{ + ID: existingDSID, + ProjectID: projectID, + DisplayName: ds.GetName(), + }); err != nil { + return nil, fmt.Errorf("failed to update data source: %w", err) + } + + if _, err := tx.DeleteDataSourceFunctions(ctx, db.DeleteDataSourceFunctionsParams{ + DataSourceID: existingDSID, + ProjectID: projectID, + }); err != nil { + return nil, fmt.Errorf("failed to delete existing functions: %w", err) + } + + if err := addDataSourceFunctions(ctx, tx, ds, existingDSID, projectID); err != nil { + return nil, fmt.Errorf("failed to create data source functions: %w", err) + } + + if err := stx.Commit(); err != nil { + return nil, fmt.Errorf("failed to commit transaction: %w", err) + } + + if ds.Id == "" { + ds.Id = existingDSID.String() + } + + return ds, nil +} + +// Delete deletes a data source in the given project. +func (d *dataSourceService) Delete( + ctx context.Context, id uuid.UUID, project uuid.UUID, opts *Options) error { + stx, err := d.txBuilder(d, opts) + if err != nil { + return fmt.Errorf("failed to start transaction: %w", err) + } + defer func(stx serviceTX) { + err := stx.Rollback() + if err != nil { + zerolog.Ctx(ctx).Error().Err(err).Msg("failed to rollback transaction") + } + }(stx) + + // Get the transaction querier + tx := stx.Q() + + // List rule types referencing the data source + ret, err := tx.ListRuleTypesReferencesByDataSource(ctx, id) + if err != nil { + return fmt.Errorf("failed to list rule types referencing data source %s: %w", id, err) + } + + // Check if the data source is in use by any rule types + if len(ret) > 0 { + // Return an error with the rule types that are using the data source + var existingRefs []string + for _, r := range ret { + existingRefs = append(existingRefs, r.RuleTypeID.String()) + } + return util.UserVisibleError(codes.FailedPrecondition, + "data source %s is in use by the following rule types: %v", id, existingRefs) + } + + // Delete the data source record + _, err = tx.DeleteDataSource(ctx, db.DeleteDataSourceParams{ + ID: id, + ProjectID: project, + }) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return util.UserVisibleError(codes.NotFound, + "data source with id %s not found in project %s", id, project) + } + return fmt.Errorf("failed to delete data source with id %s: %w", id, err) + } + + // Commit the transaction + if err := stx.Commit(); err != nil { + return fmt.Errorf("failed to commit transaction: %w", err) + } + return nil +} + +// BuildDataSourceRegistry bundles up all data sources referenced in the rule type +// into a registry. +// +// Note that this assumes that the rule type has already been validated. +func (d *dataSourceService) BuildDataSourceRegistry( + ctx context.Context, rt *minderv1.RuleType, opts *Options) (*v1datasources.DataSourceRegistry, error) { + rawproj := rt.GetContext().GetProject() + proj, err := uuid.Parse(rawproj) + if err != nil { + return nil, fmt.Errorf("failed to parse project UUID: %w", err) + } + + instantiations := rt.GetDef().GetEval().GetDataSources() + reg := v1datasources.NewDataSourceRegistry() + + // return early so we don't need to do useless work + if len(instantiations) == 0 { + return reg, nil + } + + stx, err := d.txBuilder(d, opts) + if err != nil { + return nil, fmt.Errorf("failed to start transaction: %w", err) + } + + //nolint:gosec // we'll log this error later. + defer stx.Rollback() + + tx := stx.Q() + + projectHierarchy, err := tx.GetParentProjects(ctx, proj) + if err != nil { + return nil, fmt.Errorf("failed to get project hierarchy: %w", err) + } + + for _, ref := range instantiations { + inst, err := d.instantiateDataSource(ctx, ref, projectHierarchy, tx) + if err != nil { + return nil, fmt.Errorf("failed to instantiate data source: %w", err) + } + + impl, err := datasources.BuildFromProtobuf(inst) + if err != nil { + return nil, fmt.Errorf("failed to build data source from protobuf: %w", err) + } + + if err := reg.RegisterDataSource(inst.GetName(), impl); err != nil { + return nil, fmt.Errorf("failed to register data source: %w", err) + } + } + + return reg, nil +} + +// addDataSourceFunctions adds functions to a data source based on its driver type. +func addDataSourceFunctions( + ctx context.Context, + tx db.ExtendQuerier, + ds *minderv1.DataSource, + dsID uuid.UUID, + projectID uuid.UUID, +) error { + switch drv := ds.GetDriver().(type) { + case *minderv1.DataSource_Structured: + for name, def := range drv.Structured.GetDef() { + defBytes, err := protojson.Marshal(def) + if err != nil { + return fmt.Errorf("failed to marshal structured data definition: %w", err) + } + + if _, err := tx.AddDataSourceFunction(ctx, db.AddDataSourceFunctionParams{ + DataSourceID: dsID, + ProjectID: projectID, + Name: name, + Type: v1datasources.DataSourceDriverStruct, + Definition: defBytes, + }); err != nil { + return fmt.Errorf("failed to create data source function: %w", err) + } + } + case *minderv1.DataSource_Rest: + for name, def := range drv.Rest.GetDef() { + defBytes, err := protojson.Marshal(def) + if err != nil { + return fmt.Errorf("failed to marshal REST definition: %w", err) + } + + if _, err := tx.AddDataSourceFunction(ctx, db.AddDataSourceFunctionParams{ + DataSourceID: dsID, + ProjectID: projectID, + Name: name, + Type: v1datasources.DataSourceDriverRest, + Definition: defBytes, + }); err != nil { + return fmt.Errorf("failed to create data source function: %w", err) + } + } + default: + return fmt.Errorf("unsupported data source driver type: %T", drv) + } + return nil +} diff --git a/internal/datasources/service/service_test.go b/internal/datasources/service/service_test.go new file mode 100644 index 0000000000..69cc0b887a --- /dev/null +++ b/internal/datasources/service/service_test.go @@ -0,0 +1,1390 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package service + +import ( + "context" + "database/sql" + "errors" + "fmt" + "testing" + + "github.com/google/uuid" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.uber.org/mock/gomock" + "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/types/known/structpb" + + mockdb "github.com/mindersec/minder/database/mock" + "github.com/mindersec/minder/internal/db" + "github.com/mindersec/minder/internal/util/ptr" + minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + v1 "github.com/mindersec/minder/pkg/datasources/v1" +) + +var validRESTDriverFixture = &minderv1.DataSource_Rest{ + Rest: &minderv1.RestDataSource{ + Def: map[string]*minderv1.RestDataSource_Def{ + "test_function": { + Endpoint: "http://example.com", + InputSchema: func() *structpb.Struct { + s, _ := structpb.NewStruct(map[string]any{ + "type": "object", + "properties": map[string]any{ + "test": map[string]any{ + "type": "string", + }, + }, + }) + return s + }(), + }, + }, + }, +} + +func TestGetByName(t *testing.T) { + t.Parallel() + + type args struct { + name string + project uuid.UUID + opts *ReadOptions + } + tests := []struct { + name string + args args + setup func(mockDB *mockdb.MockStore) + want *minderv1.DataSource + wantErr bool + }{ + { + name: "DataSource found", + args: args{ + name: "test_name", + project: uuid.New(), + opts: &ReadOptions{}, + }, + setup: func(mockDB *mockdb.MockStore) { + dsID := uuid.New() + mockDB.EXPECT().GetDataSourceByName(gomock.Any(), gomock.Any()).Return(db.DataSource{ + ID: dsID, + Name: "test_name", + ProjectID: uuid.New(), + }, nil) + + is, err := structpb.NewStruct(map[string]any{ + "type": "object", + "properties": map[string]any{ + "test": "string", + }, + }) + require.NoError(t, err, "failed to create struct") + + mockDB.EXPECT().ListDataSourceFunctions(gomock.Any(), gomock.Any()). + Return([]db.DataSourcesFunction{ + { + ID: uuid.New(), + DataSourceID: dsID, + Name: "test_function", + Type: string(v1.DataSourceDriverRest), + Definition: restDriverToJson(t, &minderv1.RestDataSource_Def{ + Endpoint: "http://example.com", + InputSchema: is, + }), + }, + }, nil) + }, + want: &minderv1.DataSource{ + Name: "test_name", + }, + wantErr: false, + }, + { + name: "DataSource not found", + args: args{ + name: "non_existent", + project: uuid.New(), + opts: &ReadOptions{}, + }, + setup: func(mockDB *mockdb.MockStore) { + mockDB.EXPECT().GetDataSourceByName(gomock.Any(), gomock.Any()). + Return(db.DataSource{}, sql.ErrNoRows) + }, + want: nil, + wantErr: true, + }, + { + name: "Database error", + args: args{ + name: "test_name", + project: uuid.New(), + opts: &ReadOptions{}, + }, + setup: func(mockDB *mockdb.MockStore) { + mockDB.EXPECT().GetDataSourceByName(gomock.Any(), gomock.Any()). + Return(db.DataSource{}, fmt.Errorf("database error")) + }, + want: nil, + wantErr: true, + }, + { + name: "DataSource found with no functions", + args: args{ + name: "test_name", + project: uuid.New(), + opts: &ReadOptions{}, + }, + setup: func(mockDB *mockdb.MockStore) { + dsID := uuid.New() + mockDB.EXPECT().GetDataSourceByName(gomock.Any(), gomock.Any()).Return(db.DataSource{ + ID: dsID, + Name: "test_name", + ProjectID: uuid.New(), + }, nil) + + mockDB.EXPECT().ListDataSourceFunctions(gomock.Any(), gomock.Any()). + Return([]db.DataSourcesFunction{}, nil) + }, + wantErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + // Setup + mockStore := mockdb.NewMockStore(ctrl) + + svc := NewDataSourceService(mockStore) + svc.txBuilder = func(_ *dataSourceService, _ txGetter) (serviceTX, error) { + return &fakeTxBuilder{ + store: mockStore, + }, nil + } + tt.setup(mockStore) + + got, err := svc.GetByName(context.Background(), tt.args.name, tt.args.project, tt.args.opts) + if tt.wantErr { + assert.Error(t, err) + return + } + + require.NoError(t, err) + assert.Equal(t, tt.want.Name, got.Name) + assert.NotNilf(t, got.Driver, "driver is nil") + }) + } +} + +func TestGetByID(t *testing.T) { + t.Parallel() + + type args struct { + id uuid.UUID + project uuid.UUID + opts *ReadOptions + } + tests := []struct { + name string + args args + setup func(id uuid.UUID, mockDB *mockdb.MockStore) + want *minderv1.DataSource + wantErr bool + }{ + { + name: "DataSource found", + args: args{ + id: uuid.New(), + project: uuid.New(), + opts: &ReadOptions{}, + }, + setup: func(id uuid.UUID, mockDB *mockdb.MockStore) { + mockDB.EXPECT().GetDataSource(gomock.Any(), gomock.Any()).Return(db.DataSource{ + ID: id, + Name: "test_name", + ProjectID: uuid.New(), + }, nil) + + is, err := structpb.NewStruct(map[string]any{ + "type": "object", + "properties": map[string]any{ + "test": "string", + }, + }) + require.NoError(t, err, "failed to create struct") + + mockDB.EXPECT().ListDataSourceFunctions(gomock.Any(), gomock.Any()). + Return([]db.DataSourcesFunction{ + { + ID: uuid.New(), + DataSourceID: id, + Name: "test_function", + Type: string(v1.DataSourceDriverRest), + Definition: restDriverToJson(t, &minderv1.RestDataSource_Def{ + Endpoint: "http://example.com", + InputSchema: is, + }), + }, + }, nil) + }, + want: &minderv1.DataSource{ + Name: "test_name", + }, + wantErr: false, + }, + { + name: "DataSource not found", + args: args{ + id: uuid.New(), + project: uuid.New(), + opts: &ReadOptions{}, + }, + setup: func(_ uuid.UUID, mockDB *mockdb.MockStore) { + mockDB.EXPECT().GetDataSource(gomock.Any(), gomock.Any()). + Return(db.DataSource{}, sql.ErrNoRows) + }, + want: nil, + wantErr: true, + }, + { + name: "Database error", + args: args{ + id: uuid.New(), + project: uuid.New(), + opts: &ReadOptions{}, + }, + setup: func(_ uuid.UUID, mockDB *mockdb.MockStore) { + mockDB.EXPECT().GetDataSource(gomock.Any(), gomock.Any()). + Return(db.DataSource{}, fmt.Errorf("database error")) + }, + want: nil, + wantErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + // Setup + mockStore := mockdb.NewMockStore(ctrl) + + svc := NewDataSourceService(mockStore) + svc.txBuilder = func(_ *dataSourceService, _ txGetter) (serviceTX, error) { + return &fakeTxBuilder{ + store: mockStore, + }, nil + } + tt.setup(tt.args.id, mockStore) + + got, err := svc.GetByID(context.Background(), tt.args.id, tt.args.project, tt.args.opts) + if tt.wantErr { + assert.Error(t, err) + return + } + + require.NoError(t, err) + assert.Equal(t, tt.want.Name, got.Name) + assert.NotNilf(t, got.Driver, "driver is nil") + }) + } +} + +func TestList(t *testing.T) { + t.Parallel() + + type args struct { + project uuid.UUID + opts *ReadOptions + } + tests := []struct { + name string + args args + setup func(mockDB *mockdb.MockStore) + want []*minderv1.DataSource + wantErr bool + }{ + { + name: "List data sources", + args: args{ + project: uuid.New(), + opts: &ReadOptions{}, + }, + setup: func(mockDB *mockdb.MockStore) { + dsID := uuid.New() + mockDB.EXPECT().ListDataSources(gomock.Any(), gomock.Any()).Return([]db.DataSource{ + { + ID: dsID, + Name: "test_name", + ProjectID: uuid.New(), + }, + }, nil) + + is, err := structpb.NewStruct(map[string]any{ + "type": "object", + "properties": map[string]any{ + "test": "string", + }, + }) + require.NoError(t, err, "failed to create struct") + + mockDB.EXPECT().ListDataSourceFunctions(gomock.Any(), gomock.Any()). + Return([]db.DataSourcesFunction{ + { + ID: uuid.New(), + DataSourceID: dsID, + Name: "test_function", + Type: string(v1.DataSourceDriverRest), + Definition: restDriverToJson(t, &minderv1.RestDataSource_Def{ + Endpoint: "http://example.com", + InputSchema: is, + }), + }, + }, nil) + }, + want: []*minderv1.DataSource{ + { + Name: "test_name", + }, + }, + wantErr: false, + }, + { + name: "Database error", + args: args{ + project: uuid.New(), + opts: &ReadOptions{}, + }, + setup: func(mockDB *mockdb.MockStore) { + mockDB.EXPECT().ListDataSources(gomock.Any(), gomock.Any()). + Return(nil, fmt.Errorf("database error")) + }, + want: nil, + wantErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + // Setup + mockStore := mockdb.NewMockStore(ctrl) + + svc := NewDataSourceService(mockStore) + svc.txBuilder = func(_ *dataSourceService, _ txGetter) (serviceTX, error) { + return &fakeTxBuilder{ + store: mockStore, + }, nil + } + tt.setup(mockStore) + + got, err := svc.List(context.Background(), tt.args.project, tt.args.opts) + if tt.wantErr { + assert.Error(t, err) + return + } + + require.NoError(t, err) + assert.Len(t, got, len(tt.want)) + + for i, want := range tt.want { + assert.Equal(t, want.Name, got[i].Name) + assert.NotNilf(t, got[i].Driver, "driver is nil") + } + }) + } +} + +func TestCreate(t *testing.T) { + t.Parallel() + + type args struct { + ds *minderv1.DataSource + opts *Options + } + tests := []struct { + name string + args args + setup func(mockDB *mockdb.MockStore) + want *minderv1.DataSource + wantErr bool + }{ + { + name: "Successfully create REST data source", + args: args{ + ds: &minderv1.DataSource{ + Name: "test_ds", + Context: &minderv1.ContextV2{ + ProjectId: uuid.New().String(), + }, + Driver: validRESTDriverFixture, + }, + opts: &Options{}, + }, + setup: func(mockDB *mockdb.MockStore) { + mockDB.EXPECT().GetParentProjects(gomock.Any(), gomock.Any()). + Return([]uuid.UUID{uuid.New()}, nil) + + mockDB.EXPECT().GetDataSourceByName(gomock.Any(), gomock.Any()). + Return(db.DataSource{}, sql.ErrNoRows) + + mockDB.EXPECT().CreateDataSource(gomock.Any(), gomock.Any()). + Return(db.DataSource{ + ID: uuid.New(), + Name: "test_ds", + }, nil) + + mockDB.EXPECT().AddDataSourceFunction(gomock.Any(), gomock.Any()). + Return(db.DataSourcesFunction{}, nil) + }, + want: &minderv1.DataSource{ + Name: "test_ds", + }, + wantErr: false, + }, + { + name: "Nil data source", + args: args{ + ds: nil, + opts: &Options{}, + }, + setup: func(_ *mockdb.MockStore) {}, + wantErr: true, + }, + { + name: "Invalid project ID", + args: args{ + ds: &minderv1.DataSource{ + Context: &minderv1.ContextV2{ + ProjectId: "invalid-uuid", + }, + }, + opts: &Options{}, + }, + setup: func(_ *mockdb.MockStore) {}, + wantErr: true, + }, + { + name: "Data source already exists", + args: args{ + ds: &minderv1.DataSource{ + Name: "existing_ds", + Context: &minderv1.ContextV2{ + ProjectId: uuid.New().String(), + }, + Driver: validRESTDriverFixture, + }, + opts: &Options{}, + }, + setup: func(mockDB *mockdb.MockStore) { + mockDB.EXPECT().GetParentProjects(gomock.Any(), gomock.Any()). + Return([]uuid.UUID{uuid.New()}, nil) + mockDB.EXPECT().GetDataSourceByName(gomock.Any(), gomock.Any()). + Return(db.DataSource{ID: uuid.New()}, nil) + }, + wantErr: true, + }, + { + name: "Unsupported driver type", + args: args{ + ds: &minderv1.DataSource{ + Name: "test_ds", + Context: &minderv1.ContextV2{ + ProjectId: uuid.New().String(), + }, + Driver: nil, + }, + opts: &Options{}, + }, + setup: func(_ *mockdb.MockStore) { + // This fails on the early validation side. + }, + wantErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + mockStore := mockdb.NewMockStore(ctrl) + + svc := NewDataSourceService(mockStore) + svc.txBuilder = func(_ *dataSourceService, _ txGetter) (serviceTX, error) { + return &fakeTxBuilder{ + store: mockStore, + }, nil + } + tt.setup(mockStore) + + got, err := svc.Create(context.Background(), tt.args.ds, tt.args.opts) + if tt.wantErr { + assert.Error(t, err) + return + } + + require.NoError(t, err) + assert.Equal(t, tt.want.Name, got.Name) + }) + } +} + +func TestBuildDataSourceRegistry(t *testing.T) { + t.Parallel() + + type args struct { + rt *minderv1.RuleType + opts *Options + } + tests := []struct { + name string + args args + setup func(rawProjectID string, mockDB *mockdb.MockStore) + wantErr bool + }{ + { + name: "Successful registry build", + args: args{ + rt: &minderv1.RuleType{ + Context: &minderv1.Context{ + Project: ptr.Ptr(uuid.New().String()), + }, + Def: &minderv1.RuleType_Definition{ + Eval: &minderv1.RuleType_Definition_Eval{ + DataSources: []*minderv1.DataSourceReference{ + { + Name: "test_data_source", + }, + }, + }, + }, + }, + opts: &Options{}, + }, + setup: func(rawProjectID string, mockDB *mockdb.MockStore) { + projectID := uuid.MustParse(rawProjectID) + dsID := uuid.New() + + mockDB.EXPECT().GetParentProjects(gomock.Any(), projectID).Return([]uuid.UUID{projectID}, nil) + mockDB.EXPECT().GetDataSourceByName(gomock.Any(), gomock.Any()).Return(db.DataSource{ + ID: dsID, + Name: "test_data_source", + ProjectID: projectID, + }, nil) + + is, err := structpb.NewStruct(map[string]any{ + "type": "object", + "properties": map[string]any{ + "test": map[string]any{ + "type": "string", + }, + }, + }) + require.NoError(t, err, "failed to create struct") + + mockDB.EXPECT().ListDataSourceFunctions(gomock.Any(), gomock.Any()). + Return([]db.DataSourcesFunction{ + { + ID: uuid.New(), + DataSourceID: dsID, + ProjectID: projectID, + Name: "test_function", + Type: string(v1.DataSourceDriverRest), + Definition: restDriverToJson(t, &minderv1.RestDataSource_Def{ + Endpoint: "http://example.com", + InputSchema: is, + }), + }, + }, nil) + }, + wantErr: false, + }, + { + name: "Project UUID parse error", + args: args{ + rt: &minderv1.RuleType{ + Context: &minderv1.Context{ + Project: ptr.Ptr("invalid_uuid"), + }, + Def: &minderv1.RuleType_Definition{ + Eval: &minderv1.RuleType_Definition_Eval{ + DataSources: []*minderv1.DataSourceReference{ + { + Name: "test_data_source", + }, + }, + }, + }, + }, + opts: &Options{}, + }, + setup: func(_ string, _ *mockdb.MockStore) {}, + wantErr: true, + }, + { + name: "nil data source name reference", + args: args{ + rt: &minderv1.RuleType{ + Context: &minderv1.Context{ + Project: ptr.Ptr(uuid.New().String()), + }, + Def: &minderv1.RuleType_Definition{ + Eval: &minderv1.RuleType_Definition_Eval{ + DataSources: []*minderv1.DataSourceReference{ + nil, + }, + }, + }, + }, + opts: &Options{}, + }, + setup: func(rawProjectID string, mockDB *mockdb.MockStore) { + projectID := uuid.MustParse(rawProjectID) + + mockDB.EXPECT().GetParentProjects(gomock.Any(), projectID).Return([]uuid.UUID{projectID}, nil) + }, + wantErr: true, + }, + { + name: "Empty data source name reference", + args: args{ + rt: &minderv1.RuleType{ + Context: &minderv1.Context{ + Project: ptr.Ptr(uuid.New().String()), + }, + Def: &minderv1.RuleType_Definition{ + Eval: &minderv1.RuleType_Definition_Eval{ + DataSources: []*minderv1.DataSourceReference{ + { + Name: "", + }, + }, + }, + }, + }, + opts: &Options{}, + }, + setup: func(rawProjectID string, mockDB *mockdb.MockStore) { + projectID := uuid.MustParse(rawProjectID) + + mockDB.EXPECT().GetParentProjects(gomock.Any(), projectID).Return([]uuid.UUID{projectID}, nil) + }, + wantErr: true, + }, + { + name: "Database error when getting parent projects", + args: args{ + rt: &minderv1.RuleType{ + Context: &minderv1.Context{ + Project: ptr.Ptr(uuid.New().String()), + }, + Def: &minderv1.RuleType_Definition{ + Eval: &minderv1.RuleType_Definition_Eval{ + DataSources: []*minderv1.DataSourceReference{ + { + Name: "test_data_source", + }, + }, + }, + }, + }, + opts: &Options{}, + }, + setup: func(rawProjectID string, mockDB *mockdb.MockStore) { + projectID := uuid.MustParse(rawProjectID) + mockDB.EXPECT().GetParentProjects(gomock.Any(), projectID). + Return(nil, errors.New("database error")) + }, + wantErr: true, + }, + { + name: "Database error when getting data source by name", + args: args{ + rt: &minderv1.RuleType{ + Context: &minderv1.Context{ + Project: ptr.Ptr(uuid.New().String()), + }, + Def: &minderv1.RuleType_Definition{ + Eval: &minderv1.RuleType_Definition_Eval{ + DataSources: []*minderv1.DataSourceReference{ + { + Name: "test_data_source", + }, + }, + }, + }, + }, + opts: &Options{}, + }, + setup: func(rawProjectID string, mockDB *mockdb.MockStore) { + projectID := uuid.MustParse(rawProjectID) + + mockDB.EXPECT().GetParentProjects(gomock.Any(), projectID).Return([]uuid.UUID{projectID}, nil) + mockDB.EXPECT().GetDataSourceByName(gomock.Any(), gomock.Any()). + Return(db.DataSource{}, errors.New("database error")) + }, + wantErr: true, + }, + { + name: "Database error when getting data source functions", + args: args{ + rt: &minderv1.RuleType{ + Context: &minderv1.Context{ + Project: ptr.Ptr(uuid.New().String()), + }, + Def: &minderv1.RuleType_Definition{ + Eval: &minderv1.RuleType_Definition_Eval{ + DataSources: []*minderv1.DataSourceReference{ + { + Name: "test_data_source", + }, + }, + }, + }, + }, + opts: &Options{}, + }, + setup: func(rawProjectID string, mockDB *mockdb.MockStore) { + projectID := uuid.MustParse(rawProjectID) + dsID := uuid.New() + + mockDB.EXPECT().GetParentProjects(gomock.Any(), projectID).Return([]uuid.UUID{projectID}, nil) + mockDB.EXPECT().GetDataSourceByName(gomock.Any(), gomock.Any()).Return(db.DataSource{ + ID: dsID, + Name: "test_data_source", + ProjectID: projectID, + }, nil) + + mockDB.EXPECT().ListDataSourceFunctions(gomock.Any(), gomock.Any()). + Return([]db.DataSourcesFunction{}, errors.New("database error")) + }, + wantErr: true, + }, + { + // This should not happen, but we test anyway + name: "data source without functions", + args: args{ + rt: &minderv1.RuleType{ + Context: &minderv1.Context{ + Project: ptr.Ptr(uuid.New().String()), + }, + Def: &minderv1.RuleType_Definition{ + Eval: &minderv1.RuleType_Definition_Eval{ + DataSources: []*minderv1.DataSourceReference{ + { + Name: "test_data_source", + }, + }, + }, + }, + }, + opts: &Options{}, + }, + setup: func(rawProjectID string, mockDB *mockdb.MockStore) { + projectID := uuid.MustParse(rawProjectID) + dsID := uuid.New() + + mockDB.EXPECT().GetParentProjects(gomock.Any(), projectID).Return([]uuid.UUID{projectID}, nil) + mockDB.EXPECT().GetDataSourceByName(gomock.Any(), gomock.Any()).Return(db.DataSource{ + ID: dsID, + Name: "test_data_source", + ProjectID: projectID, + }, nil) + + mockDB.EXPECT().ListDataSourceFunctions(gomock.Any(), gomock.Any()). + Return([]db.DataSourcesFunction{ + {}, + }, nil) + }, + wantErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + // Setup + mockStore := mockdb.NewMockStore(ctrl) + + svc := NewDataSourceService(mockStore) + svc.txBuilder = func(_ *dataSourceService, _ txGetter) (serviceTX, error) { + return &fakeTxBuilder{ + store: mockStore, + }, nil + } + tt.setup(tt.args.rt.GetContext().GetProject(), mockStore) + + _, err := svc.BuildDataSourceRegistry(context.Background(), tt.args.rt, tt.args.opts) + if tt.wantErr { + assert.Error(t, err) + return + } + + require.NoError(t, err) + }) + } +} + +type fakeTxBuilder struct { + store db.Store + errorOnCommit bool +} + +func (f *fakeTxBuilder) Q() db.ExtendQuerier { + return f.store +} + +func (f *fakeTxBuilder) Commit() error { + if f.errorOnCommit { + return fmt.Errorf("error on commit") + } + return nil +} + +func (_ *fakeTxBuilder) Rollback() error { + return nil +} + +func restDriverToJson(t *testing.T, rs *minderv1.RestDataSource_Def) []byte { + t.Helper() + + out, err := protojson.Marshal(rs) + require.NoError(t, err) + + return out +} + +func TestDelete(t *testing.T) { + t.Parallel() + + type args struct { + id uuid.UUID + project uuid.UUID + opts *Options + } + + tests := []struct { + name string + args args + setup func(args args, mockDB *mockdb.MockStore) + wantErr bool + }{ + { + name: "Successful deletion", + args: args{ + id: uuid.New(), + project: uuid.New(), + opts: &Options{}, + }, + setup: func(args args, mockDB *mockdb.MockStore) { + // Mock ListRuleTypesReferencesByDataSource to return empty list + mockDB.EXPECT(). + ListRuleTypesReferencesByDataSource(gomock.Any(), args.id). + Return([]db.RuleTypeDataSource{}, nil) + + // Mock DeleteDataSource to succeed + mockDB.EXPECT(). + DeleteDataSource(gomock.Any(), gomock.Eq(db.DeleteDataSourceParams{ + ID: args.id, + ProjectID: args.project, + })). + Return(db.DataSource{}, nil) + }, + wantErr: false, + }, + { + name: "Data source not found", + args: args{ + id: uuid.New(), + project: uuid.New(), + opts: &Options{}, + }, + setup: func(args args, mockDB *mockdb.MockStore) { + // Mock ListRuleTypesReferencesByDataSource to return empty list + mockDB.EXPECT(). + ListRuleTypesReferencesByDataSource(gomock.Any(), args.id). + Return([]db.RuleTypeDataSource{}, nil) + + // Mock DeleteDataSource to return sql.ErrNoRows + mockDB.EXPECT(). + DeleteDataSource(gomock.Any(), gomock.Eq(db.DeleteDataSourceParams{ + ID: args.id, + ProjectID: args.project, + })). + Return(db.DataSource{}, sql.ErrNoRows) + }, + wantErr: true, + }, + { + name: "Data source is in use", + args: args{ + id: uuid.New(), + project: uuid.New(), + opts: &Options{}, + }, + setup: func(args args, mockDB *mockdb.MockStore) { + // Mock ListRuleTypesReferencesByDataSource to return non-empty list + mockDB.EXPECT(). + ListRuleTypesReferencesByDataSource(gomock.Any(), args.id). + Return([]db.RuleTypeDataSource{ + {RuleTypeID: uuid.New()}, + }, nil) + }, + wantErr: true, + }, + { + name: "Database error when listing references", + args: args{ + id: uuid.New(), + project: uuid.New(), + opts: &Options{}, + }, + setup: func(args args, mockDB *mockdb.MockStore) { + // Mock ListRuleTypesReferencesByDataSource to return an error + mockDB.EXPECT(). + ListRuleTypesReferencesByDataSource(gomock.Any(), args.id). + Return(nil, fmt.Errorf("database error")) + }, + wantErr: true, + }, + { + name: "Database error when deleting data source", + args: args{ + id: uuid.New(), + project: uuid.New(), + opts: &Options{}, + }, + setup: func(args args, mockDB *mockdb.MockStore) { + // Mock ListRuleTypesReferencesByDataSource to return empty list + mockDB.EXPECT(). + ListRuleTypesReferencesByDataSource(gomock.Any(), args.id). + Return([]db.RuleTypeDataSource{}, nil) + + // Mock DeleteDataSource to return an error + mockDB.EXPECT(). + DeleteDataSource(gomock.Any(), gomock.Eq(db.DeleteDataSourceParams{ + ID: args.id, + ProjectID: args.project, + })). + Return(db.DataSource{}, fmt.Errorf("database error")) + }, + wantErr: true, + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + // Setup + mockStore := mockdb.NewMockStore(ctrl) + + svc := NewDataSourceService(mockStore) + svc.txBuilder = func(_ *dataSourceService, _ txGetter) (serviceTX, error) { + return &fakeTxBuilder{ + store: mockStore, + }, nil + } + + tt.setup(tt.args, mockStore) + + err := svc.Delete(context.Background(), tt.args.id, tt.args.project, tt.args.opts) + if tt.wantErr { + assert.Error(t, err) + return + } + + require.NoError(t, err) + }) + } +} + +func TestUpdate(t *testing.T) { + t.Parallel() + + type args struct { + ds *minderv1.DataSource + opts *Options + } + tests := []struct { + name string + args args + setup func(mockDB *mockdb.MockStore) + want *minderv1.DataSource + wantErr bool + }{ + { + name: "Successfully update REST data source", + args: args{ + ds: &minderv1.DataSource{ + Id: uuid.New().String(), + Name: "updated_ds", + Context: &minderv1.ContextV2{ + ProjectId: uuid.New().String(), + }, + Driver: &minderv1.DataSource_Rest{ + Rest: &minderv1.RestDataSource{ + Def: map[string]*minderv1.RestDataSource_Def{ + "test_function": { + Endpoint: "http://example.com/updated", + InputSchema: func() *structpb.Struct { + s, _ := structpb.NewStruct(map[string]any{ + "type": "object", + "properties": map[string]any{ + "test": map[string]any{ + "type": "string", + }, + "foo": map[string]any{ + "type": "string", + }, + }, + }) + return s + }(), + }, + }, + }, + }, + }, + opts: &Options{}, + }, + setup: func(mockDB *mockdb.MockStore) { + mockDB.EXPECT().GetDataSourceByName(gomock.Any(), gomock.Any()). + Return(db.DataSource{ + ID: uuid.MustParse(uuid.New().String()), + Name: "test_ds", + }, nil) + mockDB.EXPECT().ListDataSourceFunctions(gomock.Any(), gomock.Any()). + Return([]db.DataSourcesFunction{ + { + ID: uuid.New(), + DataSourceID: uuid.New(), + Name: "test_function", + Type: string(v1.DataSourceDriverRest), + Definition: restDriverToJson(t, &minderv1.RestDataSource_Def{ + Endpoint: "http://example.com", + InputSchema: func() *structpb.Struct { + s, _ := structpb.NewStruct(map[string]any{ + "type": "object", + "properties": map[string]any{ + "test": map[string]any{ + "type": "string", + }, + }, + }) + return s + }(), + }), + }, + }, nil) + + mockDB.EXPECT().UpdateDataSource(gomock.Any(), gomock.Any()). + Return(db.DataSource{ + ID: uuid.New(), + Name: "updated_ds", + }, nil) + + mockDB.EXPECT().DeleteDataSourceFunctions(gomock.Any(), gomock.Any()). + Return(nil, nil) + + mockDB.EXPECT().AddDataSourceFunction(gomock.Any(), gomock.Any()). + Return(db.DataSourcesFunction{}, nil) + }, + want: &minderv1.DataSource{ + Name: "updated_ds", + }, + wantErr: false, + }, + { + name: "Nil data source", + args: args{ + ds: nil, + opts: &Options{}, + }, + setup: func(_ *mockdb.MockStore) {}, + wantErr: true, + }, + { + name: "Invalid project ID", + args: args{ + ds: &minderv1.DataSource{ + Id: uuid.New().String(), + Context: &minderv1.ContextV2{ + ProjectId: "invalid-uuid", + }, + }, + opts: &Options{}, + }, + setup: func(_ *mockdb.MockStore) {}, + wantErr: true, + }, + { + name: "Invalid data source ID", + args: args{ + ds: &minderv1.DataSource{ + Id: "invalid-uuid", + Context: &minderv1.ContextV2{ + ProjectId: uuid.New().String(), + }, + }, + opts: &Options{}, + }, + setup: func(_ *mockdb.MockStore) {}, + wantErr: true, + }, + { + name: "Data source not found", + args: args{ + ds: &minderv1.DataSource{ + Id: uuid.New().String(), + Name: "updated_ds", + Context: &minderv1.ContextV2{ + ProjectId: uuid.New().String(), + }, + Driver: validRESTDriverFixture, + }, + opts: &Options{}, + }, + setup: func(mockDB *mockdb.MockStore) { + mockDB.EXPECT().GetDataSourceByName(gomock.Any(), gomock.Any()). + Return(db.DataSource{}, sql.ErrNoRows) + }, + wantErr: true, + }, + { + name: "Database error on update", + args: args{ + ds: &minderv1.DataSource{ + Id: uuid.New().String(), + Name: "updated_ds", + Context: &minderv1.ContextV2{ + ProjectId: uuid.New().String(), + }, + Driver: validRESTDriverFixture, + }, + opts: &Options{}, + }, + setup: func(mockDB *mockdb.MockStore) { + mockDB.EXPECT().GetDataSourceByName(gomock.Any(), gomock.Any()). + Return(db.DataSource{ID: uuid.New()}, nil) + mockDB.EXPECT().ListDataSourceFunctions(gomock.Any(), gomock.Any()). + Return([]db.DataSourcesFunction{ + { + ID: uuid.New(), + DataSourceID: uuid.New(), + Name: "test_function", + Type: string(v1.DataSourceDriverRest), + Definition: restDriverToJson(t, &minderv1.RestDataSource_Def{ + Endpoint: "http://example.com", + InputSchema: func() *structpb.Struct { + s, _ := structpb.NewStruct(map[string]any{ + "type": "object", + "properties": map[string]any{ + "test": map[string]any{ + "type": "string", + }, + }, + }) + return s + }(), + }), + }, + }, nil) + + mockDB.EXPECT().UpdateDataSource(gomock.Any(), gomock.Any()). + Return(db.DataSource{}, fmt.Errorf("database error")) + }, + wantErr: true, + }, + { + name: "Database error on delete functions", + args: args{ + ds: &minderv1.DataSource{ + Id: uuid.New().String(), + Name: "updated_ds", + Context: &minderv1.ContextV2{ + ProjectId: uuid.New().String(), + }, + Driver: validRESTDriverFixture, + }, + opts: &Options{}, + }, + setup: func(mockDB *mockdb.MockStore) { + mockDB.EXPECT().GetDataSourceByName(gomock.Any(), gomock.Any()). + Return(db.DataSource{ID: uuid.New()}, nil) + mockDB.EXPECT().ListDataSourceFunctions(gomock.Any(), gomock.Any()). + Return([]db.DataSourcesFunction{ + { + ID: uuid.New(), + DataSourceID: uuid.New(), + Name: "test_function", + Type: string(v1.DataSourceDriverRest), + Definition: restDriverToJson(t, &minderv1.RestDataSource_Def{ + Endpoint: "http://example.com", + InputSchema: func() *structpb.Struct { + s, _ := structpb.NewStruct(map[string]any{ + "type": "object", + "properties": map[string]any{ + "test": map[string]any{ + "type": "string", + }, + }, + }) + return s + }(), + }), + }, + }, nil) + + mockDB.EXPECT().UpdateDataSource(gomock.Any(), gomock.Any()). + Return(db.DataSource{}, nil) + + mockDB.EXPECT().DeleteDataSourceFunctions(gomock.Any(), gomock.Any()). + Return(nil, fmt.Errorf("database error")) + }, + wantErr: true, + }, + { + name: "Database error on get functions", + args: args{ + ds: &minderv1.DataSource{ + Id: uuid.New().String(), + Name: "updated_ds", + Context: &minderv1.ContextV2{ + ProjectId: uuid.New().String(), + }, + Driver: validRESTDriverFixture, + }, + opts: &Options{}, + }, + setup: func(mockDB *mockdb.MockStore) { + mockDB.EXPECT().GetDataSourceByName(gomock.Any(), gomock.Any()). + Return(db.DataSource{ID: uuid.New()}, nil) + mockDB.EXPECT().ListDataSourceFunctions(gomock.Any(), gomock.Any()). + Return([]db.DataSourcesFunction{}, fmt.Errorf("database error")) + }, + wantErr: true, + }, + { + name: "Update REST data source fails on update validation", + args: args{ + ds: &minderv1.DataSource{ + Id: uuid.New().String(), + Name: "updated_ds", + Context: &minderv1.ContextV2{ + ProjectId: uuid.New().String(), + }, + Driver: &minderv1.DataSource_Rest{ + Rest: &minderv1.RestDataSource{ + Def: map[string]*minderv1.RestDataSource_Def{ + "test_function": { + Endpoint: "http://example.com/updated", + InputSchema: func() *structpb.Struct { + s, _ := structpb.NewStruct(map[string]any{ + "type": "object", + "properties": map[string]any{ + // This is not allowed as we're missing the "test" field + "foo": map[string]any{ + "type": "string", + }, + }, + // This is not allowed as we're adding a required field + "required": []any{"foo"}, + }) + return s + }(), + }, + }, + }, + }, + }, + opts: &Options{}, + }, + setup: func(mockDB *mockdb.MockStore) { + mockDB.EXPECT().GetDataSourceByName(gomock.Any(), gomock.Any()). + Return(db.DataSource{ + ID: uuid.MustParse(uuid.New().String()), + Name: "test_ds", + }, nil) + mockDB.EXPECT().ListDataSourceFunctions(gomock.Any(), gomock.Any()). + Return([]db.DataSourcesFunction{ + { + ID: uuid.New(), + DataSourceID: uuid.New(), + Name: "test_function", + Type: string(v1.DataSourceDriverRest), + Definition: restDriverToJson(t, &minderv1.RestDataSource_Def{ + Endpoint: "http://example.com", + InputSchema: func() *structpb.Struct { + s, _ := structpb.NewStruct(map[string]any{ + "type": "object", + "properties": map[string]any{ + "test": map[string]any{ + "type": "string", + }, + }, + }) + return s + }(), + }), + }, + }, nil) + }, + wantErr: true, + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + mockStore := mockdb.NewMockStore(ctrl) + svc := NewDataSourceService(mockStore) + svc.txBuilder = func(_ *dataSourceService, _ txGetter) (serviceTX, error) { + return &fakeTxBuilder{ + store: mockStore, + }, nil + } + + tt.setup(mockStore) + + got, err := svc.Update(context.Background(), tt.args.ds, tt.args.opts) + if tt.wantErr { + assert.Error(t, err) + return + } + + require.NoError(t, err) + assert.Equal(t, tt.want.Name, got.Name) + }) + } +} diff --git a/internal/datasources/service/tx.go b/internal/datasources/service/tx.go new file mode 100644 index 0000000000..33d980a174 --- /dev/null +++ b/internal/datasources/service/tx.go @@ -0,0 +1,84 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package service + +import ( + "database/sql" + + "github.com/mindersec/minder/internal/db" +) + +// serviceTX is an interface that defines the methods for a service transaction. +// +// This service may be used with a pre-built transaction or without one. +// thus, we need to be able to handle both cases. +type serviceTX interface { + Q() db.ExtendQuerier + Commit() error + Rollback() error +} + +// This is a handy helper function to optionally begin a transaction if we've already +// got one. +func beginTx(d *dataSourceService, opts txGetter) (serviceTX, error) { + if opts == nil { + opts = &Options{} + } + if opts.getTransaction() != nil { + return &externalTX{q: opts.getTransaction()}, nil + } + + return beginInternalTx(d, opts) +} + +// builds a new transaction for the service +func beginInternalTx(d *dataSourceService, opts txGetter) (serviceTX, error) { + tx, err := d.store.BeginTransaction() + if err != nil { + return nil, err + } + + // If this is a read-only operation we can set the transaction to read-only + // We can know this by casting to the *ReadOptions struct + if _, ok := opts.(*ReadOptions); ok { + if _, err := tx.Query("SET TRANSACTION READ ONLY"); err != nil { + return nil, err + } + } + + return &internalTX{tx: tx, q: d.store.GetQuerierWithTransaction(tx)}, nil +} + +type externalTX struct { + q db.ExtendQuerier +} + +func (e *externalTX) Q() db.ExtendQuerier { + return e.q +} + +func (_ *externalTX) Commit() error { + return nil +} + +func (_ *externalTX) Rollback() error { + return nil +} + +type internalTX struct { + tx *sql.Tx + q db.ExtendQuerier +} + +func (i *internalTX) Q() db.ExtendQuerier { + return i.q +} + +func (i *internalTX) Commit() error { + return i.tx.Commit() +} + +func (i *internalTX) Rollback() error { + return i.tx.Rollback() +} diff --git a/internal/datasources/structured/decoders.go b/internal/datasources/structured/decoders.go new file mode 100644 index 0000000000..0fe0444040 --- /dev/null +++ b/internal/datasources/structured/decoders.go @@ -0,0 +1,77 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package structured + +import ( + "encoding/json" + "errors" + "fmt" + "io" + + "github.com/pelletier/go-toml/v2" + "gopkg.in/yaml.v3" +) + +var ( + // ErrNoInput triggers if a decoder is called without input + ErrNoInput = errors.New("unable to decode, no input defined") +) + +// This file contains various decoders that can be used to decode structured data + +// jsonDecoder decodes JSON data +type jsonDecoder struct{} + +func (*jsonDecoder) Parse(r io.Reader) (any, error) { + if r == nil { + return nil, ErrNoInput + } + var res any + dec := json.NewDecoder(r) + if err := dec.Decode(&res); err != nil { + return nil, fmt.Errorf("decoding json data: %w", err) + } + return res, nil +} + +func (*jsonDecoder) Extensions() []string { + return []string{"json"} +} + +// yamlDecoder opens yaml +type yamlDecoder struct{} + +func (*yamlDecoder) Parse(r io.Reader) (any, error) { + if r == nil { + return nil, ErrNoInput + } + var res any + dec := yaml.NewDecoder(r) + if err := dec.Decode(&res); err != nil { + return nil, fmt.Errorf("decoding yaml data: %w", err) + } + return res, nil +} + +func (*yamlDecoder) Extensions() []string { + return []string{"yaml", "yml"} +} + +type tomlDecoder struct{} + +func (*tomlDecoder) Parse(r io.Reader) (any, error) { + if r == nil { + return nil, ErrNoInput + } + var res any + dec := toml.NewDecoder(r) + if err := dec.Decode(&res); err != nil { + return nil, fmt.Errorf("decoding toml data: %w", err) + } + return res, nil +} + +func (*tomlDecoder) Extensions() []string { + return []string{"toml"} +} diff --git a/internal/datasources/structured/decoders_test.go b/internal/datasources/structured/decoders_test.go new file mode 100644 index 0000000000..99da3f4ce8 --- /dev/null +++ b/internal/datasources/structured/decoders_test.go @@ -0,0 +1,110 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package structured + +import ( + "bytes" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestJsonDecoder(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + name string + data []byte + mustErr bool + expect any + }{ + {name: "normal", data: []byte(`{"a":1, "b":"abc"}`), mustErr: false}, + {name: "invalid_json", data: []byte(`a 1`), mustErr: true}, + } { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + var b bytes.Buffer + _, err := b.Write(tc.data) + require.NoError(t, err) + + dec := jsonDecoder{} + res, err := dec.Parse(&b) + if tc.mustErr { + require.Error(t, err) + return + } + require.NoError(t, err) + require.NotNil(t, res) + }) + dec := jsonDecoder{} + _, err := dec.Parse(nil) + require.Error(t, err) + + } +} + +func TestYamlDecoder(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + name string + data []byte + mustErr bool + expect any + }{ + {name: "normal", data: []byte("---\na: 1\nb:\n - \"Hey\"\n - \"Bye\"\n"), mustErr: false}, + {name: "invalid_yaml", data: []byte(" a 1\na: 2\n"), mustErr: true}, + } { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + var b bytes.Buffer + _, err := b.Write(tc.data) + require.NoError(t, err) + + dec := yamlDecoder{} + res, err := dec.Parse(&b) + if tc.mustErr { + require.Error(t, err) + return + } + require.NoError(t, err) + require.NotNil(t, res) + }) + dec := yamlDecoder{} + _, err := dec.Parse(nil) + require.Error(t, err) + + } +} + +func TestTomlDecoder(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + name string + data []byte + mustErr bool + expect any + }{ + {name: "normal", data: []byte("title = \"TOML Example\"\n\n[owner]\nname = \"Tom Preston-Werner\""), mustErr: false}, + {name: "invalid_toml", data: []byte(" a 1\na: 2\n"), mustErr: true}, + } { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + var b bytes.Buffer + _, err := b.Write(tc.data) + require.NoError(t, err) + + dec := tomlDecoder{} + res, err := dec.Parse(&b) + if tc.mustErr { + require.Error(t, err) + return + } + require.NoError(t, err) + require.NotNil(t, res) + }) + dec := tomlDecoder{} + _, err := dec.Parse(nil) + require.Error(t, err) + + } +} diff --git a/internal/datasources/structured/handler.go b/internal/datasources/structured/handler.go new file mode 100644 index 0000000000..aeb7cb6afe --- /dev/null +++ b/internal/datasources/structured/handler.go @@ -0,0 +1,177 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package structured + +import ( + "context" + "errors" + "fmt" + "io" + "os" + "path/filepath" + "slices" + "strings" + + "github.com/go-git/go-billy/v5" + "github.com/rs/zerolog/log" + + minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + v1datasources "github.com/mindersec/minder/pkg/datasources/v1" +) + +const ( + jsonType decoderType = "json" + yamlType decoderType = "yaml" + tomlType decoderType = "toml" +) + +type decoder interface { + Parse(io.Reader) (any, error) + Extensions() []string +} + +type decoderType string + +// Catalog of decoders enabled by default +var decoders = map[decoderType]decoder{ + jsonType: &jsonDecoder{}, + yamlType: &yamlDecoder{}, + tomlType: &tomlDecoder{}, +} + +var _ v1datasources.DataSourceFuncDef = (*structHandler)(nil) + +// ErrorNoFileMatchInPath triggers if the path specification can't match a +// file in the filesystem received by the data source. +var ErrorNoFileMatchInPath = errors.New("no file matched through path specification") + +type structHandler struct { + Path *minderv1.StructDataSource_Def_Path +} + +func newHandlerFromDef(def *minderv1.StructDataSource_Def) (*structHandler, error) { + if def == nil { + return nil, errors.New("data source handler definition is nil") + } + + return &structHandler{ + Path: def.GetPath(), + }, nil +} + +// openFirstAlternative tries to open the main path and return an open file. If +// not found, it will try the defined alternatives returning the first one. +// If paths are directories, they will be ignored. Returns an error if no path +// corresponds to a file that can be opened. +func openFirstAlternative(fs billy.Filesystem, mainPath string, alternatives []string) (billy.File, error) { + if mainPath == "" && len(alternatives) == 0 { + return nil, errors.New("no file specified in data source definition") + } + if mainPath != "" { + alternatives = append([]string{mainPath}, alternatives...) + } + + for _, p := range alternatives { + s, err := fs.Stat(p) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + continue + } + return nil, fmt.Errorf("error checking path: %w", err) + } + + if s.IsDir() { + continue + } + + f, err := fs.Open(p) + if err != nil { + return nil, fmt.Errorf("opening file: %w", err) + } + + return f, nil + } + return nil, ErrorNoFileMatchInPath +} + +// parseFileAlternatives takes a path and alternative locations and parses +// the first available +func parseFileAlternatives(fs billy.Filesystem, mainPath string, alternatives []string) (any, error) { + f, err := openFirstAlternative(fs, mainPath, alternatives) + if err != nil { + // If no file was found, we don't return an error but nil + // we want rules to not error but to get a blank struct + if errors.Is(err, ErrorNoFileMatchInPath) { + log.Info().Err(err).Msg("error validating datasource function arguments") + return nil, nil + } + return nil, err + } + return parseFile(f) +} + +// parseFile parses an open file using the configured parsers +func parseFile(f billy.File) (any, error) { + // Get the file extension, perhaps we can shortcut before trying + // to brute force through all decoders + ext := filepath.Ext(f.Name()) + tried := map[decoderType]struct{}{} + for t, d := range decoders { + exts := d.Extensions() + if slices.Contains(exts, strings.ToLower(ext)) { + if _, err := f.Seek(0, 0); err != nil { + return nil, fmt.Errorf("unable to rewind file") + } + res, err := d.Parse(f) + if err == nil { + return res, nil + } + tried[t] = struct{}{} + } + } + + // no dice, try the rest of the decoders + for t, d := range decoders { + if _, ok := tried[t]; ok { + continue + } + if _, err := f.Seek(0, 0); err != nil { + return nil, fmt.Errorf("unable to rewind file") + } + res, err := d.Parse(f) + if err == nil { + return res, nil + } + } + return nil, errors.New("unable to parse structured data with any of the available decoders") +} + +// Call parses the structured data from the billy filesystem in the context +func (sh *structHandler) Call(ctx context.Context, _ any) (any, error) { + var ctxData v1datasources.Context + var ok bool + if ctxData, ok = ctx.Value(v1datasources.ContextKey{}).(v1datasources.Context); !ok { + return nil, fmt.Errorf("unable to read execution context") + } + + if ctxData.Ingest == nil || ctxData.Ingest.Fs == nil { + return nil, fmt.Errorf("filesystem not found in execution context") + } + + return parseFileAlternatives(ctxData.Ingest.Fs, sh.Path.GetFileName(), sh.Path.GetAlternatives()) +} + +func (*structHandler) GetArgsSchema() any { + return nil +} + +// ValidateArgs is just a stub as the structured data source does not have arguments +func (_ *structHandler) ValidateArgs(any) error { + return nil +} + +// ValidateUpdate +func (_ *structHandler) ValidateUpdate(any) error { + return nil +} diff --git a/internal/datasources/structured/handler_test.go b/internal/datasources/structured/handler_test.go new file mode 100644 index 0000000000..c20f4e1765 --- /dev/null +++ b/internal/datasources/structured/handler_test.go @@ -0,0 +1,230 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package structured + +import ( + "context" + "os" + "path/filepath" + "testing" + + "github.com/go-git/go-billy/v5" + "github.com/go-git/go-billy/v5/memfs" + "github.com/stretchr/testify/require" + + minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + v1datasources "github.com/mindersec/minder/pkg/datasources/v1" + "github.com/mindersec/minder/pkg/engine/v1/interfaces" +) + +func writeFSFile(t *testing.T, fs billy.Filesystem, path string, data []byte) { + t.Helper() + require.NoError(t, fs.MkdirAll(filepath.Dir(path), os.FileMode(0o755))) + f, err := fs.Create(path) + require.NoError(t, err) + _, err = f.Write(data) + require.NoError(t, err) + require.NoError(t, f.Close()) +} + +func TestOpenFirstAlternative(t *testing.T) { + t.Parallel() + + genFS := func(t *testing.T) billy.Filesystem { + t.Helper() + fs := memfs.New() + writeFSFile(t, fs, "./test1.json", []byte("hello")) + writeFSFile(t, fs, "/dir/test2.json", []byte("hello")) + writeFSFile(t, fs, "dir2/test3.json", []byte("hello")) + return fs + } + for _, tc := range []struct { + name string + createFS func(t *testing.T) billy.Filesystem + mainPath string + alternatives []string + expectedFile string + mustErr bool + }{ + { + name: "mainpath", + createFS: genFS, + mainPath: "./test1.json", + alternatives: []string{"dir/test2.json", "dir2/test.json"}, + expectedFile: "test1.json", + mustErr: false, + }, + { + name: "dir-must-be-ignored", + createFS: func(t *testing.T) billy.Filesystem { + t.Helper() + fs := memfs.New() + writeFSFile(t, fs, "./file.json", []byte("hello")) + require.NoError(t, fs.MkdirAll("./dir", os.FileMode(0o755))) + return fs + }, + mainPath: "./dir", + alternatives: []string{"file.json"}, + expectedFile: "file.json", + mustErr: false, + }, + { + name: "first-alternative", + createFS: genFS, + mainPath: "./non-existent", + alternatives: []string{"dir/test2.json", "dir2/test.json"}, + expectedFile: "dir/test2.json", + mustErr: false, + }, + { + name: "second-alternative", + createFS: genFS, + mainPath: "./non-existent2", + alternatives: []string{"./non-existent", "dir2/test3.json"}, + expectedFile: "dir2/test3.json", + mustErr: false, + }, + { + name: "no-main", + createFS: genFS, + mainPath: "", + alternatives: []string{"dir2/test3.json"}, + expectedFile: "dir2/test3.json", + mustErr: false, + }, + { + name: "no-valid-files", + createFS: genFS, + mainPath: "non-existing", + alternatives: []string{"also-non-existing.txt"}, + expectedFile: "", + mustErr: true, + }, + { + name: "no-inputs", + createFS: genFS, + mainPath: "", + alternatives: []string{}, + expectedFile: "", + mustErr: true, + }, + } { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + fs := tc.createFS(t) + f, err := openFirstAlternative(fs, tc.mainPath, tc.alternatives) + if tc.mustErr { + require.Error(t, err) + return + } + require.NoError(t, err) + require.Equal(t, tc.expectedFile, f.Name()) + }) + } +} + +func TestParseFileAlternatives(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + name string + main string + mustErr bool + }{ + {"fn-success", "test1.json", false}, + {"fn-fails", "", true}, + } { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + fs := memfs.New() + writeFSFile(t, fs, "./test1.json", []byte("{ \"a\": \"b\"}")) + res, err := parseFileAlternatives(fs, tc.main, []string{}) + if tc.mustErr { + require.Error(t, err) + return + } + require.NoError(t, err) + require.NotNil(t, res) + }) + } +} + +func TestNew(t *testing.T) { + t.Parallel() + h, err := newHandlerFromDef(&minderv1.StructDataSource_Def{ + Path: &minderv1.StructDataSource_Def_Path{ + FileName: "test.txt", + }, + }) + require.NoError(t, err) + require.NotNil(t, h) + + _, err = newHandlerFromDef(nil) + require.Error(t, err) +} + +func TestCall(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + name string + buildContext func(t *testing.T) context.Context + def *minderv1.StructDataSource_Def + mustErr bool + }{ + { + "success", + func(t *testing.T) context.Context { + t.Helper() + fs := memfs.New() + writeFSFile(t, fs, "./test1.json", []byte("{ \"a\": \"b\"}")) + + return context.WithValue( + context.Background(), + v1datasources.ContextKey{}, + v1datasources.Context{ + Ingest: &interfaces.Result{Fs: fs}, + }, + ) + }, + &minderv1.StructDataSource_Def{ + Path: &minderv1.StructDataSource_Def_Path{ + FileName: "test1.json", + }, + }, + false, + }, + { + "no-datasource-context", + func(t *testing.T) context.Context { + t.Helper() + return context.Background() + }, + &minderv1.StructDataSource_Def{}, + true, + }, + {"ctx-no-fs", + func(t *testing.T) context.Context { + t.Helper() + return context.WithValue( + context.Background(), + v1datasources.ContextKey{}, + v1datasources.Context{}, + ) + }, + &minderv1.StructDataSource_Def{}, + true}, + } { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + ctx := tc.buildContext(t) + handler, err := newHandlerFromDef(tc.def) + require.NoError(t, err) + _, err = handler.Call(ctx, []string{}) + if tc.mustErr { + require.Error(t, err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/internal/datasources/structured/structured.go b/internal/datasources/structured/structured.go new file mode 100644 index 0000000000..01667c7de6 --- /dev/null +++ b/internal/datasources/structured/structured.go @@ -0,0 +1,51 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package structured implements a data source that parses and returns +// structured data from files stored in a filesystem. +package structured + +import ( + "errors" + + minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + v1datasources "github.com/mindersec/minder/pkg/datasources/v1" +) + +type structDataSource struct { + handlers map[v1datasources.DataSourceFuncKey]v1datasources.DataSourceFuncDef +} + +// ensure that restDataSource implements the v1datasources.DataSource interface +var _ v1datasources.DataSource = (*structDataSource)(nil) + +// GetFuncs implements the v1datasources.DataSource interface. +func (r *structDataSource) GetFuncs() map[v1datasources.DataSourceFuncKey]v1datasources.DataSourceFuncDef { + return r.handlers +} + +// NewStructDataSource builds a new REST data source. +func NewStructDataSource(sds *minderv1.StructDataSource) (v1datasources.DataSource, error) { + if sds == nil { + return nil, errors.New("rest data source is nil") + } + + if sds.GetDef() == nil { + return nil, errors.New("rest data source definition is nil") + } + + out := &structDataSource{ + handlers: make(map[v1datasources.DataSourceFuncKey]v1datasources.DataSourceFuncDef, len(sds.GetDef())), + } + + for key, handlerCfg := range sds.GetDef() { + handler, err := newHandlerFromDef(handlerCfg) + if err != nil { + return nil, err + } + + out.handlers[v1datasources.DataSourceFuncKey(key)] = handler + } + + return out, nil +} diff --git a/internal/datasources/structured/structured_test.go b/internal/datasources/structured/structured_test.go new file mode 100644 index 0000000000..c1f06e5144 --- /dev/null +++ b/internal/datasources/structured/structured_test.go @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package structured + +import ( + "testing" + + "github.com/stretchr/testify/require" + + minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" +) + +func TestNewStructDataSource(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + name string + sds *minderv1.StructDataSource + mustErr bool + }{ + {"nil-def", nil, true}, + {"no-def", &minderv1.StructDataSource{}, true}, + {"invalid-def", &minderv1.StructDataSource{ + Def: map[string]*minderv1.StructDataSource_Def{"test": nil}, + }, true}, + {"success", &minderv1.StructDataSource{ + Def: map[string]*minderv1.StructDataSource_Def{ + "test": { + Path: &minderv1.StructDataSource_Def_Path{FileName: "test.yaml"}, + }, + }, + }, false}, + } { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + _, err := NewStructDataSource(tc.sds) + if tc.mustErr { + require.Error(t, err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/internal/db/datasources.sql.go b/internal/db/datasources.sql.go new file mode 100644 index 0000000000..fc9d4e92ff --- /dev/null +++ b/internal/db/datasources.sql.go @@ -0,0 +1,456 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.27.0 +// source: datasources.sql + +package db + +import ( + "context" + "encoding/json" + + "github.com/google/uuid" + "github.com/lib/pq" +) + +const addDataSourceFunction = `-- name: AddDataSourceFunction :one + +INSERT INTO data_sources_functions (data_source_id, project_id, name, type, definition) +VALUES ($1, $2, $3, $4, $5) RETURNING id, name, type, data_source_id, definition, created_at, updated_at, project_id +` + +type AddDataSourceFunctionParams struct { + DataSourceID uuid.UUID `json:"data_source_id"` + ProjectID uuid.UUID `json:"project_id"` + Name string `json:"name"` + Type string `json:"type"` + Definition json.RawMessage `json:"definition"` +} + +// AddDataSourceFunction adds a function to a datasource. +func (q *Queries) AddDataSourceFunction(ctx context.Context, arg AddDataSourceFunctionParams) (DataSourcesFunction, error) { + row := q.db.QueryRowContext(ctx, addDataSourceFunction, + arg.DataSourceID, + arg.ProjectID, + arg.Name, + arg.Type, + arg.Definition, + ) + var i DataSourcesFunction + err := row.Scan( + &i.ID, + &i.Name, + &i.Type, + &i.DataSourceID, + &i.Definition, + &i.CreatedAt, + &i.UpdatedAt, + &i.ProjectID, + ) + return i, err +} + +const addRuleTypeDataSourceReference = `-- name: AddRuleTypeDataSourceReference :one +INSERT INTO rule_type_data_sources (rule_type_id, data_sources_id, project_id) +VALUES ($1::uuid, $2::uuid, $3::uuid) +RETURNING rule_type_id, data_sources_id, project_id +` + +type AddRuleTypeDataSourceReferenceParams struct { + Ruletypeid uuid.UUID `json:"ruletypeid"` + Datasourceid uuid.UUID `json:"datasourceid"` + Projectid uuid.UUID `json:"projectid"` +} + +// AddRuleTypeDataSourceReference adds a link between one rule type +// and one data source it uses. +func (q *Queries) AddRuleTypeDataSourceReference(ctx context.Context, arg AddRuleTypeDataSourceReferenceParams) (RuleTypeDataSource, error) { + row := q.db.QueryRowContext(ctx, addRuleTypeDataSourceReference, arg.Ruletypeid, arg.Datasourceid, arg.Projectid) + var i RuleTypeDataSource + err := row.Scan(&i.RuleTypeID, &i.DataSourcesID, &i.ProjectID) + return i, err +} + +const createDataSource = `-- name: CreateDataSource :one + +INSERT INTO data_sources (project_id, name, display_name) +VALUES ($1, $2, $3) RETURNING id, name, display_name, project_id, created_at, updated_at +` + +type CreateDataSourceParams struct { + ProjectID uuid.UUID `json:"project_id"` + Name string `json:"name"` + DisplayName string `json:"display_name"` +} + +// CreateDataSource creates a new datasource in a given project. +func (q *Queries) CreateDataSource(ctx context.Context, arg CreateDataSourceParams) (DataSource, error) { + row := q.db.QueryRowContext(ctx, createDataSource, arg.ProjectID, arg.Name, arg.DisplayName) + var i DataSource + err := row.Scan( + &i.ID, + &i.Name, + &i.DisplayName, + &i.ProjectID, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const deleteDataSource = `-- name: DeleteDataSource :one +DELETE FROM data_sources +WHERE id = $1 AND project_id = $2 +RETURNING id, name, display_name, project_id, created_at, updated_at +` + +type DeleteDataSourceParams struct { + ID uuid.UUID `json:"id"` + ProjectID uuid.UUID `json:"project_id"` +} + +func (q *Queries) DeleteDataSource(ctx context.Context, arg DeleteDataSourceParams) (DataSource, error) { + row := q.db.QueryRowContext(ctx, deleteDataSource, arg.ID, arg.ProjectID) + var i DataSource + err := row.Scan( + &i.ID, + &i.Name, + &i.DisplayName, + &i.ProjectID, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const deleteDataSourceFunction = `-- name: DeleteDataSourceFunction :one +DELETE FROM data_sources_functions +WHERE data_source_id = $1 AND name = $2 AND project_id = $3 +RETURNING id, name, type, data_source_id, definition, created_at, updated_at, project_id +` + +type DeleteDataSourceFunctionParams struct { + DataSourceID uuid.UUID `json:"data_source_id"` + Name string `json:"name"` + ProjectID uuid.UUID `json:"project_id"` +} + +func (q *Queries) DeleteDataSourceFunction(ctx context.Context, arg DeleteDataSourceFunctionParams) (DataSourcesFunction, error) { + row := q.db.QueryRowContext(ctx, deleteDataSourceFunction, arg.DataSourceID, arg.Name, arg.ProjectID) + var i DataSourcesFunction + err := row.Scan( + &i.ID, + &i.Name, + &i.Type, + &i.DataSourceID, + &i.Definition, + &i.CreatedAt, + &i.UpdatedAt, + &i.ProjectID, + ) + return i, err +} + +const deleteDataSourceFunctions = `-- name: DeleteDataSourceFunctions :many + +DELETE FROM data_sources_functions +WHERE data_source_id = $1 AND project_id = $2 +RETURNING id, name, type, data_source_id, definition, created_at, updated_at, project_id +` + +type DeleteDataSourceFunctionsParams struct { + DataSourceID uuid.UUID `json:"data_source_id"` + ProjectID uuid.UUID `json:"project_id"` +} + +// DeleteDataSourceFunctions deletes all functions associated with a given datasource +// in a specific project. +func (q *Queries) DeleteDataSourceFunctions(ctx context.Context, arg DeleteDataSourceFunctionsParams) ([]DataSourcesFunction, error) { + rows, err := q.db.QueryContext(ctx, deleteDataSourceFunctions, arg.DataSourceID, arg.ProjectID) + if err != nil { + return nil, err + } + defer rows.Close() + items := []DataSourcesFunction{} + for rows.Next() { + var i DataSourcesFunction + if err := rows.Scan( + &i.ID, + &i.Name, + &i.Type, + &i.DataSourceID, + &i.Definition, + &i.CreatedAt, + &i.UpdatedAt, + &i.ProjectID, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const deleteRuleTypeDataSource = `-- name: DeleteRuleTypeDataSource :exec +DELETE FROM rule_type_data_sources + WHERE rule_type_id = $1 + AND project_id = $2 +` + +type DeleteRuleTypeDataSourceParams struct { + Ruleid uuid.UUID `json:"ruleid"` + Projectid uuid.UUID `json:"projectid"` +} + +func (q *Queries) DeleteRuleTypeDataSource(ctx context.Context, arg DeleteRuleTypeDataSourceParams) error { + _, err := q.db.ExecContext(ctx, deleteRuleTypeDataSource, arg.Ruleid, arg.Projectid) + return err +} + +const getDataSource = `-- name: GetDataSource :one + +SELECT id, name, display_name, project_id, created_at, updated_at FROM data_sources +WHERE id = $1 AND project_id = ANY($2::uuid[]) +` + +type GetDataSourceParams struct { + ID uuid.UUID `json:"id"` + Projects []uuid.UUID `json:"projects"` +} + +// GetDataSource retrieves a datasource by its id and a project hierarchy. +// +// Note that to get a datasource for a given project, one can simply +// pass one project id in the project_id array. +func (q *Queries) GetDataSource(ctx context.Context, arg GetDataSourceParams) (DataSource, error) { + row := q.db.QueryRowContext(ctx, getDataSource, arg.ID, pq.Array(arg.Projects)) + var i DataSource + err := row.Scan( + &i.ID, + &i.Name, + &i.DisplayName, + &i.ProjectID, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const getDataSourceByName = `-- name: GetDataSourceByName :one + +SELECT id, name, display_name, project_id, created_at, updated_at FROM data_sources +WHERE name = $1 AND project_id = ANY($2::uuid[]) +` + +type GetDataSourceByNameParams struct { + Name string `json:"name"` + Projects []uuid.UUID `json:"projects"` +} + +// GetDataSourceByName retrieves a datasource by its name and +// a project hierarchy. +// +// Note that to get a datasource for a given project, one can simply +// pass one project id in the project_id array. +func (q *Queries) GetDataSourceByName(ctx context.Context, arg GetDataSourceByNameParams) (DataSource, error) { + row := q.db.QueryRowContext(ctx, getDataSourceByName, arg.Name, pq.Array(arg.Projects)) + var i DataSource + err := row.Scan( + &i.ID, + &i.Name, + &i.DisplayName, + &i.ProjectID, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const listDataSourceFunctions = `-- name: ListDataSourceFunctions :many + +SELECT id, name, type, data_source_id, definition, created_at, updated_at, project_id FROM data_sources_functions +WHERE data_source_id = $1 AND project_id = $2 +` + +type ListDataSourceFunctionsParams struct { + DataSourceID uuid.UUID `json:"data_source_id"` + ProjectID uuid.UUID `json:"project_id"` +} + +// ListDataSourceFunctions retrieves all functions for a datasource. +func (q *Queries) ListDataSourceFunctions(ctx context.Context, arg ListDataSourceFunctionsParams) ([]DataSourcesFunction, error) { + rows, err := q.db.QueryContext(ctx, listDataSourceFunctions, arg.DataSourceID, arg.ProjectID) + if err != nil { + return nil, err + } + defer rows.Close() + items := []DataSourcesFunction{} + for rows.Next() { + var i DataSourcesFunction + if err := rows.Scan( + &i.ID, + &i.Name, + &i.Type, + &i.DataSourceID, + &i.Definition, + &i.CreatedAt, + &i.UpdatedAt, + &i.ProjectID, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const listDataSources = `-- name: ListDataSources :many + +SELECT id, name, display_name, project_id, created_at, updated_at FROM data_sources +WHERE project_id = ANY($1::uuid[]) +` + +// ListDataSources retrieves all datasources for project hierarchy. +// +// Note that to get a datasource for a given project, one can simply +// pass one project id in the project_id array. +func (q *Queries) ListDataSources(ctx context.Context, projects []uuid.UUID) ([]DataSource, error) { + rows, err := q.db.QueryContext(ctx, listDataSources, pq.Array(projects)) + if err != nil { + return nil, err + } + defer rows.Close() + items := []DataSource{} + for rows.Next() { + var i DataSource + if err := rows.Scan( + &i.ID, + &i.Name, + &i.DisplayName, + &i.ProjectID, + &i.CreatedAt, + &i.UpdatedAt, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const listRuleTypesReferencesByDataSource = `-- name: ListRuleTypesReferencesByDataSource :many +SELECT rule_type_id, data_sources_id, project_id FROM rule_type_data_sources +WHERE data_sources_id = $1 +` + +// ListRuleTypesReferencesByDataSource retrieves all rule types +// referencing a given data source in a given project. +func (q *Queries) ListRuleTypesReferencesByDataSource(ctx context.Context, dataSourcesID uuid.UUID) ([]RuleTypeDataSource, error) { + rows, err := q.db.QueryContext(ctx, listRuleTypesReferencesByDataSource, dataSourcesID) + if err != nil { + return nil, err + } + defer rows.Close() + items := []RuleTypeDataSource{} + for rows.Next() { + var i RuleTypeDataSource + if err := rows.Scan(&i.RuleTypeID, &i.DataSourcesID, &i.ProjectID); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const updateDataSource = `-- name: UpdateDataSource :one + +UPDATE data_sources +SET display_name = $3 +WHERE id = $1 AND project_id = $2 +RETURNING id, name, display_name, project_id, created_at, updated_at +` + +type UpdateDataSourceParams struct { + ID uuid.UUID `json:"id"` + ProjectID uuid.UUID `json:"project_id"` + DisplayName string `json:"display_name"` +} + +// UpdateDataSource updates a datasource in a given project. +func (q *Queries) UpdateDataSource(ctx context.Context, arg UpdateDataSourceParams) (DataSource, error) { + row := q.db.QueryRowContext(ctx, updateDataSource, arg.ID, arg.ProjectID, arg.DisplayName) + var i DataSource + err := row.Scan( + &i.ID, + &i.Name, + &i.DisplayName, + &i.ProjectID, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const updateDataSourceFunction = `-- name: UpdateDataSourceFunction :one + +UPDATE data_sources_functions +SET type = $3, definition = $4, updated_at = NOW() +WHERE data_source_id = $1 AND project_id = $5 AND name = $2 +RETURNING id, name, type, data_source_id, definition, created_at, updated_at, project_id +` + +type UpdateDataSourceFunctionParams struct { + DataSourceID uuid.UUID `json:"data_source_id"` + Name string `json:"name"` + Type string `json:"type"` + Definition json.RawMessage `json:"definition"` + ProjectID uuid.UUID `json:"project_id"` +} + +// UpdateDataSourceFunction updates a function in a datasource. We're +// only able to update the type and definition of the function. +func (q *Queries) UpdateDataSourceFunction(ctx context.Context, arg UpdateDataSourceFunctionParams) (DataSourcesFunction, error) { + row := q.db.QueryRowContext(ctx, updateDataSourceFunction, + arg.DataSourceID, + arg.Name, + arg.Type, + arg.Definition, + arg.ProjectID, + ) + var i DataSourcesFunction + err := row.Scan( + &i.ID, + &i.Name, + &i.Type, + &i.DataSourceID, + &i.Definition, + &i.CreatedAt, + &i.UpdatedAt, + &i.ProjectID, + ) + return i, err +} diff --git a/internal/db/entitlements.sql.go b/internal/db/entitlements.sql.go index 42e48f9960..ff0320782d 100644 --- a/internal/db/entitlements.sql.go +++ b/internal/db/entitlements.sql.go @@ -10,8 +10,25 @@ import ( "encoding/json" "github.com/google/uuid" + "github.com/lib/pq" ) +const createEntitlements = `-- name: CreateEntitlements :exec +INSERT INTO entitlements (feature, project_id) +SELECT unnest($1::text[]), $2::UUID +ON CONFLICT DO NOTHING +` + +type CreateEntitlementsParams struct { + Features []string `json:"features"` + ProjectID uuid.UUID `json:"project_id"` +} + +func (q *Queries) CreateEntitlements(ctx context.Context, arg CreateEntitlementsParams) error { + _, err := q.db.ExecContext(ctx, createEntitlements, pq.Array(arg.Features), arg.ProjectID) + return err +} + const getEntitlementFeaturesByProjectID = `-- name: GetEntitlementFeaturesByProjectID :many SELECT feature FROM entitlements diff --git a/internal/db/eval_history.sql.go b/internal/db/eval_history.sql.go index be29e52656..9291eb6784 100644 --- a/internal/db/eval_history.sql.go +++ b/internal/db/eval_history.sql.go @@ -286,6 +286,7 @@ SELECT s.id::uuid AS evaluation_id, ri.name AS rule_name, rt.severity_value as rule_severity, p.name AS profile_name, + p.labels as profile_labels, -- evaluation status and details s.status AS evaluation_status, s.details AS evaluation_details, @@ -325,10 +326,17 @@ SELECT s.id::uuid AS evaluation_id, AND ($16::timestamp without time zone IS NULL OR s.evaluation_time < $16) -- implicit filter by project id AND j.id = $17 + -- implicit filter by profile labels + AND (($18::text[] IS NULL AND p.labels = array[]::text[]) -- include only unlabelled records + OR (($18::text[] IS NOT NULL AND $18::text[] = array['*']::text[]) -- include all labels + OR ($18::text[] IS NOT NULL AND p.labels && $18::text[]) -- include only specified labels + ) + ) + AND ($19::text[] IS NULL OR NOT p.labels && $19::text[]) -- exclude only specified labels ORDER BY CASE WHEN $1::timestamp without time zone IS NULL THEN s.evaluation_time END ASC, CASE WHEN $2::timestamp without time zone IS NULL THEN s.evaluation_time END DESC - LIMIT $18::bigint + LIMIT $20::bigint ` type ListEvaluationHistoryParams struct { @@ -349,6 +357,8 @@ type ListEvaluationHistoryParams struct { Fromts sql.NullTime `json:"fromts"` Tots sql.NullTime `json:"tots"` Projectid uuid.UUID `json:"projectid"` + Labels []string `json:"labels"` + Notlabels []string `json:"notlabels"` Size int64 `json:"size"` } @@ -362,6 +372,7 @@ type ListEvaluationHistoryRow struct { RuleName string `json:"rule_name"` RuleSeverity Severity `json:"rule_severity"` ProfileName string `json:"profile_name"` + ProfileLabels []string `json:"profile_labels"` EvaluationStatus EvalStatusTypes `json:"evaluation_status"` EvaluationDetails string `json:"evaluation_details"` RemediationStatus NullRemediationStatusTypes `json:"remediation_status"` @@ -389,6 +400,8 @@ func (q *Queries) ListEvaluationHistory(ctx context.Context, arg ListEvaluationH arg.Fromts, arg.Tots, arg.Projectid, + pq.Array(arg.Labels), + pq.Array(arg.Notlabels), arg.Size, ) if err != nil { @@ -408,6 +421,7 @@ func (q *Queries) ListEvaluationHistory(ctx context.Context, arg ListEvaluationH &i.RuleName, &i.RuleSeverity, &i.ProfileName, + pq.Array(&i.ProfileLabels), &i.EvaluationStatus, &i.EvaluationDetails, &i.RemediationStatus, diff --git a/internal/db/eval_history_test.go b/internal/db/eval_history_test.go index 55e4e80457..f14b94c7cf 100644 --- a/internal/db/eval_history_test.go +++ b/internal/db/eval_history_test.go @@ -36,6 +36,34 @@ func TestListEvaluationHistoryFilters(t *testing.T) { ere1 := createRandomEvaluationRuleEntity(t, riID1, repo1.ID) es1 := createRandomEvaluationStatus(t, ere1) + // Evaluations for this profile should not show up in the + // results. + ruleType2 := createRandomRuleType(t, proj.ID) + profile2 := createRandomProfile(t, proj.ID, []string{"label2"}) + fmt.Println(profile2) + riID2 := createRandomRuleInstance( + t, + proj.ID, + profile2.ID, + ruleType2.ID, + ) + ere2 := createRandomEvaluationRuleEntity(t, riID2, repo1.ID) + es2 := createRandomEvaluationStatus(t, ere2) + + // Evaluations for this profile should not show up in the + // results. + ruleType3 := createRandomRuleType(t, proj.ID) + profile3 := createRandomProfile(t, proj.ID, []string{"label3"}) + fmt.Println(profile3) + riID3 := createRandomRuleInstance( + t, + proj.ID, + profile3.ID, + ruleType3.ID, + ) + ere3 := createRandomEvaluationRuleEntity(t, riID3, repo1.ID) + es3 := createRandomEvaluationStatus(t, ere3) + tests := []struct { name string params ListEvaluationHistoryParams @@ -392,6 +420,193 @@ func TestListEvaluationHistoryFilters(t *testing.T) { }, }, + // profile labels filter + { + name: "profile labels filter missing", + params: ListEvaluationHistoryParams{ + Next: sql.NullTime{ + Time: time.UnixMicro(999999999999999999).UTC(), + Valid: true, + }, + Projectid: proj.ID, + Size: 5, + }, + checkf: func(t *testing.T, rows []ListEvaluationHistoryRow) { + t.Helper() + require.Len(t, rows, 1) + row := rows[0] + require.Equal(t, es1, row.EvaluationID) + require.Equal(t, EntitiesRepository, row.EntityType) + require.Equal(t, repo1.ID, row.EntityID) + require.Empty(t, row.ProfileLabels) + }, + }, + { + name: "profile labels filter include", + params: ListEvaluationHistoryParams{ + Next: sql.NullTime{ + Time: time.UnixMicro(999999999999999999).UTC(), + Valid: true, + }, + Labels: []string{"nonexisting"}, + Projectid: proj.ID, + Size: 5, + }, + checkf: func(t *testing.T, rows []ListEvaluationHistoryRow) { + t.Helper() + require.Len(t, rows, 0) + }, + }, + { + name: "profile labels filter include match label2", + params: ListEvaluationHistoryParams{ + Next: sql.NullTime{ + Time: time.UnixMicro(999999999999999999).UTC(), + Valid: true, + }, + Labels: []string{"label2"}, + Projectid: proj.ID, + Size: 5, + }, + checkf: func(t *testing.T, rows []ListEvaluationHistoryRow) { + t.Helper() + require.Len(t, rows, 1) + row := rows[0] + require.Equal(t, es2, row.EvaluationID) + require.Equal(t, EntitiesRepository, row.EntityType) + require.Equal(t, repo1.ID, row.EntityID) + require.Equal(t, profile2.Labels, row.ProfileLabels) + }, + }, + { + name: "profile labels filter include match label3", + params: ListEvaluationHistoryParams{ + Next: sql.NullTime{ + Time: time.UnixMicro(999999999999999999).UTC(), + Valid: true, + }, + Labels: []string{"label3"}, + Projectid: proj.ID, + Size: 5, + }, + checkf: func(t *testing.T, rows []ListEvaluationHistoryRow) { + t.Helper() + require.Len(t, rows, 1) + row := rows[0] + require.Equal(t, es3, row.EvaluationID) + require.Equal(t, EntitiesRepository, row.EntityType) + require.Equal(t, repo1.ID, row.EntityID) + require.Equal(t, profile3.Labels, row.ProfileLabels) + }, + }, + { + name: "profile labels filter match *", + params: ListEvaluationHistoryParams{ + Next: sql.NullTime{ + Time: time.UnixMicro(999999999999999999).UTC(), + Valid: true, + }, + Labels: []string{"*"}, + Projectid: proj.ID, + Size: 5, + }, + checkf: func(t *testing.T, rows []ListEvaluationHistoryRow) { + t.Helper() + require.Len(t, rows, 3) + + row := rows[0] + require.Equal(t, es3, row.EvaluationID) + require.Equal(t, EntitiesRepository, row.EntityType) + require.Equal(t, repo1.ID, row.EntityID) + require.Equal(t, profile3.Labels, row.ProfileLabels) + + row = rows[1] + require.Equal(t, es2, row.EvaluationID) + require.Equal(t, EntitiesRepository, row.EntityType) + require.Equal(t, repo1.ID, row.EntityID) + require.Equal(t, profile2.Labels, row.ProfileLabels) + + row = rows[2] + require.Equal(t, es1, row.EvaluationID) + require.Equal(t, EntitiesRepository, row.EntityType) + require.Equal(t, repo1.ID, row.EntityID) + require.Equal(t, profile1.Labels, row.ProfileLabels) + }, + }, + { + name: "profile labels filter exclude label2", + params: ListEvaluationHistoryParams{ + Next: sql.NullTime{ + Time: time.UnixMicro(999999999999999999).UTC(), + Valid: true, + }, + Notlabels: []string{"label2"}, + Projectid: proj.ID, + Size: 5, + }, + checkf: func(t *testing.T, rows []ListEvaluationHistoryRow) { + t.Helper() + require.Len(t, rows, 1) + + row := rows[0] + require.Equal(t, es1, row.EvaluationID) + require.Equal(t, EntitiesRepository, row.EntityType) + require.Equal(t, repo1.ID, row.EntityID) + require.Equal(t, profile1.Labels, row.ProfileLabels) + }, + }, + { + name: "profile labels filter exclude label3", + params: ListEvaluationHistoryParams{ + Next: sql.NullTime{ + Time: time.UnixMicro(999999999999999999).UTC(), + Valid: true, + }, + Notlabels: []string{"label3"}, + Projectid: proj.ID, + Size: 5, + }, + checkf: func(t *testing.T, rows []ListEvaluationHistoryRow) { + t.Helper() + require.Len(t, rows, 1) + + row := rows[0] + require.Equal(t, es1, row.EvaluationID) + require.Equal(t, EntitiesRepository, row.EntityType) + require.Equal(t, repo1.ID, row.EntityID) + require.Equal(t, profile1.Labels, row.ProfileLabels) + }, + }, + { + name: "profile labels filter include * exclude label2", + params: ListEvaluationHistoryParams{ + Next: sql.NullTime{ + Time: time.UnixMicro(999999999999999999).UTC(), + Valid: true, + }, + Labels: []string{"*"}, + Notlabels: []string{"label3"}, + Projectid: proj.ID, + Size: 5, + }, + checkf: func(t *testing.T, rows []ListEvaluationHistoryRow) { + t.Helper() + require.Len(t, rows, 2) + + row := rows[0] + require.Equal(t, es2, row.EvaluationID) + require.Equal(t, EntitiesRepository, row.EntityType) + require.Equal(t, repo1.ID, row.EntityID) + require.Equal(t, profile2.Labels, row.ProfileLabels) + + row = rows[1] + require.Equal(t, es1, row.EvaluationID) + require.Equal(t, EntitiesRepository, row.EntityType) + require.Equal(t, repo1.ID, row.EntityID) + require.Equal(t, profile1.Labels, row.ProfileLabels) + }, + }, + // time range filter { name: "time range filter from +1h", @@ -671,6 +886,7 @@ func TestGetEvaluationHistory(t *testing.T) { for i := 0; i < 10; i++ { repos = append(repos, createRandomRepository(t, proj.ID, prov)) } + ruleType1 := createRandomRuleType(t, proj.ID) profile1 := createRandomProfile(t, proj.ID, []string{}) riID1 := createRandomRuleInstance( diff --git a/internal/db/models.go b/internal/db/models.go index e39a96b748..8011451821 100644 --- a/internal/db/models.go +++ b/internal/db/models.go @@ -495,6 +495,26 @@ type Bundle struct { Name string `json:"name"` } +type DataSource struct { + ID uuid.UUID `json:"id"` + Name string `json:"name"` + DisplayName string `json:"display_name"` + ProjectID uuid.UUID `json:"project_id"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` +} + +type DataSourcesFunction struct { + ID uuid.UUID `json:"id"` + Name string `json:"name"` + Type string `json:"type"` + DataSourceID uuid.UUID `json:"data_source_id"` + Definition json.RawMessage `json:"definition"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + ProjectID uuid.UUID `json:"project_id"` +} + type Entitlement struct { ID uuid.UUID `json:"id"` Feature string `json:"feature"` @@ -736,6 +756,12 @@ type RuleType struct { ShortFailureMessage string `json:"short_failure_message"` } +type RuleTypeDataSource struct { + RuleTypeID uuid.UUID `json:"rule_type_id"` + DataSourcesID uuid.UUID `json:"data_sources_id"` + ProjectID uuid.UUID `json:"project_id"` +} + type SessionStore struct { ID int32 `json:"id"` Provider string `json:"provider"` diff --git a/internal/db/projects.sql.go b/internal/db/projects.sql.go index 4d256dce05..445f93e3b3 100644 --- a/internal/db/projects.sql.go +++ b/internal/db/projects.sql.go @@ -347,6 +347,63 @@ func (q *Queries) GetProjectByName(ctx context.Context, name string) (Project, e return i, err } +const getRootProjectByID = `-- name: GetRootProjectByID :one +SELECT id, name, is_organization, metadata, parent_id, created_at, updated_at FROM projects +WHERE id = $1 +AND parent_id IS NULL AND is_organization = FALSE LIMIT 1 +` + +func (q *Queries) GetRootProjectByID(ctx context.Context, id uuid.UUID) (Project, error) { + row := q.db.QueryRowContext(ctx, getRootProjectByID, id) + var i Project + err := row.Scan( + &i.ID, + &i.Name, + &i.IsOrganization, + &i.Metadata, + &i.ParentID, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const listAllRootProjects = `-- name: ListAllRootProjects :many +SELECT id, name, is_organization, metadata, parent_id, created_at, updated_at FROM projects +WHERE parent_id IS NULL AND is_organization = FALSE +` + +func (q *Queries) ListAllRootProjects(ctx context.Context) ([]Project, error) { + rows, err := q.db.QueryContext(ctx, listAllRootProjects) + if err != nil { + return nil, err + } + defer rows.Close() + items := []Project{} + for rows.Next() { + var i Project + if err := rows.Scan( + &i.ID, + &i.Name, + &i.IsOrganization, + &i.Metadata, + &i.ParentID, + &i.CreatedAt, + &i.UpdatedAt, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const orphanProject = `-- name: OrphanProject :one UPDATE projects diff --git a/internal/db/querier.go b/internal/db/querier.go index d4a4ba7472..e48d845829 100644 --- a/internal/db/querier.go +++ b/internal/db/querier.go @@ -13,6 +13,12 @@ import ( ) type Querier interface { + // AddDataSourceFunction adds a function to a datasource. + AddDataSourceFunction(ctx context.Context, arg AddDataSourceFunctionParams) (DataSourcesFunction, error) + // AddRuleTypeDataSourceReference adds a link between one rule type + // and one data source it uses. + // + AddRuleTypeDataSourceReference(ctx context.Context, arg AddRuleTypeDataSourceReferenceParams) (RuleTypeDataSource, error) BulkGetProfilesByID(ctx context.Context, profileIds []uuid.UUID) ([]BulkGetProfilesByIDRow, error) CountProfilesByEntityType(ctx context.Context) ([]CountProfilesByEntityTypeRow, error) CountProfilesByName(ctx context.Context, name string) (int64, error) @@ -20,6 +26,9 @@ type Querier interface { CountRepositories(ctx context.Context) (int64, error) CountRepositoriesByProjectID(ctx context.Context, projectID uuid.UUID) (int64, error) CountUsers(ctx context.Context) (int64, error) + // CreateDataSource creates a new datasource in a given project. + CreateDataSource(ctx context.Context, arg CreateDataSourceParams) (DataSource, error) + CreateEntitlements(ctx context.Context, arg CreateEntitlementsParams) error // CreateEntity adds an entry to the entity_instances table so it can be tracked by Minder. CreateEntity(ctx context.Context, arg CreateEntityParams) (EntityInstance, error) // CreateEntityWithID adds an entry to the entities table with a specific ID so it can be tracked by Minder. @@ -46,6 +55,11 @@ type Querier interface { CreateUser(ctx context.Context, identitySubject string) (User, error) DeleteAllPropertiesForEntity(ctx context.Context, entityID uuid.UUID) error DeleteArtifact(ctx context.Context, id uuid.UUID) error + DeleteDataSource(ctx context.Context, arg DeleteDataSourceParams) (DataSource, error) + DeleteDataSourceFunction(ctx context.Context, arg DeleteDataSourceFunctionParams) (DataSourcesFunction, error) + // DeleteDataSourceFunctions deletes all functions associated with a given datasource + // in a specific project. + DeleteDataSourceFunctions(ctx context.Context, arg DeleteDataSourceFunctionsParams) ([]DataSourcesFunction, error) // DeleteEntity removes an entity from the entity_instances table for a project. DeleteEntity(ctx context.Context, arg DeleteEntityParams) error DeleteEvaluationHistoryByIDs(ctx context.Context, evaluationids []uuid.UUID) (int64, error) @@ -62,7 +76,9 @@ type Querier interface { DeleteProperty(ctx context.Context, arg DeletePropertyParams) error DeleteProvider(ctx context.Context, arg DeleteProviderParams) error DeleteRepository(ctx context.Context, id uuid.UUID) error + DeleteRuleInstanceOfProfileInProject(ctx context.Context, arg DeleteRuleInstanceOfProfileInProjectParams) error DeleteRuleType(ctx context.Context, id uuid.UUID) error + DeleteRuleTypeDataSource(ctx context.Context, arg DeleteRuleTypeDataSourceParams) error DeleteSelector(ctx context.Context, id uuid.UUID) error DeleteSelectorsByProfileID(ctx context.Context, profileID uuid.UUID) error DeleteSessionStateByProjectID(ctx context.Context, arg DeleteSessionStateByProjectIDParams) error @@ -82,6 +98,17 @@ type Querier interface { GetArtifactByName(ctx context.Context, arg GetArtifactByNameParams) (Artifact, error) GetBundle(ctx context.Context, arg GetBundleParams) (Bundle, error) GetChildrenProjects(ctx context.Context, id uuid.UUID) ([]GetChildrenProjectsRow, error) + // GetDataSource retrieves a datasource by its id and a project hierarchy. + // + // Note that to get a datasource for a given project, one can simply + // pass one project id in the project_id array. + GetDataSource(ctx context.Context, arg GetDataSourceParams) (DataSource, error) + // GetDataSourceByName retrieves a datasource by its name and + // a project hierarchy. + // + // Note that to get a datasource for a given project, one can simply + // pass one project id in the project_id array. + GetDataSourceByName(ctx context.Context, arg GetDataSourceByNameParams) (DataSource, error) // GetEntitiesByProjectHierarchy retrieves all entities for a project or hierarchy of projects. GetEntitiesByProjectHierarchy(ctx context.Context, projects []uuid.UUID) ([]EntityInstance, error) // GetEntitiesByProvider retrieves all entities of a given provider. @@ -148,6 +175,7 @@ type Querier interface { GetRepositoryByIDAndProject(ctx context.Context, arg GetRepositoryByIDAndProjectParams) (Repository, error) GetRepositoryByRepoID(ctx context.Context, repoID int64) (Repository, error) GetRepositoryByRepoName(ctx context.Context, arg GetRepositoryByRepoNameParams) (Repository, error) + GetRootProjectByID(ctx context.Context, id uuid.UUID) (Project, error) GetRuleInstancesEntityInProjects(ctx context.Context, arg GetRuleInstancesEntityInProjectsParams) ([]RuleInstance, error) GetRuleInstancesForProfile(ctx context.Context, profileID uuid.UUID) ([]RuleInstance, error) GetRuleTypeByID(ctx context.Context, id uuid.UUID) (RuleType, error) @@ -172,7 +200,15 @@ type Querier interface { InsertEvaluationRuleEntity(ctx context.Context, arg InsertEvaluationRuleEntityParams) (uuid.UUID, error) InsertEvaluationStatus(ctx context.Context, arg InsertEvaluationStatusParams) (uuid.UUID, error) InsertRemediationEvent(ctx context.Context, arg InsertRemediationEventParams) error + ListAllRootProjects(ctx context.Context) ([]Project, error) ListArtifactsByRepoID(ctx context.Context, repositoryID uuid.NullUUID) ([]Artifact, error) + // ListDataSourceFunctions retrieves all functions for a datasource. + ListDataSourceFunctions(ctx context.Context, arg ListDataSourceFunctionsParams) ([]DataSourcesFunction, error) + // ListDataSources retrieves all datasources for project hierarchy. + // + // Note that to get a datasource for a given project, one can simply + // pass one project id in the project_id array. + ListDataSources(ctx context.Context, projects []uuid.UUID) ([]DataSource, error) ListEvaluationHistory(ctx context.Context, arg ListEvaluationHistoryParams) ([]ListEvaluationHistoryRow, error) ListEvaluationHistoryStaleRecords(ctx context.Context, arg ListEvaluationHistoryStaleRecordsParams) ([]ListEvaluationHistoryStaleRecordsRow, error) ListFlushCache(ctx context.Context) ([]FlushCache, error) @@ -197,6 +233,10 @@ type Querier interface { ListRepositoriesByProjectID(ctx context.Context, arg ListRepositoriesByProjectIDParams) ([]Repository, error) ListRuleEvaluationsByProfileId(ctx context.Context, arg ListRuleEvaluationsByProfileIdParams) ([]ListRuleEvaluationsByProfileIdRow, error) ListRuleTypesByProject(ctx context.Context, projectID uuid.UUID) ([]RuleType, error) + // ListRuleTypesReferencesByDataSource retrieves all rule types + // referencing a given data source in a given project. + // + ListRuleTypesReferencesByDataSource(ctx context.Context, dataSourcesID uuid.UUID) ([]RuleTypeDataSource, error) // When doing a key/algorithm rotation, identify the secrets which need to be // rotated. The criteria for rotation are: // 1) The encrypted_access_token is NULL (this should be removed when we make @@ -220,7 +260,12 @@ type Querier interface { // value. ReleaseLock(ctx context.Context, arg ReleaseLockParams) error RepositoryExistsAfterID(ctx context.Context, id uuid.UUID) (bool, error) - SetCurrentVersion(ctx context.Context, arg SetCurrentVersionParams) error + SetSubscriptionBundleVersion(ctx context.Context, arg SetSubscriptionBundleVersionParams) error + // UpdateDataSource updates a datasource in a given project. + UpdateDataSource(ctx context.Context, arg UpdateDataSourceParams) (DataSource, error) + // UpdateDataSourceFunction updates a function in a datasource. We're + // only able to update the type and definition of the function. + UpdateDataSourceFunction(ctx context.Context, arg UpdateDataSourceFunctionParams) (DataSourcesFunction, error) UpdateEncryptedSecret(ctx context.Context, arg UpdateEncryptedSecretParams) error // UpdateInvitationRole updates an invitation by its code. This is intended to be // called by a user who has issued an invitation and then decided to change the diff --git a/internal/db/rule_instances.sql.go b/internal/db/rule_instances.sql.go index 813360ebdb..605ce12876 100644 --- a/internal/db/rule_instances.sql.go +++ b/internal/db/rule_instances.sql.go @@ -31,6 +31,21 @@ func (q *Queries) DeleteNonUpdatedRules(ctx context.Context, arg DeleteNonUpdate return err } +const deleteRuleInstanceOfProfileInProject = `-- name: DeleteRuleInstanceOfProfileInProject :exec +DELETE FROM rule_instances WHERE project_id = $1 AND profile_id = $2 AND rule_type_id = $3 +` + +type DeleteRuleInstanceOfProfileInProjectParams struct { + ProjectID uuid.UUID `json:"project_id"` + ProfileID uuid.UUID `json:"profile_id"` + RuleTypeID uuid.UUID `json:"rule_type_id"` +} + +func (q *Queries) DeleteRuleInstanceOfProfileInProject(ctx context.Context, arg DeleteRuleInstanceOfProfileInProjectParams) error { + _, err := q.db.ExecContext(ctx, deleteRuleInstanceOfProfileInProject, arg.ProjectID, arg.ProfileID, arg.RuleTypeID) + return err +} + const getRuleInstancesEntityInProjects = `-- name: GetRuleInstancesEntityInProjects :many SELECT id, profile_id, rule_type_id, name, entity_type, def, params, created_at, updated_at, project_id FROM rule_instances WHERE entity_type = $1 diff --git a/internal/db/subscriptions.sql.go b/internal/db/subscriptions.sql.go index 3b71d23290..456e498c3d 100644 --- a/internal/db/subscriptions.sql.go +++ b/internal/db/subscriptions.sql.go @@ -77,21 +77,17 @@ func (q *Queries) GetSubscriptionByProjectBundle(ctx context.Context, arg GetSub return i, err } -const setCurrentVersion = `-- name: SetCurrentVersion :exec -UPDATE subscriptions -SET current_version = $1 -FROM subscriptions AS su -JOIN bundles as bu ON su.bundle_id = bu.id -WHERE su.project_id = $2 AND bu.namespace = $1 AND bu.name = $2 +const setSubscriptionBundleVersion = `-- name: SetSubscriptionBundleVersion :exec +UPDATE subscriptions SET current_version = $2 WHERE project_id = $1 ` -type SetCurrentVersionParams struct { - CurrentVersion string `json:"current_version"` +type SetSubscriptionBundleVersionParams struct { ProjectID uuid.UUID `json:"project_id"` + CurrentVersion string `json:"current_version"` } -func (q *Queries) SetCurrentVersion(ctx context.Context, arg SetCurrentVersionParams) error { - _, err := q.db.ExecContext(ctx, setCurrentVersion, arg.CurrentVersion, arg.ProjectID) +func (q *Queries) SetSubscriptionBundleVersion(ctx context.Context, arg SetSubscriptionBundleVersionParams) error { + _, err := q.db.ExecContext(ctx, setSubscriptionBundleVersion, arg.ProjectID, arg.CurrentVersion) return err } diff --git a/internal/deps/extractor.go b/internal/deps/extractor.go new file mode 100644 index 0000000000..d25514114a --- /dev/null +++ b/internal/deps/extractor.go @@ -0,0 +1,23 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package deps abstracts a dependency extractor +package deps + +import ( + "context" + "io/fs" + + "github.com/protobom/protobom/pkg/sbom" + + "github.com/mindersec/minder/internal/deps/scalibr" +) + +var _ Extractor = (*scalibr.Extractor)(nil) + +// Extractor is the object that groups the dependency extractor. It shields the +// implementations that Minder uses behinf a common interface to extract depencies +// from filesystems. +type Extractor interface { + ScanFilesystem(context.Context, fs.FS) (*sbom.NodeList, error) +} diff --git a/internal/deps/scalibr/scalibr.go b/internal/deps/scalibr/scalibr.go new file mode 100644 index 0000000000..9b1efcc2f5 --- /dev/null +++ b/internal/deps/scalibr/scalibr.go @@ -0,0 +1,104 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package scalibr implements a dependency extractor using the osv-scalibr +// library. +package scalibr + +import ( + "context" + "errors" + "fmt" + "io/fs" + "slices" + + scalibr "github.com/google/osv-scalibr" + "github.com/google/osv-scalibr/extractor/filesystem" + "github.com/google/osv-scalibr/extractor/filesystem/language/golang/gobinary" + "github.com/google/osv-scalibr/extractor/filesystem/list" + scalibr_fs "github.com/google/osv-scalibr/fs" + scalibr_plugin "github.com/google/osv-scalibr/plugin" + "github.com/google/uuid" + "github.com/protobom/protobom/pkg/sbom" +) + +// Extractor is a dependency extractor based on osv-scalibr. +type Extractor struct { +} + +// NewExtractor creates a new scalibr dependency extractor +func NewExtractor() *Extractor { + return &Extractor{} +} + +// ScanFilesystem takes +func (*Extractor) ScanFilesystem(ctx context.Context, iofs fs.FS) (*sbom.NodeList, error) { + return scanFilesystem(ctx, iofs) +} + +func scanFilesystem(ctx context.Context, iofs fs.FS) (*sbom.NodeList, error) { + if iofs == nil { + return nil, errors.New("unable to scan dependencies, no filesystem") + } + // have to down-cast here, because scalibr needs multiple io/fs types + wrapped, ok := iofs.(scalibr_fs.FS) + if !ok { + return nil, errors.New("error converting filesystem to ReadDirFS") + } + + desiredCaps := scalibr_plugin.Capabilities{ + OS: scalibr_plugin.OSLinux, + Network: false, // Don't fetch over the network, as we may be running in a trusted context. + DirectFS: false, + RunningSystem: false, + } + + scalibrFs := scalibr_fs.ScanRoot{FS: wrapped} + extractors := list.FilterByCapabilities(list.Default, &desiredCaps) + // Don't run the go binary extractor; it sometimes panics on certain files. + extractors = slices.DeleteFunc(extractors, func(e filesystem.Extractor) bool { + _, ok := e.(*gobinary.Extractor) + return ok + }) + scanConfig := scalibr.ScanConfig{ + ScanRoots: []*scalibr_fs.ScanRoot{&scalibrFs}, + // All includes Ruby, Dotnet which we're not ready to test yet, so use the more limited Default set. + FilesystemExtractors: extractors, + Capabilities: &desiredCaps, + } + + scanner := scalibr.New() + scanResults := scanner.Scan(ctx, &scanConfig) + + if scanResults == nil || scanResults.Status == nil { + return nil, fmt.Errorf("error scanning files: no results") + } + if scanResults.Status.Status != scalibr_plugin.ScanStatusSucceeded { + return nil, fmt.Errorf("error scanning files: %s", scanResults.Status) + } + + res := sbom.NewNodeList() + for _, inv := range scanResults.Inventories { + node := &sbom.Node{ + Type: sbom.Node_PACKAGE, + Id: uuid.New().String(), + Name: inv.Name, + Version: inv.Version, + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): inv.Extractor.ToPURL(inv).String(), + // TODO: scalibr returns a _list_ of CPEs, but protobom will store one. + // use the first? + // int32(sbom.SoftwareIdentifierType_CPE23): inv.Extractor.ToCPEs(inv), + }, + } + for _, l := range inv.Locations { + node.Properties = append(node.Properties, &sbom.Property{ + Name: "sourceFile", + Data: l, + }) + } + res.AddNode(node) + } + + return res, nil +} diff --git a/internal/deps/scalibr/scalibr_test.go b/internal/deps/scalibr/scalibr_test.go new file mode 100644 index 0000000000..bacf357b79 --- /dev/null +++ b/internal/deps/scalibr/scalibr_test.go @@ -0,0 +1,102 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package scalibr + +import ( + "context" + "fmt" + "io/fs" + "strings" + "testing" + + "github.com/go-git/go-billy/v5/helper/iofs" + "github.com/go-git/go-billy/v5/memfs" + "github.com/protobom/protobom/pkg/sbom" + "github.com/stretchr/testify/require" +) + +func TestScanFilesystem(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + name string + makeFs func() fs.FS + mustErr bool + expect *sbom.NodeList + expectedLen int + }{ + { + name: "python-reqs-txt", + makeFs: func() fs.FS { + t.Helper() + memFS := memfs.New() + f, err := memFS.Create("requirements.txt") + require.NoError(t, err) + _, err = f.Write([]byte("Flask>=1\nrequestts>=1\n")) + require.NoError(t, err) + require.NoError(t, f.Close()) + return iofs.New(memFS) + }, + expectedLen: 2, + expect: &sbom.NodeList{ + Nodes: []*sbom.Node{ + { + Id: "0000000000", + Type: sbom.Node_PACKAGE, + Name: "Flask", + Version: "1", + Identifiers: map[int32]string{ + 1: "pkg:pypi/flask@1", + }, + Properties: []*sbom.Property{ + { + Name: "sourceFile", + Data: "requirements.txt", + }, + }, + }, + { + Id: "1111111111", + Type: sbom.Node_PACKAGE, + Name: "requestts", + Version: "1", + Identifiers: map[int32]string{ + 1: "pkg:pypi/requestts@1", + }, + Properties: []*sbom.Property{ + { + Name: "sourceFile", + Data: "requirements.txt", + }, + }, + }, + }, + }, + }, + { + name: "bad-fs", + makeFs: func() fs.FS { + return nil + }, + mustErr: true, + }, + } { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + fs := tc.makeFs() + nodelist, err := scanFilesystem(context.Background(), fs) + if tc.mustErr { + require.Error(t, err) + return + } + require.NoError(t, err) + require.Len(t, nodelist.Nodes, tc.expectedLen) + + // Compare the nodes, make sure they are equal + for i := range nodelist.Nodes { + nodelist.Nodes[i].Id = strings.Repeat(fmt.Sprintf("%d", i), 10) + require.Equal(t, tc.expect.Nodes[i].Checksum(), nodelist.Nodes[i].Checksum()) + } + }) + } +} diff --git a/internal/eea/eea.go b/internal/eea/eea.go index 3fd6c50794..416eeaa62f 100644 --- a/internal/eea/eea.go +++ b/internal/eea/eea.go @@ -20,6 +20,7 @@ import ( "github.com/mindersec/minder/internal/db" "github.com/mindersec/minder/internal/engine/entities" "github.com/mindersec/minder/internal/entities/properties/service" + pbinternal "github.com/mindersec/minder/internal/proto" "github.com/mindersec/minder/internal/providers/manager" minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" serverconfig "github.com/mindersec/minder/pkg/config/server" @@ -344,7 +345,7 @@ func (e *EEA) buildPullRequestInfoWrapper( return nil, fmt.Errorf("error converting entity to protobuf: %w", err) } - pr, ok := rawPR.(*minderv1.PullRequest) + pr, ok := rawPR.(*pbinternal.PullRequest) if !ok { return nil, fmt.Errorf("error converting entity to pull request") } diff --git a/internal/eea/eea_test.go b/internal/eea/eea_test.go index 8b15ab62eb..e5c23ae62d 100644 --- a/internal/eea/eea_test.go +++ b/internal/eea/eea_test.go @@ -27,6 +27,7 @@ import ( "github.com/mindersec/minder/internal/entities/properties" psvc "github.com/mindersec/minder/internal/entities/properties/service" propsvcmock "github.com/mindersec/minder/internal/entities/properties/service/mock" + pbinternal "github.com/mindersec/minder/internal/proto" mockmanager "github.com/mindersec/minder/internal/providers/manager/mock" minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" serverconfig "github.com/mindersec/minder/pkg/config/server" @@ -324,7 +325,7 @@ func TestFlushAll(t *testing.T) { }, nil) mockPropSvc.EXPECT().EntityWithPropertiesAsProto(gomock.Any(), gomock.Any(), gomock.Any()). - Return(&minderv1.PullRequest{}, nil) + Return(&pbinternal.PullRequest{}, nil) }, }, } diff --git a/internal/email/email.go b/internal/email/email.go index acbe0a0fd6..bcbabd9b10 100644 --- a/internal/email/email.go +++ b/internal/email/email.go @@ -7,17 +7,28 @@ package email import ( "context" "encoding/json" + "errors" "fmt" + "html/template" + "reflect" "strings" "github.com/ThreeDotsLabs/watermill/message" - "github.com/docker/cli/templates" "github.com/google/uuid" - "github.com/rs/zerolog" "github.com/mindersec/minder/internal/authz" + "github.com/mindersec/minder/internal/util" ) +// ErrValidationFailed is returned when the template data source fails validation +var ErrValidationFailed = errors.New("validation failed") + +// NewErrValidationFailed creates a new error for failed validation +func NewErrValidationFailed(fieldName, fieldValue string) error { + msg := fmt.Sprintf("field %s failed validation %s", fieldName, fieldValue) + return fmt.Errorf("%w: %s", ErrValidationFailed, msg) +} + const ( // TopicQueueInviteEmail is the topic for sending invite emails TopicQueueInviteEmail = "invite.email.event" @@ -25,6 +36,10 @@ const ( DefaultMinderTermsURL = "https://stacklok.com/stacklok-terms-of-service" // DefaultMinderPrivacyURL is the default privacy URL for minder DefaultMinderPrivacyURL = "https://stacklok.com/privacy-policy/" + // BodyMaxLength is the maximum length of the email body + BodyMaxLength = 10000 + // MaxFieldLength is the maximum length of a string field + MaxFieldLength = 200 ) // MailEventPayload is the event payload for sending an invitation email @@ -35,6 +50,19 @@ type MailEventPayload struct { BodyText string `json:"body_text"` } +type bodyData struct { + AdminName string + OrganizationName string + InvitationURL string + RecipientEmail string + MinderURL string + TermsURL string + PrivacyURL string + SignInURL string + RoleName string + RoleVerb string +} + // NewMessage creates a new message for sending an invitation email func NewMessage( ctx context.Context, @@ -43,15 +71,45 @@ func NewMessage( // Generate a new message UUID id, err := uuid.NewUUID() if err != nil { - return nil, fmt.Errorf("error generating UUID: %w", err) + return nil, err } + // Populate the template data source + data := bodyData{ + AdminName: sponsorDisplay, + OrganizationName: projectDisplay, + InvitationURL: inviteURL, + RecipientEmail: inviteeEmail, + MinderURL: minderURLBase, + TermsURL: DefaultMinderTermsURL, + PrivacyURL: DefaultMinderPrivacyURL, + SignInURL: minderURLBase, + RoleName: role, + RoleVerb: authz.AllRolesVerbs[authz.Role(role)], + } + // Validate the data source template for HTML injection attacks or empty fields + if err = data.Validate(); err != nil { + return nil, err + } + // Create the HTML and text bodies + strBodyHTML, err := data.GetEmailBodyHTML(ctx) + if err != nil { + return nil, err + } + strBodyText, err := data.GetEmailBodyText(ctx) + if err != nil { + return nil, err + } + strSubject, err := data.GetEmailSubject() + if err != nil { + return nil, err + } // Create the payload payload, err := json.Marshal(MailEventPayload{ Address: inviteeEmail, - Subject: getEmailSubject(projectDisplay), - BodyHTML: getEmailBodyHTML(ctx, inviteURL, minderURLBase, sponsorDisplay, projectDisplay, role, inviteeEmail), - BodyText: getEmailBodyText(inviteURL, sponsorDisplay, projectDisplay, role), + Subject: strSubject, + BodyHTML: strBodyHTML, + BodyText: strBodyText, }) if err != nil { return nil, fmt.Errorf("error marshalling payload for email event: %w", err) @@ -61,56 +119,84 @@ func NewMessage( return message.NewMessage(id.String(), payload), nil } -// getBodyHTML returns the HTML body for the email based on the message payload -func getEmailBodyHTML(ctx context.Context, inviteURL, minderURL, sponsor, project, role, inviteeEmail string) string { - data := struct { - AdminName string - OrganizationName string - InvitationURL string - RecipientEmail string - MinderURL string - TermsURL string - PrivacyURL string - SignInURL string - RoleName string - RoleVerb string - }{ - AdminName: sponsor, - OrganizationName: project, - InvitationURL: inviteURL, - RecipientEmail: inviteeEmail, - MinderURL: minderURL, - TermsURL: DefaultMinderTermsURL, - PrivacyURL: DefaultMinderPrivacyURL, - SignInURL: minderURL, - RoleName: role, - RoleVerb: authz.AllRolesVerbs[authz.Role(role)], +// GetEmailBodyHTML returns the HTML body for the email based on the message payload. +// If there is an error creating the HTML body, it will try to return the text body instead +func (b *bodyData) GetEmailBodyHTML(ctx context.Context) (string, error) { + var builder strings.Builder + bHTML := bodyHTML + + bodyHTMLTmpl, err := util.NewSafeHTMLTemplate(&bHTML, "body-invite-html") + if err != nil { + return "", err + } + err = bodyHTMLTmpl.Execute(ctx, &builder, b, BodyMaxLength) + if err != nil { + return "", err } + return builder.String(), nil +} - // TODO: Load the email template from elsewhere +// GetEmailBodyText returns the text body for the email based on the message payload +func (b *bodyData) GetEmailBodyText(ctx context.Context) (string, error) { + var builder strings.Builder + bText := bodyText - // Parse the template - tmpl, err := templates.Parse(bodyHTML) + bodyTextTmpl, err := util.NewSafeHTMLTemplate(&bText, "body-invite-text") + if err != nil { + return "", err + } + err = bodyTextTmpl.Execute(ctx, &builder, b, BodyMaxLength) if err != nil { - zerolog.Ctx(ctx).Error().Err(err).Msg("error parsing the HTML template for email invitations") - // Default to the text body - return getEmailBodyText(inviteURL, sponsor, project, role) + return "", err } - // Execute the template - var b strings.Builder - if err := tmpl.Execute(&b, data); err != nil { - return "" + return builder.String(), nil +} + +// GetEmailSubject returns the subject for the email based on the message payload +func (b *bodyData) GetEmailSubject() (string, error) { + err := isValidField(b.OrganizationName) + if err != nil { + return "", err } - return b.String() + return fmt.Sprintf("You have been invited to join the %s organization in Minder", b.OrganizationName), nil } -// getEmailBodyText returns the text body for the email based on the message payload -func getEmailBodyText(inviteURL, sponsor, project, role string) string { - return fmt.Sprintf("You have been invited to join %s as %s by %s. Visit %s to accept the invitation.", - project, role, sponsor, inviteURL) +// isValidField checks if the string is empty or contains HTML or JavaScript injection +// If we detect any HTML or JavaScript injection, we want to return an error rather than escaping the content +func isValidField(str string) error { + // Check string length + if len(str) > MaxFieldLength { + return fmt.Errorf("field value %s is more than %d characters", str, MaxFieldLength) + } + // Check for HTML content + escapedHTML := template.HTMLEscapeString(str) + if escapedHTML != str { + return fmt.Errorf("string %s contains HTML injection", str) + } + + // Check for JavaScript content separately + escapedJS := template.JSEscaper(str) + if escapedJS != str { + return fmt.Errorf("string %s contains JavaScript injection", str) + } + + return nil } -// getEmailSubject returns the subject for the email based on the message payload -func getEmailSubject(project string) string { - return fmt.Sprintf("You have been invited to join the %s organization in Minder", project) +// Validate validates the template data source for HTML injection attacks +func (b *bodyData) Validate() error { + v := reflect.ValueOf(b).Elem() + // Iterate over the fields of the struct + for i := 0; i < v.NumField(); i++ { + field := v.Field(i) + // Check if the field is settable and of kind and type string + if !field.CanSet() || field.Kind() != reflect.String || field.Type() != reflect.TypeOf("") { + return NewErrValidationFailed(v.Type().Field(i).Name, field.String()) + } + err := isValidField(field.String()) + if err != nil { + return NewErrValidationFailed(v.Type().Field(i).Name, field.String()) + } + } + return nil } diff --git a/internal/email/email_test.go b/internal/email/email_test.go new file mode 100644 index 0000000000..80bc8b0688 --- /dev/null +++ b/internal/email/email_test.go @@ -0,0 +1,159 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package email + +import ( + "fmt" + "strings" + "testing" +) + +func TestIsValidField(t *testing.T) { + t.Parallel() + + tests := []struct { + input string + expectedErrMsg string + }{ + // Test case 1: Valid plain text + {"Just plain text", ""}, + + // Test case 2: String with HTML tags + {"Bold Text", "string Bold Text contains HTML injection"}, + + // Test case 3: String with HTML entity + {"This is a test & example.", "string This is a test & example. contains HTML injection"}, + + // Test case 4: String with multiple HTML entities + {"This & that < should > work.", "string This & that < should > work. contains HTML injection"}, + + // Test case 5: Valid URL (no HTML or JavaScript injection) + {"https://example.com", ""}, + + // Test case 6: Mixed content with HTML and JS + {"Hello World onload=alert('test');", "string Hello World onload=alert('test'); contains HTML injection"}, + + // Test case 7: HTML-style comment + {"", "string contains HTML injection"}, + + // Test case 8: ensure allowed length is less than 200 characters + {strings.Repeat("a", MaxFieldLength+1), fmt.Sprintf("field value %s is more than %d characters", strings.Repeat("a", MaxFieldLength+1), MaxFieldLength)}, + } + + for _, tt := range tests { + tt := tt // capture range variable for parallel execution + t.Run(tt.input, func(t *testing.T) { + t.Parallel() + err := isValidField(tt.input) + if err != nil && err.Error() != tt.expectedErrMsg { + t.Errorf("isValidField(%q) got error message: %v, expected message: %v", tt.input, err.Error(), tt.expectedErrMsg) + } + }) + } +} + +func TestValidateDataSourceTemplate(t *testing.T) { + t.Parallel() + + tests := []struct { + input bodyData + expectedErrMsg string + }{ + // Test case 1: All fields are valid plain text + { + bodyData{ + AdminName: "John Doe", + OrganizationName: "Acme Corp", + InvitationURL: "https://invitation.com", + RecipientEmail: "john.doe@example.com", + MinderURL: "https://minder.com", + TermsURL: "https://terms.com", + PrivacyURL: "https://privacy.com", + SignInURL: "https://signin.com", + RoleName: "Administrator", + RoleVerb: "manage", + }, + "", + }, + + // Test case 2: AdminName contains HTML tags + { + bodyData{ + AdminName: "John Doe", + OrganizationName: "Acme Corp", + InvitationURL: "https://invitation.com", + RecipientEmail: "john.doe@example.com", + MinderURL: "https://minder.com", + TermsURL: "https://terms.com", + PrivacyURL: "https://privacy.com", + SignInURL: "https://signin.com", + RoleName: "Administrator", + RoleVerb: "manage", + }, + "validation failed: field AdminName failed validation John Doe", + }, + + // Test case 3: OrganizationName contains HTML content + { + bodyData{ + AdminName: "John Doe", + OrganizationName: "", + InvitationURL: "https://invitation.com", + RecipientEmail: "john.doe@example.com", + MinderURL: "https://minder.com", + TermsURL: "https://terms.com", + PrivacyURL: "https://privacy.com", + SignInURL: "https://signin.com", + RoleName: "Administrator", + RoleVerb: "manage", + }, + "validation failed: field OrganizationName failed validation ", + }, + + // Test case 4: AdminName contains JavaScript code + { + bodyData{ + AdminName: "onload=alert('test')", + OrganizationName: "Acme Corp", + InvitationURL: "https://invitation.com", + RecipientEmail: "john.doe@example.com", + MinderURL: "https://minder.com", + TermsURL: "https://terms.com", + PrivacyURL: "https://privacy.com", + SignInURL: "https://signin.com", + RoleName: "Administrator", + RoleVerb: "manage", + }, + "validation failed: field AdminName failed validation onload=alert('test')", + }, + + // Test case 5: All fields contain valid plain text with some URLs + { + bodyData{ + AdminName: "Plain Text User", + OrganizationName: "No HTML Corp", + InvitationURL: "https://example.com", + RecipientEmail: "user@example.com", + MinderURL: "https://example.com/minder", + TermsURL: "https://example.com/terms", + PrivacyURL: "https://example.com/privacy", + SignInURL: "https://example.com/signin", + RoleName: "User", + RoleVerb: "view", + }, + "", + }, + } + + for _, tt := range tests { + tt := tt // capture range variable for parallel execution + t.Run(tt.input.AdminName, func(t *testing.T) { + t.Parallel() + err := tt.input.Validate() + if err != nil && err.Error() != tt.expectedErrMsg { + t.Errorf("validateDataSourceTemplate(%+v) got error message: %v, expected message: %v", tt.input, err.Error(), tt.expectedErrMsg) + } + }) + } +} diff --git a/internal/email/template.go b/internal/email/template.go index 5b1f41ca75..5e5d4b84c4 100644 --- a/internal/email/template.go +++ b/internal/email/template.go @@ -3,8 +3,34 @@ package email +import "html/template" + +// validate that the templates compile +var ( + _ = template.Must(template.New("body-invite-text").Parse(bodyText)) + _ = template.Must(template.New("body-invite-html").Parse(bodyHTML)) +) + //nolint:lll const ( + // bodyText is the text body of the email + bodyText = ` +{{.AdminName}} has invited you to become {{.RoleName}} in the {{.OrganizationName}} organization in Minder by Stacklok. + +View Invitation: {{.InvitationURL}} + +Once you accept, you’ll be able to {{.RoleVerb}} the {{.OrganizationName}} organization in Minder by Stacklok. + +This invitation was sent to {{.RecipientEmail}}. If you were not expecting it, you can ignore this email. + +Minder by Stacklok is an open source platform that helps development teams and open source communities build more secure software, and prove to others that what they’ve built is secure. + +Terms and Conditions: {{.TermsURL}} Privacy: {{.PrivacyURL}} + +Sign in to Minder: {{.SignInURL}} + +Stacklok +` // bodyHTML is the HTML body of the email bodyHTML = `
math.MaxInt { + return nil, fmt.Errorf("pr number is too large") + } + result.Number = int(pr.Number) + + commentTmpl, err := util.NewSafeHTMLTemplate(&alert.reviewCfg.ReviewMessage, "message") + if err != nil { + return nil, fmt.Errorf("cannot parse review message template: %w", err) + } + + tmplParams := &PrCommentTemplateParams{ + EvalErrorDetails: enginerr.ErrorAsEvalDetails(params.GetEvalErr()), + } + + if params.GetEvalResult() != nil { + tmplParams.EvalResultOutput = params.GetEvalResult().Output + } + + comment, err := commentTmpl.Render(ctx, tmplParams, PrCommentMaxLength) + if err != nil { + return nil, fmt.Errorf("cannot execute title template: %w", err) + } + + result.Comment = comment + + // Unmarshal the existing alert metadata, if any + if metadata != nil { + meta := &alertMetadata{} + err := json.Unmarshal(*metadata, meta) + if err != nil { + // There's nothing saved apparently, so no need to fail here, but do log the error + logger.Debug().Msgf("error unmarshalling alert metadata: %v", err) + } else { + result.Metadata = meta + } + } + + return result, nil +} diff --git a/internal/engine/actions/alert/pull_request_comment/pull_request_comment_test.go b/internal/engine/actions/alert/pull_request_comment/pull_request_comment_test.go new file mode 100644 index 0000000000..f02dae1cc9 --- /dev/null +++ b/internal/engine/actions/alert/pull_request_comment/pull_request_comment_test.go @@ -0,0 +1,171 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package pull_request_comment + +import ( + "context" + "encoding/json" + "fmt" + "strconv" + "testing" + + "github.com/google/go-github/v63/github" + "github.com/stretchr/testify/require" + "go.uber.org/mock/gomock" + + "github.com/mindersec/minder/internal/db" + enginerr "github.com/mindersec/minder/internal/engine/errors" + engif "github.com/mindersec/minder/internal/engine/interfaces" + pbinternal "github.com/mindersec/minder/internal/proto" + mockghclient "github.com/mindersec/minder/internal/providers/github/mock" + pb "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + "github.com/mindersec/minder/pkg/engine/v1/interfaces" + "github.com/mindersec/minder/pkg/profiles/models" +) + +var TestActionTypeValid engif.ActionType = "alert-test" + +const ( + evaluationFailureDetails = "evaluation failure reason" + violationMsg = "violation message" +) + +func TestPullRequestCommentAlert(t *testing.T) { + t.Parallel() + + reviewID := int64(456) + reviewIDStr := strconv.FormatInt(reviewID, 10) + successfulRunMetadata := json.RawMessage(fmt.Sprintf(`{"review_id":"%s"}`, reviewIDStr)) + + tests := []struct { + name string + actionType engif.ActionType + cmd engif.ActionCmd + reviewMsg string + inputMetadata *json.RawMessage + mockSetup func(*mockghclient.MockGitHub) + expectedErr error + expectedMetadata json.RawMessage + }{ + { + name: "create a PR comment", + actionType: TestActionTypeValid, + reviewMsg: "This is a constant review message", + cmd: engif.ActionCmdOn, + mockSetup: func(mockGitHub *mockghclient.MockGitHub) { + mockGitHub.EXPECT(). + CreateReview(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()). + Return(&github.PullRequestReview{ID: &reviewID}, nil) + }, + expectedMetadata: json.RawMessage(fmt.Sprintf(`{"review_id":"%s"}`, reviewIDStr)), + }, + { + name: "create a PR comment with eval error details template", + actionType: TestActionTypeValid, + reviewMsg: "{{ .EvalErrorDetails }}", + cmd: engif.ActionCmdOn, + mockSetup: func(mockGitHub *mockghclient.MockGitHub) { + mockGitHub.EXPECT(). + CreateReview(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.AssignableToTypeOf(&github.PullRequestReviewRequest{})). + DoAndReturn(validateReviewBodyAndReturn(evaluationFailureDetails, reviewID)) + }, + expectedMetadata: json.RawMessage(fmt.Sprintf(`{"review_id":"%s"}`, reviewIDStr)), + }, + { + name: "create a PR comment with eval result output template", + actionType: TestActionTypeValid, + reviewMsg: "{{ .EvalResultOutput.ViolationMsg }}", + cmd: engif.ActionCmdOn, + mockSetup: func(mockGitHub *mockghclient.MockGitHub) { + mockGitHub.EXPECT(). + CreateReview(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.AssignableToTypeOf(&github.PullRequestReviewRequest{})). + DoAndReturn(validateReviewBodyAndReturn(violationMsg, reviewID)) + }, + expectedMetadata: json.RawMessage(fmt.Sprintf(`{"review_id":"%s"}`, reviewIDStr)), + }, + { + name: "error from provider creating PR comment", + actionType: TestActionTypeValid, + reviewMsg: "This is a constant review message", + cmd: engif.ActionCmdOn, + mockSetup: func(mockGitHub *mockghclient.MockGitHub) { + mockGitHub.EXPECT(). + CreateReview(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()). + Return(nil, fmt.Errorf("failed to create PR comment")) + }, + expectedErr: enginerr.ErrActionFailed, + }, + { + name: "dismiss PR comment", + actionType: TestActionTypeValid, + reviewMsg: "This is a constant review message", + cmd: engif.ActionCmdOff, + inputMetadata: &successfulRunMetadata, + mockSetup: func(mockGitHub *mockghclient.MockGitHub) { + mockGitHub.EXPECT(). + DismissReview(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()). + Return(&github.PullRequestReview{}, nil) + }, + expectedErr: enginerr.ErrActionTurnedOff, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + ctrl := gomock.NewController(t) + t.Cleanup(func() { + ctrl.Finish() + }) + + prCommentCfg := pb.RuleType_Definition_Alert_AlertTypePRComment{ + ReviewMessage: tt.reviewMsg, + } + + mockClient := mockghclient.NewMockGitHub(ctrl) + tt.mockSetup(mockClient) + + prCommentAlert, err := NewPullRequestCommentAlert( + tt.actionType, &prCommentCfg, mockClient, models.ActionOptOn) + require.NoError(t, err) + require.NotNil(t, prCommentAlert) + + evalParams := &engif.EvalStatusParams{ + EvalStatusFromDb: &db.ListRuleEvaluationsByProfileIdRow{}, + Profile: &models.ProfileAggregate{}, + Rule: &models.RuleInstance{}, + } + evalParams.SetEvalErr(enginerr.NewErrEvaluationFailed(evaluationFailureDetails)) + evalParams.SetEvalResult(&interfaces.EvaluationResult{ + Output: exampleOutput{ViolationMsg: violationMsg}, + }) + + retMeta, err := prCommentAlert.Do( + context.Background(), + tt.cmd, + &pbinternal.PullRequest{}, + evalParams, + tt.inputMetadata, + ) + require.ErrorIs(t, err, tt.expectedErr, "expected error") + require.Equal(t, tt.expectedMetadata, retMeta) + }) + } +} + +type exampleOutput struct { + ViolationMsg string +} + +func validateReviewBodyAndReturn(expectedBody string, reviewID int64) func(_ context.Context, _, _ string, _ int, review *github.PullRequestReviewRequest) (*github.PullRequestReview, error) { + return func(_ context.Context, _, _ string, _ int, review *github.PullRequestReviewRequest) (*github.PullRequestReview, error) { + if review.GetBody() != expectedBody { + return nil, fmt.Errorf("expected review body to be %s, got %s", expectedBody, review.GetBody()) + } + return &github.PullRequestReview{ID: &reviewID}, nil + } +} diff --git a/internal/engine/actions/alert/security_advisory/security_advisory.go b/internal/engine/actions/alert/security_advisory/security_advisory.go index 40d7cc7f7c..c705904b4b 100644 --- a/internal/engine/actions/alert/security_advisory/security_advisory.go +++ b/internal/engine/actions/alert/security_advisory/security_advisory.go @@ -10,6 +10,7 @@ import ( "encoding/json" "errors" "fmt" + pbinternal "github.com/mindersec/minder/internal/proto" htmltemplate "html/template" "strings" @@ -94,6 +95,7 @@ type Alert struct { summaryTmpl *htmltemplate.Template descriptionTmpl *htmltemplate.Template descriptionNoRemTmpl *htmltemplate.Template + setting models.ActionOpt } type paramsSA struct { @@ -129,6 +131,7 @@ func NewSecurityAdvisoryAlert( ruleType *pb.RuleType, saCfg *pb.RuleType_Definition_Alert_AlertTypeSA, cli provifv1.GitHub, + setting models.ActionOpt, ) (*Alert, error) { if actionType == "" { return nil, fmt.Errorf("action type cannot be empty") @@ -160,6 +163,7 @@ func NewSecurityAdvisoryAlert( summaryTmpl: sumT, descriptionTmpl: descT, descriptionNoRemTmpl: descNoRemT, + setting: setting, }, nil } @@ -174,15 +178,14 @@ func (_ *Alert) Type() string { } // GetOnOffState returns the alert action state read from the profile -func (_ *Alert) GetOnOffState(actionOpt models.ActionOpt) models.ActionOpt { - return models.ActionOptOrDefault(actionOpt, models.ActionOptOff) +func (alert *Alert) GetOnOffState() models.ActionOpt { + return models.ActionOptOrDefault(alert.setting, models.ActionOptOff) } // Do alerts through security advisory func (alert *Alert) Do( ctx context.Context, cmd interfaces.ActionCmd, - setting models.ActionOpt, entity protoreflect.ProtoMessage, params interfaces.ActionsParams, metadata *json.RawMessage, @@ -194,7 +197,7 @@ func (alert *Alert) Do( } // Process the command based on the action setting - switch setting { + switch alert.setting { case models.ActionOptOn: return alert.run(ctx, p, cmd) case models.ActionOptDryRun: @@ -310,7 +313,7 @@ func (alert *Alert) getParamsForSecurityAdvisory( case *pb.Repository: result.Owner = entity.GetOwner() result.Repo = entity.GetName() - case *pb.PullRequest: + case *pbinternal.PullRequest: result.Owner = entity.GetRepoOwner() result.Repo = entity.GetRepoName() case *pb.Artifact: diff --git a/internal/engine/actions/alert/security_advisory/security_advisory_test.go b/internal/engine/actions/alert/security_advisory/security_advisory_test.go index ae7c0a0d5e..02e41b92ab 100644 --- a/internal/engine/actions/alert/security_advisory/security_advisory_test.go +++ b/internal/engine/actions/alert/security_advisory/security_advisory_test.go @@ -18,6 +18,7 @@ import ( "github.com/mindersec/minder/internal/db" enginerr "github.com/mindersec/minder/internal/engine/errors" "github.com/mindersec/minder/internal/engine/interfaces" + pbinternal "github.com/mindersec/minder/internal/proto" mockghclient "github.com/mindersec/minder/internal/providers/github/mock" pb "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" "github.com/mindersec/minder/pkg/profiles/models" @@ -89,7 +90,8 @@ func TestSecurityAdvisoryAlert(t *testing.T) { mockClient := mockghclient.NewMockGitHub(ctrl) tt.mockSetup(mockClient) - saAlert, err := NewSecurityAdvisoryAlert(tt.actionType, &ruleType, &saCfg, mockClient) + saAlert, err := NewSecurityAdvisoryAlert( + tt.actionType, &ruleType, &saCfg, mockClient, models.ActionOptOn) require.NoError(t, err) require.NotNil(t, saAlert) @@ -102,8 +104,7 @@ func TestSecurityAdvisoryAlert(t *testing.T) { retMeta, err := saAlert.Do( context.Background(), interfaces.ActionCmdOn, - models.ActionOptOn, - &pb.PullRequest{}, + &pbinternal.PullRequest{}, evalParams, nil, ) diff --git a/internal/engine/actions/remediate/gh_branch_protect/gh_branch_protect.go b/internal/engine/actions/remediate/gh_branch_protect/gh_branch_protect.go index ca127c5a8c..060965a1cb 100644 --- a/internal/engine/actions/remediate/gh_branch_protect/gh_branch_protect.go +++ b/internal/engine/actions/remediate/gh_branch_protect/gh_branch_protect.go @@ -42,6 +42,7 @@ type GhBranchProtectRemediator struct { actionType interfaces.ActionType cli provifv1.GitHub patchTemplate *util.SafeTemplate + setting models.ActionOpt } // NewGhBranchProtectRemediator creates a new remediation engine that uses the GitHub API for branch protection @@ -49,6 +50,7 @@ func NewGhBranchProtectRemediator( actionType interfaces.ActionType, ghp *pb.RuleType_Definition_Remediate_GhBranchProtectionType, cli provifv1.GitHub, + setting models.ActionOpt, ) (*GhBranchProtectRemediator, error) { if actionType == "" { return nil, fmt.Errorf("action type cannot be empty") @@ -63,6 +65,7 @@ func NewGhBranchProtectRemediator( actionType: actionType, cli: cli, patchTemplate: patchTemplate, + setting: setting, }, nil } @@ -87,15 +90,14 @@ func (_ *GhBranchProtectRemediator) Type() string { } // GetOnOffState returns the alert action state read from the profile -func (_ *GhBranchProtectRemediator) GetOnOffState(actionOpt models.ActionOpt) models.ActionOpt { - return models.ActionOptOrDefault(actionOpt, models.ActionOptOff) +func (r *GhBranchProtectRemediator) GetOnOffState() models.ActionOpt { + return models.ActionOptOrDefault(r.setting, models.ActionOptOff) } // Do perform the remediation func (r *GhBranchProtectRemediator) Do( ctx context.Context, cmd interfaces.ActionCmd, - remAction models.ActionOpt, ent protoreflect.ProtoMessage, params interfaces.ActionsParams, _ *json.RawMessage, @@ -118,20 +120,20 @@ func (r *GhBranchProtectRemediator) Do( } branch, err := util.JQReadFrom[string](ctx, ".branch", params.GetRule().Params) - if err != nil { + if err != nil && !errors.Is(err, util.ErrNoValueFound) { return nil, fmt.Errorf("error reading branch from params: %w", err) } + // This sets the branch to the default one of the repository + // in case no branch is configured via rule parameters. + if branch == "" { + branch = repo.DefaultBranch + } // This check avoids passing around an empty branch name which // causes issues down the road. Besides, it does not make // sense to protect what does not exist. (cit. Ozz 2024-05-27) - if branch == "" && repo.DefaultBranch == "" { - return nil, fmt.Errorf("both rule param and default branch names are empty: %w", engerrors.ErrActionSkipped) - } - // This sets the branch to the default one of the repository - // in case no branch is configured via rule parameters. if branch == "" { - branch = repo.DefaultBranch + return nil, fmt.Errorf("both rule param branch name and repo default branch are empty: %w", engerrors.ErrActionSkipped) } // get the current protection @@ -161,7 +163,7 @@ func (r *GhBranchProtectRemediator) Do( return nil, fmt.Errorf("error patching request: %w", err) } - switch remAction { + switch r.setting { case models.ActionOptOn: err = r.cli.UpdateBranchProtection(ctx, repo.Owner, repo.Name, branch, updatedRequest) case models.ActionOptDryRun: diff --git a/internal/engine/actions/remediate/gh_branch_protect/gh_branch_protect_test.go b/internal/engine/actions/remediate/gh_branch_protect/gh_branch_protect_test.go index 47e50b1ca8..68ceff89a2 100644 --- a/internal/engine/actions/remediate/gh_branch_protect/gh_branch_protect_test.go +++ b/internal/engine/actions/remediate/gh_branch_protect/gh_branch_protect_test.go @@ -207,6 +207,43 @@ func TestBranchProtectionRemediate(t *testing.T) { Return(nil) }, }, + { + name: "No branch parameter required", + newRemArgs: &newBranchProtectionRemediateArgs{ + ghp: &pb.RuleType_Definition_Remediate_GhBranchProtectionType{ + Patch: reviewCountPatch, + }, + actionType: TestActionTypeValid, + }, + remArgs: &remediateArgs{ + remAction: models.ActionOptOn, + ent: &pb.Repository{ + Owner: repoOwner, + Name: repoName, + DefaultBranch: "main", + }, + pol: map[string]any{ + "required_approving_review_count": 2, + }, + }, + mockSetup: func(mockGitHub *mock_ghclient.MockGitHub) { + mockGitHub.EXPECT(). + GetBranchProtection(gomock.Any(), repoOwner, repoName, "main"). + Return(nil, github.ErrBranchNotProtected) + mockGitHub.EXPECT(). + UpdateBranchProtection(gomock.Any(), repoOwner, repoName, "main", + // nested pointers to structs confuse gmock + eqProtectionRequest( + &github.ProtectionRequest{ + RequiredPullRequestReviews: &github.PullRequestReviewsEnforcementRequest{ + RequiredApprovingReviewCount: 2, + }, + }, + ), + ). + Return(nil) + }, + }, { name: "Some protection was in place, remediator merges the patch", newRemArgs: &newBranchProtectionRemediateArgs{ @@ -284,7 +321,8 @@ func TestBranchProtectionRemediate(t *testing.T) { prov, err := testGithubProvider(ghApiUrl) require.NoError(t, err) - engine, err := NewGhBranchProtectRemediator(tt.newRemArgs.actionType, tt.newRemArgs.ghp, prov) + engine, err := NewGhBranchProtectRemediator( + tt.newRemArgs.actionType, tt.newRemArgs.ghp, prov, tt.remArgs.remAction) if tt.wantInitErr { require.Error(t, err, "expected error") return @@ -306,7 +344,7 @@ func TestBranchProtectionRemediate(t *testing.T) { }, } - retMeta, err := engine.Do(context.Background(), interfaces.ActionCmdOn, tt.remArgs.remAction, tt.remArgs.ent, evalParams, nil) + retMeta, err := engine.Do(context.Background(), interfaces.ActionCmdOn, tt.remArgs.ent, evalParams, nil) if tt.wantErr { require.Error(t, err, "expected error") require.Nil(t, retMeta, "expected nil metadata") diff --git a/internal/engine/actions/remediate/noop/noop.go b/internal/engine/actions/remediate/noop/noop.go index 7d7f413a0e..3ea6f7a765 100644 --- a/internal/engine/actions/remediate/noop/noop.go +++ b/internal/engine/actions/remediate/noop/noop.go @@ -38,7 +38,7 @@ func (_ *Remediator) Type() string { } // GetOnOffState returns the off state of the noop engine -func (_ *Remediator) GetOnOffState(_ models.ActionOpt) models.ActionOpt { +func (_ *Remediator) GetOnOffState() models.ActionOpt { return models.ActionOptOff } @@ -46,7 +46,6 @@ func (_ *Remediator) GetOnOffState(_ models.ActionOpt) models.ActionOpt { func (r *Remediator) Do( _ context.Context, _ interfaces.ActionCmd, - _ models.ActionOpt, _ protoreflect.ProtoMessage, _ interfaces.ActionsParams, _ *json.RawMessage, diff --git a/internal/engine/actions/remediate/pull_request/pull_request.go b/internal/engine/actions/remediate/pull_request/pull_request.go index fd72ed006c..944d9f65ba 100644 --- a/internal/engine/actions/remediate/pull_request/pull_request.go +++ b/internal/engine/actions/remediate/pull_request/pull_request.go @@ -66,6 +66,7 @@ type pullRequestMetadata struct { type Remediator struct { ghCli provifv1.GitHub actionType interfaces.ActionType + setting models.ActionOpt prCfg *pb.RuleType_Definition_Remediate_PullRequestRemediation modificationRegistry modificationRegistry @@ -89,6 +90,7 @@ func NewPullRequestRemediate( actionType interfaces.ActionType, prCfg *pb.RuleType_Definition_Remediate_PullRequestRemediation, ghCli provifv1.GitHub, + setting models.ActionOpt, ) (*Remediator, error) { err := prCfg.Validate() if err != nil { @@ -113,6 +115,7 @@ func NewPullRequestRemediate( prCfg: prCfg, actionType: actionType, modificationRegistry: modRegistry, + setting: setting, titleTemplate: titleTmpl, bodyTemplate: bodyTmpl, @@ -140,15 +143,14 @@ func (_ *Remediator) Type() string { } // GetOnOffState returns the alert action state read from the profile -func (_ *Remediator) GetOnOffState(actionOpt models.ActionOpt) models.ActionOpt { - return models.ActionOptOrDefault(actionOpt, models.ActionOptOff) +func (r *Remediator) GetOnOffState() models.ActionOpt { + return models.ActionOptOrDefault(r.setting, models.ActionOptOff) } // Do perform the remediation func (r *Remediator) Do( ctx context.Context, cmd interfaces.ActionCmd, - setting models.ActionOpt, ent protoreflect.ProtoMessage, params interfaces.ActionsParams, metadata *json.RawMessage, @@ -158,7 +160,7 @@ func (r *Remediator) Do( return nil, fmt.Errorf("cannot get PR remediation params: %w", err) } var remErr error - switch setting { + switch r.setting { case models.ActionOptOn: return r.run(ctx, cmd, p) case models.ActionOptDryRun: diff --git a/internal/engine/actions/remediate/pull_request/pull_request_test.go b/internal/engine/actions/remediate/pull_request/pull_request_test.go index 19c65a80d4..5664c7cdaf 100644 --- a/internal/engine/actions/remediate/pull_request/pull_request_test.go +++ b/internal/engine/actions/remediate/pull_request/pull_request_test.go @@ -57,6 +57,9 @@ const ( frizbeePrBody = `This PR replaces tags with sha` frizbeePrBodyWithExcludes = `This PR replaces tags with sha` + yqCommitTitle = "Replace dangerous PR events" + yqPrBody = `This PR replaces dangerous PR events` + actionWithTags = ` on: workflow_call: @@ -132,6 +135,14 @@ func frizbeePrRemWithExcludes(e []string) *pb.RuleType_Definition_Remediate_Pull } } +func yqPrRem() *pb.RuleType_Definition_Remediate_PullRequestRemediation { + return &pb.RuleType_Definition_Remediate_PullRequestRemediation{ + Method: "minder.yq.evaluate", + Title: yqCommitTitle, + Body: yqPrBody, + } +} + type remediateArgs struct { remAction models.ActionOpt ent protoreflect.ProtoMessage @@ -569,6 +580,30 @@ func TestPullRequestRemediate(t *testing.T) { expectedErr: errors.ErrActionPending, expectedMetadata: json.RawMessage(`{"pr_number":44}`), }, + { + name: "replace PR events with YQ", + newRemArgs: &newPullRequestRemediateArgs{ + prRem: yqPrRem(), + actionType: TestActionTypeValid, + }, + repoSetup: defaultMockRepoSetup, + mockSetup: func(t *testing.T, mockGitHub *mockghclient.MockGitHub) { + t.Helper() + + happyPathMockSetup(mockGitHub) + + mockGitHub.EXPECT(). + CreatePullRequest( + gomock.Any(), + repoOwner, repoName, + yqCommitTitle, yqPrBody, + refFromBranch(branchBaseName(yqCommitTitle)), dflBranchTo). + Return(&github.PullRequest{Number: github.Int(45)}, nil) + }, + remArgs: createTestRemArgs(), + expectedErr: errors.ErrActionPending, + expectedMetadata: json.RawMessage(`{"pr_number":45}`), + }, } for _, tt := range tests { @@ -586,7 +621,8 @@ func TestPullRequestRemediate(t *testing.T) { provider, err := testGithubProvider() require.NoError(t, err) - engine, err := NewPullRequestRemediate(tt.newRemArgs.actionType, tt.newRemArgs.prRem, provider) + engine, err := NewPullRequestRemediate( + tt.newRemArgs.actionType, tt.newRemArgs.prRem, provider, tt.remArgs.remAction) if tt.wantInitErr { require.Error(t, err, "expected error") return @@ -620,7 +656,6 @@ func TestPullRequestRemediate(t *testing.T) { }) retMeta, err := engine.Do(context.Background(), interfaces.ActionCmdOn, - tt.remArgs.remAction, tt.remArgs.ent, evalParams, nil) diff --git a/internal/engine/actions/remediate/pull_request/types_content.go b/internal/engine/actions/remediate/pull_request/types_content.go index 8c4d9ea4ea..ba2bb4dd10 100644 --- a/internal/engine/actions/remediate/pull_request/types_content.go +++ b/internal/engine/actions/remediate/pull_request/types_content.go @@ -20,9 +20,14 @@ const ( minderContentModification = "minder.content" // minderFrizbeeTagResolve replaces a github action tag with the appropriate checksum minderFrizbeeTagResolve = "minder.actions.replace_tags_with_sha" + // minderYQEvaluate evaluates a yq expression + minderYQEvaluate = "minder.yq.evaluate" // ContentBytesLimit is the maximum number of bytes for the content ContentBytesLimit = 5120 + + // PathBytesLimit is the maximum number of bytes for the path + PathBytesLimit = 200 ) var _ fsModifier = (*contentModification)(nil) @@ -77,15 +82,20 @@ func prConfigToEntries(prCfg *pb.RuleType_Definition_Remediate_PullRequestRemedi return nil, fmt.Errorf("cannot parse content template (index %d): %w", i, err) } + pathTemplate, err := util.NewSafeTextTemplate(&cnt.Path, fmt.Sprintf("Path[%d]", i)) + if err != nil { + return nil, fmt.Errorf("cannot parse path template (index %d): %w", i, err) + } + mode := ghModeNonExecFile if cnt.GetMode() != "" { mode = *cnt.Mode } entries[i] = &fsEntry{ - Path: cnt.Path, Mode: mode, contentTemplate: contentTemplate, + pathTemplate: pathTemplate, } } @@ -102,11 +112,18 @@ func (ca *contentModification) createFsModEntries( } for i, entry := range ca.entries { content := new(bytes.Buffer) + path := new(bytes.Buffer) if err := entry.contentTemplate.Execute(ctx, content, data, ContentBytesLimit); err != nil { return fmt.Errorf("cannot execute content template (index %d): %w", i, err) } + + if err := entry.pathTemplate.Execute(ctx, path, data, PathBytesLimit); err != nil { + return fmt.Errorf("cannot execute path template (index %d): %w", i, err) + } + entry.Content = content.String() + entry.Path = path.String() } return nil diff --git a/internal/engine/actions/remediate/pull_request/types_registry.go b/internal/engine/actions/remediate/pull_request/types_registry.go index 7a99de6d63..d4b5514344 100644 --- a/internal/engine/actions/remediate/pull_request/types_registry.go +++ b/internal/engine/actions/remediate/pull_request/types_registry.go @@ -44,6 +44,7 @@ func (mr modificationRegistry) register(name string, constructor modificationCon func (mr modificationRegistry) registerBuiltIn() { mr.register(minderContentModification, newContentModification) mr.register(minderFrizbeeTagResolve, newFrizbeeTagResolveModification) + mr.register(minderYQEvaluate, newYqExecute) } func (mr modificationRegistry) getModification( diff --git a/internal/engine/actions/remediate/pull_request/types_yq.go b/internal/engine/actions/remediate/pull_request/types_yq.go new file mode 100644 index 0000000000..dec6664a7d --- /dev/null +++ b/internal/engine/actions/remediate/pull_request/types_yq.go @@ -0,0 +1,150 @@ +// SPDX-FileCopyrightText: Copyright 2023 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package pull_request + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + + "github.com/go-git/go-billy/v5/util" + "github.com/go-git/go-git/v5/plumbing/filemode" + "github.com/mikefarah/yq/v4/pkg/yqlib" + "github.com/rs/zerolog" + gologging "gopkg.in/op/go-logging.v1" + + "github.com/mindersec/minder/internal/engine/interfaces" +) + +// unfortunately yqlib does seem to be using global variables... +func init() { + // setting the log level to critical pretty much silences the logging + gologging.SetLevel(gologging.CRITICAL, yqLibModule) + yqlib.InitExpressionParser() +} + +type patternType string + +const ( + patternTypeGlob patternType = "glob" +) + +const ( + yqLibModule = "yq-lib" +) + +var _ fsModifier = (*yqExecute)(nil) + +type yqExecuteConfig struct { + Expression string `json:"expression"` + Patterns []struct { + Pattern string `json:"pattern"` + Type string `json:"type"` + } +} + +type yqExecute struct { + fsChangeSet + + config yqExecuteConfig +} + +var _ modificationConstructor = newYqExecute + +func newYqExecute( + params *modificationConstructorParams, +) (fsModifier, error) { + + confMap := make(map[string]any) + if params.prCfg.GetParams() != nil { + confMap = params.prCfg.Params.AsMap() + } + + rawConfig, err := json.Marshal(confMap) + if err != nil { + return nil, fmt.Errorf("cannot marshal config") + } + + var conf yqExecuteConfig + err = json.Unmarshal(rawConfig, &conf) + if err != nil { + return nil, fmt.Errorf("cannot marshal config") + } + + return &yqExecute{ + fsChangeSet: fsChangeSet{ + fs: params.bfs, + }, + + config: conf, + }, nil +} + +func (yq *yqExecute) createFsModEntries(ctx context.Context, _ interfaces.ActionsParams) error { + matchingFiles := make([]string, 0) + for _, pattern := range yq.config.Patterns { + if pattern.Type != string(patternTypeGlob) { + zerolog.Ctx(ctx). + Warn(). + Str("pattern.Type", pattern.Type). + Msg("unsupported pattern type") + continue + } + + patternMatches, err := util.Glob(yq.fs, pattern.Pattern) + if err != nil { + return fmt.Errorf("cannot get matching files: %w", err) + } + matchingFiles = append(matchingFiles, patternMatches...) + } + + for _, file := range matchingFiles { + newContent, err := yq.executeYq(file, yq.config.Expression) + if err != nil { + return fmt.Errorf("cannot execute yq: %w", err) + } + yq.entries = append(yq.entries, &fsEntry{ + Path: file, + Content: newContent, + Mode: filemode.Regular.String(), + }) + } + + return nil +} + +func (yq *yqExecute) modifyFs() ([]*fsEntry, error) { + err := yq.fsChangeSet.writeEntries() + if err != nil { + return nil, fmt.Errorf("cannot write entries: %w", err) + } + return yq.entries, nil +} + +func (yq *yqExecute) executeYq(filename, expression string) (string, error) { + file, err := yq.fs.Open(filename) + if err != nil { + return "", fmt.Errorf("cannot read file: %w", err) + } + + out := new(bytes.Buffer) + encoder := yqlib.NewYamlEncoder(yqlib.NewDefaultYamlPreferences()) + printer := yqlib.NewPrinter(encoder, yqlib.NewSinglePrinterWriter(out)) + + expParser := yqlib.ExpressionParser + expressionNode, err := expParser.ParseExpression(expression) + if err != nil { + return "", fmt.Errorf("cannot parse expression: %w", err) + } + + decoder := yqlib.NewYamlDecoder(yqlib.NewDefaultYamlPreferences()) + parser := yqlib.NewStreamEvaluator() + _, err = parser.Evaluate(filename, file, expressionNode, printer, decoder) + if err != nil { + return "", fmt.Errorf("cannot evaluate expression: %w", err) + } + + return out.String(), nil +} diff --git a/internal/engine/actions/remediate/pull_request/types_yq_test.go b/internal/engine/actions/remediate/pull_request/types_yq_test.go new file mode 100644 index 0000000000..49504a2cd9 --- /dev/null +++ b/internal/engine/actions/remediate/pull_request/types_yq_test.go @@ -0,0 +1,360 @@ +// SPDX-FileCopyrightText: Copyright 2023 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package pull_request + +import ( + "context" + "fmt" + "path/filepath" + "testing" + + "github.com/go-git/go-billy/v5" + "github.com/go-git/go-billy/v5/memfs" + "github.com/stretchr/testify/require" + "golang.org/x/exp/maps" + "google.golang.org/protobuf/types/known/structpb" + + minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" +) + +const ( + workflowWithPullRequestTargetObject = `on: + pull_request_target: + branches: + - main + push: + branches: + - main +` + workflowWithPullRequestTargetSeq = `on: + - pull_request_target + - push +` + workflowWithPullRequestTargetDirect = `on: + pull_request_target +` + + workflowNoPullRequestTargetObject = `on: + push: + branches: + - main +` + + workflowNoPullRequestTargetSeq = `on: + - push +` + + workflowNoPullRequestTargetDirect = `on: push +` + + workflowDispatch = `on: workflow_dispatch +` + workflowPullRequestTargetObjectFileName = ".github/workflows/prt_object.yaml" + workflowPullRequestTargetSeqFileName = ".github/workflows/prt_seq.yaml" + workflowPullRequestTargetDirectFileName = ".github/workflows/prt_direct.yaml" + workflowNoPullRequestTargetObjectFileName = ".github/workflows/nprt_object.yaml" + workflowNoPullRequestTargetSeqFileName = ".github/workflows/nprt_seq.yaml" + workflowNoPullRequestTargetDirectFileName = ".github/workflows/nprt_direct.yaml" + + readmeOutsideContent = "readme outside workflows" + nonMatchingFileNameOutsideTree = "README.md" + readmeInsideContent = "readme inside workflows" + nonMatchingFileNameInsideTree = ".github/workflows/README.txt" +) + +type testFileContents struct { + origContents string + modifiedContents string +} + +type testFileMap map[string]testFileContents + +type fsConstructorOpt func(*testing.T, billy.Filesystem) + +func newTestFS(t *testing.T, opts ...fsConstructorOpt) billy.Filesystem { + t.Helper() + fs := memfs.New() + for _, opt := range opts { + opt(t, fs) + } + return fs +} + +func withFile(path, contents string) fsConstructorOpt { + return func(t *testing.T, fs billy.Filesystem) { + t.Helper() + dir := filepath.Dir(path) + if dir != "." { + err := fs.MkdirAll(dir, 0755) + if err != nil { + t.Fatalf("failed to create directory %s: %v", dir, err) + } + } + + f, err := fs.Create(path) + if err != nil { + t.Fatalf("failed to create file %s: %v", path, err) + } + defer f.Close() + + _, err = f.Write([]byte(contents)) + if err != nil { + t.Fatalf("failed to write to file %s: %v", path, err) + } + } +} + +type modificationConstructorOpt func(*modificationConstructorParams) + +func newModificationParams(opts ...modificationConstructorOpt) *modificationConstructorParams { + params := &modificationConstructorParams{} + for _, opt := range opts { + opt(params) + } + return params +} + +func withParams(m map[string]any) modificationConstructorOpt { + return func(p *modificationConstructorParams) { + s, err := structpb.NewStruct(m) + if err != nil { + panic(fmt.Sprintf("failed to create struct from map: %v", err)) + } + p.prCfg = &minderv1.RuleType_Definition_Remediate_PullRequestRemediation{ + Params: s, + } + } +} + +func TestYQExecute(t *testing.T) { + t.Parallel() + + scenarios := []struct { + name string + yqParams func(*testing.T) *modificationConstructorParams + testFiles map[string]testFileContents + fs func(*testing.T, testFileMap) billy.Filesystem + checkEntries func(*testing.T, testFileMap, []*fsEntry) + createErr string + }{ + { + name: "TestYQExecute", + yqParams: func(t *testing.T) *modificationConstructorParams { + t.Helper() + + return newModificationParams(withParams(map[string]any{ + "expression": ` +.on |= ( + select(type == "!!map") | with_entries(select(.key != "pull_request_target")) +) | +.on |= ( + select(type == "!!seq") | map(select(. != "pull_request_target")) +) | +(.on | select(. == "pull_request_target")) = "workflow_dispatch" | +(.on |= (select(length > 0) // "workflow_dispatch")) +`, + "patterns": []any{ + map[string]any{ + "pattern": ".github/workflows/*.yml", + "type": "glob", + }, + map[string]any{ + "pattern": ".github/workflows/*.yaml", + "type": "glob", + }, + }, + })) + }, + testFiles: testFileMap{ + workflowPullRequestTargetObjectFileName: { + origContents: workflowWithPullRequestTargetObject, + modifiedContents: workflowNoPullRequestTargetObject, + }, + workflowPullRequestTargetSeqFileName: { + origContents: workflowWithPullRequestTargetSeq, + modifiedContents: workflowNoPullRequestTargetSeq, + }, + workflowPullRequestTargetDirectFileName: { + origContents: workflowWithPullRequestTargetDirect, + modifiedContents: workflowDispatch, + }, + workflowNoPullRequestTargetObjectFileName: { + origContents: workflowNoPullRequestTargetObject, + modifiedContents: workflowNoPullRequestTargetObject, + }, + workflowNoPullRequestTargetSeqFileName: { + origContents: workflowNoPullRequestTargetSeq, + modifiedContents: workflowNoPullRequestTargetSeq, + }, + workflowNoPullRequestTargetDirectFileName: { + origContents: workflowNoPullRequestTargetDirect, + modifiedContents: workflowNoPullRequestTargetDirect, + }, + nonMatchingFileNameInsideTree: { + origContents: readmeInsideContent, + modifiedContents: readmeInsideContent, + }, + nonMatchingFileNameOutsideTree: { + origContents: readmeOutsideContent, + modifiedContents: readmeOutsideContent, + }, + }, + fs: func(t *testing.T, testFiles testFileMap) billy.Filesystem { + t.Helper() + opts := make([]fsConstructorOpt, 0, len(testFiles)) + for path, contents := range testFiles { + opts = append(opts, withFile(path, contents.origContents)) + } + return newTestFS(t, opts...) + }, + checkEntries: func(t *testing.T, testFiles testFileMap, entries []*fsEntry) { + t.Helper() + + // two non-matching files + require.Len(t, entries, len(testFiles)-2) + testFilesCopy := maps.Clone(testFiles) + for _, entry := range entries { + if entry.Path == nonMatchingFileNameOutsideTree || entry.Path == nonMatchingFileNameInsideTree { + t.Errorf("matched file %s that shouldn't be matched", entry.Path) + } + file, ok := testFilesCopy[entry.Path] + require.True(t, ok) + delete(testFilesCopy, entry.Path) // remove the entry from the map to make sure we catch duplicates + if file.modifiedContents != "" { + require.Equal(t, file.modifiedContents, entry.Content) + } + } + }, + }, + { + // this won't do anything but won't crash + name: "No config", + yqParams: func(t *testing.T) *modificationConstructorParams { + t.Helper() + return newModificationParams() + }, + testFiles: testFileMap{}, + fs: func(t *testing.T, _ testFileMap) billy.Filesystem { + t.Helper() + return newTestFS(t) + }, + checkEntries: func(t *testing.T, _ testFileMap, entries []*fsEntry) { + t.Helper() + require.Len(t, entries, 0) + }, + }, + { + name: "No matching files", + yqParams: func(t *testing.T) *modificationConstructorParams { + t.Helper() + + return newModificationParams(withParams(map[string]any{ + "expression": ` +(.on |= (select(length > 0) // "workflow_dispatch")) +`, + "patterns": []any{ + map[string]any{ + "pattern": ".github/workflows/*.yml", + "type": "glob", + }, + map[string]any{ + "pattern": ".github/workflows/*.yaml", + "type": "glob", + }, + }, + })) + }, + testFiles: testFileMap{ + nonMatchingFileNameInsideTree: { + origContents: readmeInsideContent, + modifiedContents: readmeInsideContent, + }, + nonMatchingFileNameOutsideTree: { + origContents: readmeOutsideContent, + modifiedContents: readmeOutsideContent, + }, + }, + fs: func(t *testing.T, testFiles testFileMap) billy.Filesystem { + t.Helper() + opts := make([]fsConstructorOpt, 0, len(testFiles)) + for path, contents := range testFiles { + opts = append(opts, withFile(path, contents.origContents)) + } + return newTestFS(t, opts...) + }, + checkEntries: func(t *testing.T, _ testFileMap, entries []*fsEntry) { + t.Helper() + require.Len(t, entries, 0) + }, + }, + { + name: "Bad expression", + yqParams: func(t *testing.T) *modificationConstructorParams { + t.Helper() + + return newModificationParams(withParams(map[string]any{ + "expression": ` +(.on |= if oops then spoo) +`, + "patterns": []any{ + map[string]any{ + "pattern": ".github/workflows/*.yml", + "type": "glob", + }, + map[string]any{ + "pattern": ".github/workflows/*.yaml", + "type": "glob", + }, + }, + })) + }, + testFiles: testFileMap{ + workflowPullRequestTargetObjectFileName: { + origContents: workflowWithPullRequestTargetObject, + modifiedContents: workflowNoPullRequestTargetObject, + }, + }, + fs: func(t *testing.T, testFiles testFileMap) billy.Filesystem { + t.Helper() + opts := make([]fsConstructorOpt, 0, len(testFiles)) + for path, contents := range testFiles { + opts = append(opts, withFile(path, contents.origContents)) + } + return newTestFS(t, opts...) + }, + checkEntries: func(t *testing.T, _ testFileMap, entries []*fsEntry) { + t.Helper() + require.Len(t, entries, 0) + }, + createErr: "cannot execute yq: cannot parse expression", + }, + } + + for _, scenario := range scenarios { + t.Run(scenario.name, func(t *testing.T) { + t.Parallel() + + params := scenario.yqParams(t) + fs := scenario.fs(t, scenario.testFiles) + params.bfs = fs + + yqe, err := newYqExecute(params) + require.NoError(t, err) + require.NotNil(t, yqe) + + err = yqe.createFsModEntries(context.Background(), nil) + if scenario.createErr != "" { + require.Error(t, err) + require.Contains(t, err.Error(), scenario.createErr) + } else { + require.NoError(t, err) + } + + entries, err := yqe.modifyFs() + require.NoError(t, err) + scenario.checkEntries(t, scenario.testFiles, entries) + + }) + } +} diff --git a/internal/engine/actions/remediate/pull_request/write_helpers.go b/internal/engine/actions/remediate/pull_request/write_helpers.go index 6710b4e56d..92db23a2c6 100644 --- a/internal/engine/actions/remediate/pull_request/write_helpers.go +++ b/internal/engine/actions/remediate/pull_request/write_helpers.go @@ -20,6 +20,7 @@ import ( type fsEntry struct { contentTemplate *util.SafeTemplate + pathTemplate *util.SafeTemplate Path string `json:"path"` Content string `json:"content"` diff --git a/internal/engine/actions/remediate/remediate.go b/internal/engine/actions/remediate/remediate.go index 3367ab59ec..705e426549 100644 --- a/internal/engine/actions/remediate/remediate.go +++ b/internal/engine/actions/remediate/remediate.go @@ -15,6 +15,7 @@ import ( "github.com/mindersec/minder/internal/engine/actions/remediate/rest" engif "github.com/mindersec/minder/internal/engine/interfaces" pb "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + "github.com/mindersec/minder/pkg/profiles/models" provinfv1 "github.com/mindersec/minder/pkg/providers/v1" ) @@ -25,6 +26,7 @@ const ActionType engif.ActionType = "remediate" func NewRuleRemediator( rt *pb.RuleType, provider provinfv1.Provider, + setting models.ActionOpt, ) (engif.Action, error) { remediate := rt.Def.GetRemediate() if remediate == nil { @@ -41,7 +43,7 @@ func NewRuleRemediator( if remediate.GetRest() == nil { return nil, fmt.Errorf("remediations engine missing rest configuration") } - return rest.NewRestRemediate(ActionType, remediate.GetRest(), client) + return rest.NewRestRemediate(ActionType, remediate.GetRest(), client, setting) case gh_branch_protect.RemediateType: client, err := provinfv1.As[provinfv1.GitHub](provider) @@ -51,7 +53,8 @@ func NewRuleRemediator( if remediate.GetGhBranchProtection() == nil { return nil, fmt.Errorf("remediations engine missing gh_branch_protection configuration") } - return gh_branch_protect.NewGhBranchProtectRemediator(ActionType, remediate.GetGhBranchProtection(), client) + return gh_branch_protect.NewGhBranchProtectRemediator( + ActionType, remediate.GetGhBranchProtection(), client, setting) case pull_request.RemediateType: client, err := provinfv1.As[provinfv1.GitHub](provider) @@ -62,7 +65,8 @@ func NewRuleRemediator( return nil, fmt.Errorf("remediations engine missing pull request configuration") } - return pull_request.NewPullRequestRemediate(ActionType, remediate.GetPullRequest(), client) + return pull_request.NewPullRequestRemediate( + ActionType, remediate.GetPullRequest(), client, setting) } return nil, fmt.Errorf("unknown remediation type: %s", remediate.GetType()) diff --git a/internal/engine/actions/remediate/remediate_test.go b/internal/engine/actions/remediate/remediate_test.go index 0c5b448e9a..184799895d 100644 --- a/internal/engine/actions/remediate/remediate_test.go +++ b/internal/engine/actions/remediate/remediate_test.go @@ -19,6 +19,7 @@ import ( "github.com/mindersec/minder/internal/providers/telemetry" "github.com/mindersec/minder/internal/providers/testproviders" pb "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + "github.com/mindersec/minder/pkg/profiles/models" provifv1 "github.com/mindersec/minder/pkg/providers/v1" ) @@ -117,7 +118,8 @@ func TestNewRuleRemediator(t *testing.T) { provider, err = tt.provider() require.NoError(t, err) } - result, err := remediate.NewRuleRemediator(tt.ruleType, provider) + result, err := remediate.NewRuleRemediator( + tt.ruleType, provider, models.ActionOptOn) if tt.wantError { require.Error(t, err) return diff --git a/internal/engine/actions/remediate/rest/rest.go b/internal/engine/actions/remediate/rest/rest.go index 1c13a32c9d..f2d131482f 100644 --- a/internal/engine/actions/remediate/rest/rest.go +++ b/internal/engine/actions/remediate/rest/rest.go @@ -43,10 +43,15 @@ type Remediator struct { cli provifv1.REST endpointTemplate *util.SafeTemplate bodyTemplate *util.SafeTemplate + // Setting defines the current action setting. e.g. dry-run, on, off + setting models.ActionOpt } // NewRestRemediate creates a new REST rule data ingest engine -func NewRestRemediate(actionType interfaces.ActionType, restCfg *pb.RestType, cli provifv1.REST) (*Remediator, error) { +func NewRestRemediate( + actionType interfaces.ActionType, restCfg *pb.RestType, cli provifv1.REST, + setting models.ActionOpt, +) (*Remediator, error) { if actionType == "" { return nil, fmt.Errorf("action type cannot be empty") } @@ -72,6 +77,7 @@ func NewRestRemediate(actionType interfaces.ActionType, restCfg *pb.RestType, cl method: method, endpointTemplate: endpointTmpl, bodyTemplate: bodyTmpl, + setting: setting, }, nil } @@ -96,15 +102,14 @@ func (_ *Remediator) Type() string { } // GetOnOffState returns the alert action state read from the profile -func (_ *Remediator) GetOnOffState(actionOpt models.ActionOpt) models.ActionOpt { - return models.ActionOptOrDefault(actionOpt, models.ActionOptOff) +func (r *Remediator) GetOnOffState() models.ActionOpt { + return models.ActionOptOrDefault(r.setting, models.ActionOptOff) } // Do perform the remediation func (r *Remediator) Do( ctx context.Context, cmd interfaces.ActionCmd, - setting models.ActionOpt, entity protoreflect.ProtoMessage, params interfaces.ActionsParams, _ *json.RawMessage, @@ -137,7 +142,7 @@ func (r *Remediator) Do( Msgf("remediating with endpoint: [%s] and body [%+v]", endpoint.String(), body.String()) var err error - switch setting { + switch r.setting { case models.ActionOptOn: err = r.run(ctx, endpoint.String(), body.Bytes()) case models.ActionOptDryRun: diff --git a/internal/engine/actions/remediate/rest/rest_test.go b/internal/engine/actions/remediate/rest/rest_test.go index 9a47ece365..ea1904b4a2 100644 --- a/internal/engine/actions/remediate/rest/rest_test.go +++ b/internal/engine/actions/remediate/rest/rest_test.go @@ -140,7 +140,8 @@ func TestNewRestRemediate(t *testing.T) { ) require.NoError(t, err) - got, err := NewRestRemediate(tt.args.actionType, tt.args.restCfg, restProvider) + got, err := NewRestRemediate( + tt.args.actionType, tt.args.restCfg, restProvider, models.ActionOptOn) if tt.wantErr { require.Error(t, err, "expected error") require.Nil(t, got, "expected nil") @@ -372,7 +373,8 @@ func TestRestRemediate(t *testing.T) { defer testServer.Close() provider, err := testGithubProvider(testServer.URL) require.NoError(t, err) - engine, err := NewRestRemediate(TestActionTypeValid, tt.newRemArgs.restCfg, provider) + engine, err := NewRestRemediate( + TestActionTypeValid, tt.newRemArgs.restCfg, provider, tt.remArgs.remAction) require.NoError(t, err, "unexpected error creating remediate engine") require.NotNil(t, engine, "expected non-nil remediate engine") @@ -383,7 +385,8 @@ func TestRestRemediate(t *testing.T) { }, } - retMeta, err := engine.Do(context.Background(), interfaces.ActionCmdOn, tt.remArgs.remAction, tt.remArgs.ent, + retMeta, err := engine.Do( + context.Background(), interfaces.ActionCmdOn, tt.remArgs.ent, evalParams, nil) if tt.wantErr { require.Error(t, err, "expected error") diff --git a/internal/engine/entities/entity_event.go b/internal/engine/entities/entity_event.go index d45e1d7c45..00d40b88b6 100644 --- a/internal/engine/entities/entity_event.go +++ b/internal/engine/entities/entity_event.go @@ -12,6 +12,7 @@ import ( "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/reflect/protoreflect" + pbinternal "github.com/mindersec/minder/internal/proto" minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" "github.com/mindersec/minder/pkg/eventer/constants" "github.com/mindersec/minder/pkg/eventer/interfaces" @@ -101,7 +102,7 @@ func (eiw *EntityInfoWrapper) WithRepository(r *minderv1.Repository) *EntityInfo } // WithPullRequest sets the entity to a repository -func (eiw *EntityInfoWrapper) WithPullRequest(p *minderv1.PullRequest) *EntityInfoWrapper { +func (eiw *EntityInfoWrapper) WithPullRequest(p *pbinternal.PullRequest) *EntityInfoWrapper { eiw.Type = minderv1.Entity_ENTITY_PULL_REQUESTS eiw.Entity = p @@ -156,7 +157,7 @@ func (eiw *EntityInfoWrapper) AsArtifact() *EntityInfoWrapper { // AsPullRequest sets the entity type to a pull request func (eiw *EntityInfoWrapper) AsPullRequest() { eiw.Type = minderv1.Entity_ENTITY_PULL_REQUESTS - eiw.Entity = &minderv1.PullRequest{} + eiw.Entity = &pbinternal.PullRequest{} } // AsEntityInstance sets the entity type to an entity instance diff --git a/internal/engine/entities/entity_event_test.go b/internal/engine/entities/entity_event_test.go index e0542295cd..ae4593b6d9 100644 --- a/internal/engine/entities/entity_event_test.go +++ b/internal/engine/entities/entity_event_test.go @@ -13,6 +13,7 @@ import ( "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/reflect/protoreflect" + pbinternal "github.com/mindersec/minder/internal/proto" pb "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" ) @@ -104,7 +105,7 @@ func Test_parseEntityEvent(t *testing.T) { { name: "legacy pull_request event", args: args{ - ent: &pb.PullRequest{ + ent: &pbinternal.PullRequest{ Url: "https://api.github.com/repos/jakubtestorg/bad-npm/pulls/3", CommitSha: "bd9958a63c9b95ccc2bc0cf1eef65a87529aed16", Number: 3, @@ -121,7 +122,7 @@ func Test_parseEntityEvent(t *testing.T) { }, want: &EntityInfoWrapper{ ProjectID: projectID, - Entity: &pb.PullRequest{ + Entity: &pbinternal.PullRequest{ Url: "https://api.github.com/repos/jakubtestorg/bad-npm/pulls/3", CommitSha: "bd9958a63c9b95ccc2bc0cf1eef65a87529aed16", Number: 3, @@ -195,7 +196,7 @@ func Test_parseEntityEvent(t *testing.T) { { name: "pull_request event with entity ID", args: args{ - ent: &pb.PullRequest{ + ent: &pbinternal.PullRequest{ Url: "https://api.github.com/repos/jakubtestorg/bad-npm/pulls/3", CommitSha: "bd9958a63c9b95ccc2bc0cf1eef65a87529aed16", Number: 3, @@ -209,7 +210,7 @@ func Test_parseEntityEvent(t *testing.T) { }, want: &EntityInfoWrapper{ ProjectID: projectID, - Entity: &pb.PullRequest{ + Entity: &pbinternal.PullRequest{ Url: "https://api.github.com/repos/jakubtestorg/bad-npm/pulls/3", CommitSha: "bd9958a63c9b95ccc2bc0cf1eef65a87529aed16", Number: 3, @@ -342,7 +343,7 @@ func TestEntityInfoWrapper_ToMessage(t *testing.T) { eiw: NewEntityInfoWrapper(). WithProviderID(providerID). WithProjectID(projectID). - WithProtoMessage(pb.Entity_ENTITY_PULL_REQUESTS, &pb.PullRequest{ + WithProtoMessage(pb.Entity_ENTITY_PULL_REQUESTS, &pbinternal.PullRequest{ Url: "https://api.github.com/repos/jakubtestorg/bad-npm/pulls/3", CommitSha: "bd9958a63c9b95ccc2bc0cf1eef65a87529aed16", Number: 3, @@ -362,7 +363,7 @@ func TestEntityInfoWrapper_ToMessage(t *testing.T) { eiw: NewEntityInfoWrapper(). WithProviderID(providerID). WithProjectID(projectID). - WithPullRequest(&pb.PullRequest{ + WithPullRequest(&pbinternal.PullRequest{ Url: "https://api.github.com/repos/jakubtestorg/bad-npm/pulls/3", CommitSha: "bd9958a63c9b95ccc2bc0cf1eef65a87529aed16", Number: 3, diff --git a/internal/engine/eval/eval.go b/internal/engine/eval/eval.go index 6d13f6aca1..80aa3643b9 100644 --- a/internal/engine/eval/eval.go +++ b/internal/engine/eval/eval.go @@ -10,6 +10,8 @@ import ( "errors" "fmt" + "github.com/open-feature/go-sdk/openfeature" + "github.com/mindersec/minder/internal/engine/eval/homoglyphs/application" "github.com/mindersec/minder/internal/engine/eval/jq" "github.com/mindersec/minder/internal/engine/eval/rego" @@ -26,6 +28,7 @@ func NewRuleEvaluator( ctx context.Context, ruletype *minderv1.RuleType, provider provinfv1.Provider, + featureFlags openfeature.IClient, opts ...eoptions.Option, ) (interfaces.Evaluator, error) { e := ruletype.Def.GetEval() @@ -41,7 +44,7 @@ func NewRuleEvaluator( } return jq.NewJQEvaluator(e.GetJq(), opts...) case rego.RegoEvalType: - return rego.NewRegoEvaluator(e.GetRego(), opts...) + return rego.NewRegoEvaluator(e.GetRego(), featureFlags, opts...) case vulncheck.VulncheckEvalType: client, err := provinfv1.As[provinfv1.GitHub](provider) if err != nil { diff --git a/internal/engine/eval/eval_test.go b/internal/engine/eval/eval_test.go index 6939b479ce..4603eccd16 100644 --- a/internal/engine/eval/eval_test.go +++ b/internal/engine/eval/eval_test.go @@ -71,7 +71,7 @@ func TestNewRuleEvaluatorWorks(t *testing.T) { t.Run(tt.name, func(t *testing.T) { t.Parallel() - got, err := eval.NewRuleEvaluator(context.Background(), tt.args.rt, nil) + got, err := eval.NewRuleEvaluator(context.Background(), tt.args.rt, nil, nil) assert.NoError(t, err, "unexpected error") assert.NotNil(t, got, "unexpected nil") }) @@ -146,7 +146,7 @@ func TestNewRuleEvaluatorFails(t *testing.T) { t.Run(tt.name, func(t *testing.T) { t.Parallel() - got, err := eval.NewRuleEvaluator(context.Background(), tt.args.rt, nil) + got, err := eval.NewRuleEvaluator(context.Background(), tt.args.rt, nil, nil) assert.Error(t, err, "should have errored") assert.Nil(t, got, "should be nil") }) diff --git a/internal/engine/eval/homoglyphs/application/invisible_characters_eval.go b/internal/engine/eval/homoglyphs/application/invisible_characters_eval.go index 2cd9493e21..c1f906dd84 100644 --- a/internal/engine/eval/homoglyphs/application/invisible_characters_eval.go +++ b/internal/engine/eval/homoglyphs/application/invisible_characters_eval.go @@ -49,19 +49,19 @@ func (ice *InvisibleCharactersEvaluator) Eval( _ map[string]any, _ protoreflect.ProtoMessage, res *interfaces.Result, -) error { +) (*interfaces.EvaluationResult, error) { violations, err := evaluateHomoglyphs(ctx, ice.processor, res, ice.reviewHandler) if err != nil { - return err + return nil, err } if len(violations) > 0 { - return evalerrors.NewDetailedErrEvaluationFailed( + return nil, evalerrors.NewDetailedErrEvaluationFailed( templates.InvisibleCharactersTemplate, map[string]any{"violations": violations}, "found invisible characters violations", ) } - return nil + return &interfaces.EvaluationResult{}, nil } diff --git a/internal/engine/eval/homoglyphs/application/mixed_scripts_eval.go b/internal/engine/eval/homoglyphs/application/mixed_scripts_eval.go index 68dffcf2a6..507071e0f8 100644 --- a/internal/engine/eval/homoglyphs/application/mixed_scripts_eval.go +++ b/internal/engine/eval/homoglyphs/application/mixed_scripts_eval.go @@ -55,19 +55,19 @@ func (mse *MixedScriptsEvaluator) Eval( _ map[string]any, _ protoreflect.ProtoMessage, res *interfaces.Result, -) error { +) (*interfaces.EvaluationResult, error) { violations, err := evaluateHomoglyphs(ctx, mse.processor, res, mse.reviewHandler) if err != nil { - return err + return nil, err } if len(violations) > 0 { - return evalerrors.NewDetailedErrEvaluationFailed( + return nil, evalerrors.NewDetailedErrEvaluationFailed( templates.MixedScriptsTemplate, map[string]any{"violations": violations}, "found mixed scripts violations", ) } - return nil + return &interfaces.EvaluationResult{}, nil } diff --git a/internal/engine/eval/homoglyphs/communication/reviewer.go b/internal/engine/eval/homoglyphs/communication/reviewer.go index 5cdf27a838..6a701bef97 100644 --- a/internal/engine/eval/homoglyphs/communication/reviewer.go +++ b/internal/engine/eval/homoglyphs/communication/reviewer.go @@ -13,7 +13,7 @@ import ( "github.com/rs/zerolog" "github.com/mindersec/minder/internal/engine/eval/homoglyphs/util" - pb "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + pbinternal "github.com/mindersec/minder/internal/proto" provifv1 "github.com/mindersec/minder/pkg/providers/v1" ) @@ -22,7 +22,7 @@ type GhReviewPrHandler struct { logger zerolog.Logger ghClient provifv1.GitHub - pr *pb.PullRequest + pr *pbinternal.PullRequest minderReview *github.PullRequestReview comments []*github.DraftReviewComment @@ -69,7 +69,7 @@ func (ra *GhReviewPrHandler) SubmitReview(ctx context.Context, reviewText string } // Hydrate hydrates the handler with a pull request -func (ra *GhReviewPrHandler) Hydrate(ctx context.Context, pr *pb.PullRequest) { +func (ra *GhReviewPrHandler) Hydrate(ctx context.Context, pr *pbinternal.PullRequest) { logger := zerolog.Ctx(ctx).With(). Int64("pull-number", pr.Number). Str("repo-owner", pr.RepoOwner). diff --git a/internal/engine/eval/jq/jq.go b/internal/engine/eval/jq/jq.go index 19836f07f9..e9f6b55440 100644 --- a/internal/engine/eval/jq/jq.go +++ b/internal/engine/eval/jq/jq.go @@ -37,22 +37,8 @@ func NewJQEvaluator( for idx := range assertions { a := assertions[idx] - if a.Profile != nil && a.Constant != nil { - return nil, fmt.Errorf("profile and constant accessors are mutually exclusive") - } else if a.Profile == nil && a.Constant == nil { - return nil, fmt.Errorf("missing profile or constant accessor") - } - - if a.Profile != nil && a.Profile.Def == "" { - return nil, fmt.Errorf("missing profile accessor definition") - } - - if a.Ingested == nil { - return nil, fmt.Errorf("missing data accessor") - } - - if a.Ingested.Def == "" { - return nil, fmt.Errorf("missing data accessor definition") + if err := a.Validate(); err != nil { + return nil, fmt.Errorf("invalid jq assertion: %w", err) } } @@ -70,9 +56,14 @@ func NewJQEvaluator( } // Eval calls the jq library to evaluate the rule -func (jqe *Evaluator) Eval(ctx context.Context, pol map[string]any, _ protoreflect.ProtoMessage, res *interfaces.Result) error { +func (jqe *Evaluator) Eval( + ctx context.Context, + pol map[string]any, + _ protoreflect.ProtoMessage, + res *interfaces.Result, +) (*interfaces.EvaluationResult, error) { if res.Object == nil { - return fmt.Errorf("missing object") + return nil, fmt.Errorf("missing object") } obj := res.Object @@ -86,7 +77,7 @@ func (jqe *Evaluator) Eval(ctx context.Context, pol map[string]any, _ protorefle if a.Profile == nil { expectedVal, err = util.JQReadConstant[any](a.Constant.AsInterface()) if err != nil { - return fmt.Errorf("cannot get values from profile accessor: %w", err) + return nil, fmt.Errorf("cannot get values from profile accessor: %w", err) } } else { // Get the expected value from the profile accessor @@ -94,13 +85,13 @@ func (jqe *Evaluator) Eval(ctx context.Context, pol map[string]any, _ protorefle // we ignore util.ErrNoValueFound because we want to allow the JQ accessor to return the default value // which is fine for DeepEqual if err != nil && !errors.Is(err, util.ErrNoValueFound) { - return fmt.Errorf("cannot get values from profile accessor: %w", err) + return nil, fmt.Errorf("cannot get values from profile accessor: %w", err) } } dataVal, err = util.JQReadFrom[any](ctx, a.Ingested.Def, obj) if err != nil && !errors.Is(err, util.ErrNoValueFound) { - return fmt.Errorf("cannot get values from data accessor: %w", err) + return nil, fmt.Errorf("cannot get values from data accessor: %w", err) } // Deep compare @@ -113,7 +104,7 @@ func (jqe *Evaluator) Eval(ctx context.Context, pol map[string]any, _ protorefle msg = fmt.Sprintf("%s\nassertion: %s", msg, string(marshalledAssertion)) } - return evalerrors.NewDetailedErrEvaluationFailed( + return nil, evalerrors.NewDetailedErrEvaluationFailed( templates.JqTemplate, map[string]any{ "path": a.Ingested.Def, @@ -126,7 +117,7 @@ func (jqe *Evaluator) Eval(ctx context.Context, pol map[string]any, _ protorefle } } - return nil + return &interfaces.EvaluationResult{}, nil } // Convert numeric types to float64 diff --git a/internal/engine/eval/jq/jq_test.go b/internal/engine/eval/jq/jq_test.go index bd34977e76..12ea43a40b 100644 --- a/internal/engine/eval/jq/jq_test.go +++ b/internal/engine/eval/jq/jq_test.go @@ -366,7 +366,7 @@ func TestValidJQEvals(t *testing.T) { assert.NoError(t, err, "Got unexpected error") assert.NotNil(t, jqe, "Got unexpected nil") - err = jqe.Eval(context.Background(), tt.args.pol, nil, &interfaces.Result{Object: tt.args.obj}) + _, err = jqe.Eval(context.Background(), tt.args.pol, nil, &interfaces.Result{Object: tt.args.obj}) assert.NoError(t, err, "Got unexpected error") }) } @@ -576,7 +576,7 @@ func TestValidJQEvalsFailed(t *testing.T) { assert.NoError(t, err, "Got unexpected error") assert.NotNil(t, jqe, "Got unexpected nil") - err = jqe.Eval(context.Background(), tt.args.pol, nil, &interfaces.Result{Object: tt.args.obj}) + _, err = jqe.Eval(context.Background(), tt.args.pol, nil, &interfaces.Result{Object: tt.args.obj}) assert.ErrorIs(t, err, evalerrors.ErrEvaluationFailed, "Got unexpected error") }) } @@ -644,13 +644,8 @@ func TestInvalidJQEvals(t *testing.T) { t.Run(tt.name, func(t *testing.T) { t.Parallel() - jqe, err := jq.NewJQEvaluator(tt.assertions) - assert.NoError(t, err, "Got unexpected error") - assert.NotNil(t, jqe, "Got unexpected nil") - - err = jqe.Eval(context.Background(), tt.args.pol, nil, &interfaces.Result{Object: tt.args.obj}) - assert.Error(t, err, "Got unexpected error") - assert.NotErrorIs(t, err, evalerrors.ErrEvaluationFailed, "Got unexpected error") + _, err := jq.NewJQEvaluator(tt.assertions) + assert.Error(t, err, "Expected error") }) } } diff --git a/internal/engine/eval/rego/datasources.go b/internal/engine/eval/rego/datasources.go new file mode 100644 index 0000000000..78b9c8e26a --- /dev/null +++ b/internal/engine/eval/rego/datasources.go @@ -0,0 +1,101 @@ +// SPDX-FileCopyrightText: Copyright 2023 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package rego + +import ( + "context" + "fmt" + "strings" + + "github.com/open-policy-agent/opa/ast" + "github.com/open-policy-agent/opa/rego" + "github.com/open-policy-agent/opa/types" + + v1datasources "github.com/mindersec/minder/pkg/datasources/v1" + "github.com/mindersec/minder/pkg/engine/v1/interfaces" +) + +// RegisterDataSources implements the Eval interface. +func (e *Evaluator) RegisterDataSources(dsr *v1datasources.DataSourceRegistry) { + e.datasources = dsr +} + +// buildDataSourceOptions creates an options set from the functions available in +// a data source registry. +func buildDataSourceOptions(res *interfaces.Result, dsr *v1datasources.DataSourceRegistry) []func(*rego.Rego) { + opts := []func(*rego.Rego){} + if dsr == nil { + return opts + } + + for key, dsf := range dsr.GetFuncs() { + opts = append(opts, buildFromDataSource(res, key, dsf)) + } + + return opts +} + +// buildFromDataSource builds a rego function from a data source function. +// It takes a DataSourceFuncDef and returns a function that can be used to +// register the function with the rego engine. +func buildFromDataSource( + res *interfaces.Result, key v1datasources.DataSourceFuncKey, dsf v1datasources.DataSourceFuncDef, +) func(*rego.Rego) { + k := normalizeKey(key) + return rego.Function1( + ®o.Function{ + Name: k, + Decl: types.NewFunction(types.Args(types.A), types.A), + }, + func(_ rego.BuiltinContext, obj *ast.Term) (*ast.Term, error) { + // Convert the AST value back to a Go interface{} + jsonObj, err := ast.JSON(obj.Value) + if err != nil { + return nil, err + } + + if err := dsf.ValidateArgs(jsonObj); err != nil { + return nil, err + } + + // Call the data source function + ctx := context.WithValue( + context.Background(), + v1datasources.ContextKey{}, + v1datasources.Context{ + Ingest: res, + }, + ) + ret, err := dsf.Call(ctx, jsonObj) + if err != nil { + return nil, err + } + + val, err := ast.InterfaceToValue(ret) + if err != nil { + return nil, err + } + + return ast.NewTerm(val), nil + }, + ) +} + +// This converts the data source function key into a format that can be used in the rego query. +// For example, if the key is "aws.ec2.instances", it will +// be converted to "minder.data.aws.ec2.instances". +// It also normalizes the key to lowercase (which should have already been done) +// and converts any "-" to "_", finally it removes any special characters. +func normalizeKey(key v1datasources.DataSourceFuncKey) string { + low := strings.ToLower(key.String()) + underscore := strings.ReplaceAll(low, "-", "_") + // Remove any special characters + norm := strings.Map(func(r rune) rune { + if r >= 'a' && r <= 'z' || r >= '0' && r <= '9' || r == '_' || r == '.' { + return r + } + return -1 + }, underscore) + return fmt.Sprintf("minder.datasource.%s", norm) +} diff --git a/internal/engine/eval/rego/eval.go b/internal/engine/eval/rego/eval.go index 75e6f12b81..fd2a597360 100644 --- a/internal/engine/eval/rego/eval.go +++ b/internal/engine/eval/rego/eval.go @@ -9,12 +9,15 @@ import ( "fmt" "os" + "github.com/open-feature/go-sdk/openfeature" "github.com/open-policy-agent/opa/rego" "github.com/open-policy-agent/opa/topdown/print" "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/types/known/structpb" eoptions "github.com/mindersec/minder/internal/engine/options" minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + v1datasources "github.com/mindersec/minder/pkg/datasources/v1" "github.com/mindersec/minder/pkg/engine/v1/interfaces" ) @@ -36,9 +39,11 @@ const ( // It initializes the rego engine and evaluates the rules // The default rego package is "minder" type Evaluator struct { - cfg *Config - regoOpts []func(*rego.Rego) - reseval resultEvaluator + cfg *Config + featureFlags openfeature.IClient + regoOpts []func(*rego.Rego) + reseval resultEvaluator + datasources *v1datasources.DataSourceRegistry } // Input is the input for the rego evaluator @@ -47,6 +52,9 @@ type Input struct { Profile map[string]any `json:"profile"` // Ingested is the values set for the ingested data Ingested any `json:"ingested"` + // Properties contains the entity's properties as defined by + // the provider + Properties map[string]any `json:"properties"` // OutputFormat is the format to output violations in OutputFormat ConstraintsViolationsFormat `json:"output_format"` } @@ -64,6 +72,7 @@ var _ print.Hook = (*hook)(nil) // NewRegoEvaluator creates a new rego evaluator func NewRegoEvaluator( cfg *minderv1.RuleType_Definition_Eval_Rego, + featureFlags openfeature.IClient, opts ...eoptions.Option, ) (*Evaluator, error) { c, err := parseConfig(cfg) @@ -74,8 +83,9 @@ func NewRegoEvaluator( re := c.getEvalType() eval := &Evaluator{ - cfg: c, - reseval: re, + cfg: c, + featureFlags: featureFlags, + reseval: re, regoOpts: []func(*rego.Rego){ re.getQuery(), rego.Module(MinderRegoFile, c.Def), @@ -107,29 +117,55 @@ func (e *Evaluator) newRegoFromOptions(opts ...func(*rego.Rego)) *rego.Rego { // Eval implements the Evaluator interface. func (e *Evaluator) Eval( ctx context.Context, pol map[string]any, entity protoreflect.ProtoMessage, res *interfaces.Result, -) error { +) (*interfaces.EvaluationResult, error) { // The rego engine is actually able to handle nil // objects quite gracefully, so we don't need to check // this explicitly. obj := res.Object - libFuncs := instantiateRegoLib(res) + // Register options to expose functions + regoFuncOptions := []func(*rego.Rego){} + + // Initialize the built-in minder library rego functions + regoFuncOptions = append(regoFuncOptions, instantiateRegoLib(ctx, e.featureFlags, res)...) + + // If the evaluator has data sources defined, expose their functions + regoFuncOptions = append(regoFuncOptions, buildDataSourceOptions(res, e.datasources)...) + + // Create the rego object r := e.newRegoFromOptions( - libFuncs..., + regoFuncOptions..., ) + pq, err := r.PrepareForEval(ctx) if err != nil { - return fmt.Errorf("could not prepare Rego: %w", err) + return nil, fmt.Errorf("could not prepare Rego: %w", err) } - rs, err := pq.Eval(ctx, rego.EvalInput(&Input{ + input := &Input{ Profile: pol, Ingested: obj, OutputFormat: e.cfg.ViolationFormat, - })) + } + + enrichInputWithEntityProps(input, entity) + rs, err := pq.Eval(ctx, rego.EvalInput(input)) if err != nil { - return fmt.Errorf("error evaluating profile. Might be wrong input: %w", err) + return nil, fmt.Errorf("error evaluating profile. Might be wrong input: %w", err) } return e.reseval.parseResult(rs, entity) } + +type propertiesFetcher interface { + GetProperties() *structpb.Struct +} + +func enrichInputWithEntityProps( + input *Input, + entity protoreflect.ProtoMessage, +) { + if inner, ok := entity.(propertiesFetcher); ok { + input.Properties = inner.GetProperties().AsMap() + } +} diff --git a/internal/engine/eval/rego/fuzz_test.go b/internal/engine/eval/rego/fuzz_test.go index 53fc19a16e..8988b17dc1 100644 --- a/internal/engine/eval/rego/fuzz_test.go +++ b/internal/engine/eval/rego/fuzz_test.go @@ -20,6 +20,7 @@ func FuzzRegoEval(f *testing.F) { Type: ConstraintsEvaluationType.String(), Def: policy, }, + nil, ) if err != nil { return diff --git a/internal/engine/eval/rego/lib.go b/internal/engine/eval/rego/lib.go index 9ce398a87f..77752e09d4 100644 --- a/internal/engine/eval/rego/lib.go +++ b/internal/engine/eval/rego/lib.go @@ -4,6 +4,9 @@ package rego import ( + "archive/tar" + "bytes" + "compress/gzip" "context" "errors" "fmt" @@ -12,9 +15,11 @@ import ( "net/http" "os" "path/filepath" + "time" "github.com/go-git/go-billy/v5" billyutil "github.com/go-git/go-billy/v5/util" + "github.com/open-feature/go-sdk/openfeature" "github.com/open-policy-agent/opa/ast" "github.com/open-policy-agent/opa/rego" "github.com/open-policy-agent/opa/types" @@ -22,6 +27,7 @@ import ( "github.com/stacklok/frizbee/pkg/utils/config" "gopkg.in/yaml.v3" + "github.com/mindersec/minder/internal/flags" "github.com/mindersec/minder/internal/util" "github.com/mindersec/minder/pkg/engine/v1/interfaces" ) @@ -39,11 +45,33 @@ var MinderRegoLib = []func(res *interfaces.Result) func(*rego.Rego){ JQIsTrue, } -func instantiateRegoLib(res *interfaces.Result) []func(*rego.Rego) { +// MinderRegoLibExperiments contains Minder-specific functions which +// should only be exposed when the given experiment is enabled. +var MinderRegoLibExperiments = map[flags.Experiment][]func(res *interfaces.Result) func(*rego.Rego){ + flags.TarGzFunctions: {FileArchive, BaseFileArchive}, + flags.GitPRDiffs: { + BaseFileExists, + BaseFileLs, + BaseFileLsGlob, + BaseFileHTTPType, + BaseFileRead, + BaseFileWalk, + BaseListGithubActions, + }, +} + +func instantiateRegoLib(ctx context.Context, featureFlags openfeature.IClient, res *interfaces.Result) []func(*rego.Rego) { var lib []func(*rego.Rego) for _, f := range MinderRegoLib { lib = append(lib, f(res)) } + for flag, funcs := range MinderRegoLibExperiments { + if flags.Bool(ctx, featureFlags, flag) { + for _, f := range funcs { + lib = append(lib, f(res)) + } + } + } return lib } @@ -57,30 +85,47 @@ func FileExists(res *interfaces.Result) func(*rego.Rego) { Name: "file.exists", Decl: types.NewFunction(types.Args(types.S), types.B), }, - func(_ rego.BuiltinContext, op1 *ast.Term) (*ast.Term, error) { - var path string - if err := ast.As(op1.Value, &path); err != nil { - return nil, err - } + fsExists(res.Fs), + ) +} - if res.Fs == nil { - return nil, fmt.Errorf("cannot check file existence without a filesystem") - } +// BaseFileExists is a rego function that checks if a file exists +// in the base filesystem from the ingester. Base filesystems are +// typically associated with pull requests. +// It takes one argument, the path to the file to check. +// It's exposed as `base_file.exists`. +func BaseFileExists(res *interfaces.Result) func(*rego.Rego) { + return rego.Function1( + ®o.Function{ + Name: "base_file.exists", + Decl: types.NewFunction(types.Args(types.S), types.B), + }, + fsExists(res.BaseFs), + ) +} - fs := res.Fs +func fsExists(vfs billy.Filesystem) func(rego.BuiltinContext, *ast.Term) (*ast.Term, error) { + return func(_ rego.BuiltinContext, op1 *ast.Term) (*ast.Term, error) { + var path string + if err := ast.As(op1.Value, &path); err != nil { + return nil, err + } - cpath := filepath.Clean(path) - _, err := fs.Stat(cpath) - if err != nil { - if errors.Is(err, os.ErrNotExist) { - return ast.BooleanTerm(false), nil - } - return nil, err + if vfs == nil { + return nil, fmt.Errorf("cannot check file existence without a filesystem") + } + + cpath := filepath.Clean(path) + _, err := vfs.Stat(cpath) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + return ast.BooleanTerm(false), nil } + return nil, err + } - return ast.BooleanTerm(true), nil - }, - ) + return ast.BooleanTerm(true), nil + } } // FileRead is a rego function that reads a file from the filesystem @@ -92,35 +137,51 @@ func FileRead(res *interfaces.Result) func(*rego.Rego) { Name: "file.read", Decl: types.NewFunction(types.Args(types.S), types.S), }, - func(_ rego.BuiltinContext, op1 *ast.Term) (*ast.Term, error) { - var path string - if err := ast.As(op1.Value, &path); err != nil { - return nil, err - } + fsRead(res.Fs), + ) +} - if res.Fs == nil { - return nil, fmt.Errorf("cannot read file without a filesystem") - } +// BaseFileRead is a rego function that reads a file from the +// base filesystem in a pull_request or other diff context. +// It takes one argument, the path to the file to read. +// It's exposed as `base_file.read`. +func BaseFileRead(res *interfaces.Result) func(*rego.Rego) { + return rego.Function1( + ®o.Function{ + Name: "base_file.read", + Decl: types.NewFunction(types.Args(types.S), types.S), + }, + fsRead(res.BaseFs), + ) +} - fs := res.Fs +func fsRead(vfs billy.Filesystem) func(rego.BuiltinContext, *ast.Term) (*ast.Term, error) { + return func(_ rego.BuiltinContext, op1 *ast.Term) (*ast.Term, error) { + var path string + if err := ast.As(op1.Value, &path); err != nil { + return nil, err + } - cpath := filepath.Clean(path) - f, err := fs.Open(cpath) - if err != nil { - return nil, err - } + if vfs == nil { + return nil, fmt.Errorf("cannot read file without a filesystem") + } - defer f.Close() + cpath := filepath.Clean(path) + f, err := vfs.Open(cpath) + if err != nil { + return nil, err + } - all, rerr := io.ReadAll(f) - if rerr != nil { - return nil, rerr - } + defer f.Close() - allstr := ast.String(all) - return ast.NewTerm(allstr), nil - }, - ) + all, rerr := io.ReadAll(f) + if rerr != nil { + return nil, rerr + } + + allstr := ast.String(all) + return ast.NewTerm(allstr), nil + } } // FileLs is a rego function that lists the files in a directory @@ -137,64 +198,84 @@ func FileLs(res *interfaces.Result) func(*rego.Rego) { Name: "file.ls", Decl: types.NewFunction(types.Args(types.S), types.A), }, - func(_ rego.BuiltinContext, op1 *ast.Term) (*ast.Term, error) { - var path string - if err := ast.As(op1.Value, &path); err != nil { - return nil, err - } + fsLs(res.Fs), + ) +} - if res.Fs == nil { - return nil, fmt.Errorf("cannot walk file without a filesystem") - } +// BaseFileLs is a rego function that lists the files in a directory +// in the base filesystem being evaluated (in a pull_request or other +// diff context). It takes one argument, the path to the directory to list. +// It's exposed as `base_file.ls`. +// If the file is a file, it returns the file itself. +// If the file is a directory, it returns the files in the directory. +// If the file is a symlink, it follows the symlink and returns the files +// in the target. +func BaseFileLs(res *interfaces.Result) func(*rego.Rego) { + return rego.Function1( + ®o.Function{ + Name: "base_file.ls", + Decl: types.NewFunction(types.Args(types.S), types.A), + }, + fsLs(res.BaseFs), + ) +} - fs := res.Fs +func fsLs(vfs billy.Filesystem) func(rego.BuiltinContext, *ast.Term) (*ast.Term, error) { + return func(_ rego.BuiltinContext, op1 *ast.Term) (*ast.Term, error) { + var path string + if err := ast.As(op1.Value, &path); err != nil { + return nil, err + } + + if vfs == nil { + return nil, fmt.Errorf("cannot walk file without a filesystem") + } + + // Check file information and return a list of files + // and directories + finfo, err := vfs.Lstat(path) + if err != nil { + return fileLsHandleError(err) + } + + // If the file is a file return the file itself + if finfo.Mode().IsRegular() { + return fileLsHandleFile(path) + } + + // If the file is a directory return the files in the directory + if finfo.Mode().IsDir() { + return fileLsHandleDir(path, vfs) + } + + // If the file is a symlink, follow it + if finfo.Mode()&os.ModeSymlink != 0 { + // Get the target of the symlink + target, err := vfs.Readlink(path) + if err != nil { + return nil, err + } - // Check file information and return a list of files - // and directories - finfo, err := fs.Lstat(path) + // Get the file information of the target + // NOTE: This overwrites the previous finfo + finfo, err = vfs.Lstat(target) if err != nil { return fileLsHandleError(err) } - // If the file is a file return the file itself + // If the target is a file return the file itself if finfo.Mode().IsRegular() { - return fileLsHandleFile(path) + return fileLsHandleFile(target) } - // If the file is a directory return the files in the directory + // If the target is a directory return the files in the directory if finfo.Mode().IsDir() { - return fileLsHandleDir(path, fs) + return fileLsHandleDir(target, vfs) } + } - // If the file is a symlink, follow it - if finfo.Mode()&os.ModeSymlink != 0 { - // Get the target of the symlink - target, err := fs.Readlink(path) - if err != nil { - return nil, err - } - - // Get the file information of the target - // NOTE: This overwrites the previous finfo - finfo, err = fs.Lstat(target) - if err != nil { - return fileLsHandleError(err) - } - - // If the target is a file return the file itself - if finfo.Mode().IsRegular() { - return fileLsHandleFile(target) - } - - // If the target is a directory return the files in the directory - if finfo.Mode().IsDir() { - return fileLsHandleDir(target, fs) - } - } - - return nil, fmt.Errorf("cannot handle file type %s", finfo.Mode()) - }, - ) + return nil, fmt.Errorf("cannot handle file type %s", finfo.Mode()) + } } // FileLsGlob is a rego function that lists the files matching a glob in a directory @@ -207,33 +288,50 @@ func FileLsGlob(res *interfaces.Result) func(*rego.Rego) { Name: "file.ls_glob", Decl: types.NewFunction(types.Args(types.S), types.A), }, - func(_ rego.BuiltinContext, op1 *ast.Term) (*ast.Term, error) { - var path string - if err := ast.As(op1.Value, &path); err != nil { - return nil, err - } + fsLsGlob(res.Fs), + ) +} - if res.Fs == nil { - return nil, fmt.Errorf("cannot walk file without a filesystem") - } +// BaseFileLsGlob is a rego function that lists the files matching a glob +// in a directory in the base filesystem being evaluated (in a pull_request +// or other diff context). +// It takes one argument, the path to the pattern to match. It's exposed +// as `base_file.ls_glob`. +func BaseFileLsGlob(res *interfaces.Result) func(*rego.Rego) { + return rego.Function1( + ®o.Function{ + Name: "base_file.ls_glob", + Decl: types.NewFunction(types.Args(types.S), types.A), + }, + fsLsGlob(res.BaseFs), + ) +} - rfs := res.Fs +func fsLsGlob(vfs billy.Filesystem) func(rego.BuiltinContext, *ast.Term) (*ast.Term, error) { + return func(_ rego.BuiltinContext, op1 *ast.Term) (*ast.Term, error) { + var path string + if err := ast.As(op1.Value, &path); err != nil { + return nil, err + } - matches, err := billyutil.Glob(rfs, path) - files := []*ast.Term{} + if vfs == nil { + return nil, fmt.Errorf("cannot walk file without a filesystem") + } - for _, m := range matches { - files = append(files, ast.NewTerm(ast.String(m))) - } + matches, err := billyutil.Glob(vfs, path) + files := []*ast.Term{} - if err != nil { - return nil, err - } + for _, m := range matches { + files = append(files, ast.NewTerm(ast.String(m))) + } - return ast.NewTerm( - ast.NewArray(files...)), nil - }, - ) + if err != nil { + return nil, err + } + + return ast.NewTerm( + ast.NewArray(files...)), nil + } } // FileWalk is a rego function that walks the files in a directory @@ -246,54 +344,71 @@ func FileWalk(res *interfaces.Result) func(*rego.Rego) { Name: "file.walk", Decl: types.NewFunction(types.Args(types.S), types.A), }, - func(_ rego.BuiltinContext, op1 *ast.Term) (*ast.Term, error) { - var path string - if err := ast.As(op1.Value, &path); err != nil { - return nil, err - } - - if res.Fs == nil { - return nil, fmt.Errorf("cannot walk file without a filesystem") - } + fsWalk(res.Fs), + ) +} - rfs := res.Fs +// BaseFileWalk is a rego function that walks the files in a directory +// in the base filesystem being evaluated (in a pull_request or other +// diff context). +// It takes one argument, the path to the directory to walk. It's exposed +// as `base_file.walk`. +func BaseFileWalk(res *interfaces.Result) func(*rego.Rego) { + return rego.Function1( + ®o.Function{ + Name: "base_file.walk", + Decl: types.NewFunction(types.Args(types.S), types.A), + }, + fsWalk(res.BaseFs), + ) +} - // if the path is a file, return the file itself - // Check file information and return a list of files - // and directories - finfo, err := rfs.Lstat(path) +func fsWalk(vfs billy.Filesystem) func(rego.BuiltinContext, *ast.Term) (*ast.Term, error) { + return func(_ rego.BuiltinContext, op1 *ast.Term) (*ast.Term, error) { + var path string + if err := ast.As(op1.Value, &path); err != nil { + return nil, err + } + + if vfs == nil { + return nil, fmt.Errorf("cannot walk file without a filesystem") + } + + // if the path is a file, return the file itself + // Check file information and return a list of files + // and directories + finfo, err := vfs.Lstat(path) + if err != nil { + return fileLsHandleError(err) + } + + // If the file is a file return the file itself + if finfo.Mode().IsRegular() { + return fileLsHandleFile(path) + } + + files := []*ast.Term{} + err = billyutil.Walk(vfs, path, func(path string, info fs.FileInfo, err error) error { + // skip if error if err != nil { - return fileLsHandleError(err) - } - - // If the file is a file return the file itself - if finfo.Mode().IsRegular() { - return fileLsHandleFile(path) + return nil } - files := []*ast.Term{} - err = billyutil.Walk(rfs, path, func(path string, info fs.FileInfo, err error) error { - // skip if error - if err != nil { - return nil - } - - // skip if directory - if info.IsDir() { - return nil - } - - files = append(files, ast.NewTerm(ast.String(path))) + // skip if directory + if info.IsDir() { return nil - }) - if err != nil { - return nil, err } - return ast.NewTerm( - ast.NewArray(files...)), nil - }, - ) + files = append(files, ast.NewTerm(ast.String(path))) + return nil + }) + if err != nil { + return nil, err + } + + return ast.NewTerm( + ast.NewArray(files...)), nil + } } func fileLsHandleError(err error) (*ast.Term, error) { @@ -328,6 +443,97 @@ func fileLsHandleDir(path string, bfs billy.Filesystem) (*ast.Term, error) { ast.NewArray(files...)), nil } +// FileArchive packages a set of files form the the specified directory into +// a tarball. It takes one argument: a list of file or directory paths to +// include, and outputs the tarball as a string. +// It's exposed as 'file.archive`. +func FileArchive(res *interfaces.Result) func(*rego.Rego) { + return rego.Function1( + ®o.Function{ + Name: "file.archive", + Decl: types.NewFunction(types.Args(types.NewArray(nil, types.S)), types.S), + }, + fsArchive(res.Fs), + ) +} + +// BaseFileArchive packages a set of files form the the specified directory +// in the base filesystem (from a pull_request or other diff context) into +// a tarball. It takes one argument: a list of file or directory paths to +// include, and outputs the tarball as a string. +// It's exposed as 'base_file.archive`. +func BaseFileArchive(res *interfaces.Result) func(*rego.Rego) { + return rego.Function1( + ®o.Function{ + Name: "base_file.archive", + Decl: types.NewFunction(types.Args(types.NewArray(nil, types.S)), types.S), + }, + fsArchive(res.BaseFs), + ) +} + +func fsArchive(vfs billy.Filesystem) func(rego.BuiltinContext, *ast.Term) (*ast.Term, error) { + return func(_ rego.BuiltinContext, op1 *ast.Term) (*ast.Term, error) { + var paths []string + if err := ast.As(op1.Value, &paths); err != nil { + return nil, err + } + + if vfs == nil { + return nil, fmt.Errorf("cannot archive files without a filesystem") + } + + out := bytes.Buffer{} + gzWriter := gzip.NewWriter(&out) + defer gzWriter.Close() + tarWriter := tar.NewWriter(gzWriter) + defer tarWriter.Close() + + for _, f := range paths { + err := billyutil.Walk(vfs, f, func(path string, info fs.FileInfo, err error) error { + if err != nil { + return err + } + fileHeader, err := tar.FileInfoHeader(info, "") + if err != nil { + return err + } + fileHeader.Name = path + // memfs doesn't return change times anyway, so zero them for consistency + fileHeader.ModTime = time.Time{} + fileHeader.AccessTime = time.Time{} + fileHeader.ChangeTime = time.Time{} + if err := tarWriter.WriteHeader(fileHeader); err != nil { + return err + } + if info.Mode().IsRegular() { + file, err := vfs.Open(path) + if err != nil { + return err + } + defer file.Close() + if _, err := io.Copy(tarWriter, file); err != nil { + return err + } + } + return nil + }) + if err != nil { + return nil, err + } + } + + if err := tarWriter.Close(); err != nil { + return nil, err + } + if err := gzWriter.Close(); err != nil { + return nil, err + } + + return ast.StringTerm(out.String()), nil + } +} + // ListGithubActions is a rego function that lists the actions in a directory // in the filesystem being evaluated (which comes from the ingester). // It takes one argument, the path to the directory to list. It's exposed @@ -340,33 +546,53 @@ func ListGithubActions(res *interfaces.Result) func(*rego.Rego) { Name: "github_workflow.ls_actions", Decl: types.NewFunction(types.Args(types.S), types.NewSet(types.S)), }, - func(_ rego.BuiltinContext, op1 *ast.Term) (*ast.Term, error) { - var base string - if err := ast.As(op1.Value, &base); err != nil { - return nil, err - } + fsListGithubActions(res.Fs), + ) +} - if res.Fs == nil { - return nil, fmt.Errorf("cannot list actions without a filesystem") - } +// BaseListGithubActions is a rego function that lists the actions in a directory +// in the base filesystem being evaluated (in a pull_request or diff context). +// It takes one argument, the path to the directory to list. It's exposed +// as `github_workflow.base_ls_actions`. +// The function returns a set of strings, each string being the name of an action. +// The frizbee library guarantees that the actions are unique. +func BaseListGithubActions(res *interfaces.Result) func(*rego.Rego) { + return rego.Function1( + ®o.Function{ + Name: "github_workflow.base_ls_actions", + Decl: types.NewFunction(types.Args(types.S), types.NewSet(types.S)), + }, + fsListGithubActions(res.BaseFs), + ) +} - var terms []*ast.Term +func fsListGithubActions(vfs billy.Filesystem) func(rego.BuiltinContext, *ast.Term) (*ast.Term, error) { + return func(_ rego.BuiltinContext, op1 *ast.Term) (*ast.Term, error) { + var base string + if err := ast.As(op1.Value, &base); err != nil { + return nil, err + } - // Parse the ingested file system and extract all action references - r := replacer.NewGitHubActionsReplacer(&config.Config{}) - actions, err := r.ListPathInFS(res.Fs, base) - if err != nil { - return nil, err - } + if vfs == nil { + return nil, fmt.Errorf("cannot list actions without a filesystem") + } - // Save the action names - for _, a := range actions.Entities { - terms = append(terms, ast.StringTerm(a.Name)) - } + var terms []*ast.Term - return ast.SetTerm(terms...), nil - }, - ) + // Parse the ingested file system and extract all action references + r := replacer.NewGitHubActionsReplacer(&config.Config{}) + actions, err := r.ListPathInFS(vfs, base) + if err != nil { + return nil, err + } + + // Save the action names + for _, a := range actions.Entities { + terms = append(terms, ast.StringTerm(a.Name)) + } + + return ast.SetTerm(terms...), nil + } } // FileHTTPType is a rego function that returns the HTTP type of a file @@ -379,39 +605,55 @@ func FileHTTPType(res *interfaces.Result) func(*rego.Rego) { Name: "file.http_type", Decl: types.NewFunction(types.Args(types.S), types.S), }, - func(_ rego.BuiltinContext, op1 *ast.Term) (*ast.Term, error) { - var path string - if err := ast.As(op1.Value, &path); err != nil { - return nil, err - } - - if res.Fs == nil { - return nil, fmt.Errorf("cannot list actions without a filesystem") - } - - bfs := res.Fs - - cpath := filepath.Clean(path) - f, err := bfs.Open(cpath) - if err != nil { - return nil, err - } - - defer f.Close() - - buffer := make([]byte, 512) - n, err := f.Read(buffer) - if err != nil && err != io.EOF { - return nil, err - } + fsHTTPType(res.Fs), + ) +} - httpTyp := http.DetectContentType(buffer[:n]) - astHTTPTyp := ast.String(httpTyp) - return ast.NewTerm(astHTTPTyp), nil +// BaseFileHTTPType is a rego function that returns the HTTP type of a file +// in the filesystem being evaluated (which comes from the ingester). +// It takes one argument, the path to the file to check. It's exposed +// as `base_file.http_type`. +func BaseFileHTTPType(res *interfaces.Result) func(*rego.Rego) { + return rego.Function1( + ®o.Function{ + Name: "base_file.http_type", + Decl: types.NewFunction(types.Args(types.S), types.S), }, + fsHTTPType(res.BaseFs), ) } +func fsHTTPType(vfs billy.Filesystem) func(rego.BuiltinContext, *ast.Term) (*ast.Term, error) { + return func(_ rego.BuiltinContext, op1 *ast.Term) (*ast.Term, error) { + var path string + if err := ast.As(op1.Value, &path); err != nil { + return nil, err + } + + if vfs == nil { + return nil, fmt.Errorf("cannot list actions without a filesystem") + } + + cpath := filepath.Clean(path) + f, err := vfs.Open(cpath) + if err != nil { + return nil, err + } + + defer f.Close() + + buffer := make([]byte, 512) + n, err := f.Read(buffer) + if err != nil && err != io.EOF { + return nil, err + } + + httpTyp := http.DetectContentType(buffer[:n]) + astHTTPTyp := ast.String(httpTyp) + return ast.NewTerm(astHTTPTyp), nil + } +} + // JQIsTrue is a rego function that accepts parsed YAML data and runs a jq query on it. // The query is a string in jq format that returns a boolean. // It returns a boolean indicating whether the jq query matches the parsed YAML data. diff --git a/internal/engine/eval/rego/lib_test.go b/internal/engine/eval/rego/lib_test.go index 6d53620d52..e30579bc3d 100644 --- a/internal/engine/eval/rego/lib_test.go +++ b/internal/engine/eval/rego/lib_test.go @@ -5,16 +5,19 @@ package rego_test import ( "context" + "encoding/base64" "errors" "fmt" "testing" "time" memfs "github.com/go-git/go-billy/v5/memfs" + billyutil "github.com/go-git/go-billy/v5/util" "github.com/stretchr/testify/require" engerrors "github.com/mindersec/minder/internal/engine/errors" "github.com/mindersec/minder/internal/engine/eval/rego" + "github.com/mindersec/minder/internal/flags" minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" "github.com/mindersec/minder/pkg/engine/v1/interfaces" ) @@ -40,19 +43,54 @@ allow { file.exists("foo") }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") emptyPol := map[string]any{} // Matches - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: nil, Fs: fs, }) require.NoError(t, err, "could not evaluate") } +func TestFileExistsInBase(t *testing.T) { + t.Parallel() + fs := memfs.New() + + _, err := fs.Create("foo") + require.NoError(t, err, "could not create file") + + featureClient := &flags.FakeClient{} + featureClient.Data = map[string]any{"git_pr_diffs": true} + e, err := rego.NewRegoEvaluator( + &minderv1.RuleType_Definition_Eval_Rego{ + Type: rego.DenyByDefaultEvaluationType.String(), + Def: ` +package minder + +default allow = false + +allow { + base_file.exists("foo") +}`, + }, + featureClient, + ) + require.NoError(t, err, "could not create evaluator") + + emptyPol := map[string]any{} + + // Matches + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + BaseFs: fs, + }) + require.NoError(t, err, "could not evaluate") +} + func TestFileExistsWithNonExistentFile(t *testing.T) { t.Parallel() @@ -70,12 +108,13 @@ allow { file.exists("unexistent") }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") emptyPol := map[string]any{} - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: nil, Fs: fs, }) @@ -107,12 +146,13 @@ allow { contents == "bar" }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") emptyPol := map[string]any{} - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: nil, Fs: fs, }) @@ -144,12 +184,13 @@ allow { contents == "bar" }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") emptyPol := map[string]any{} - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: nil, Fs: fs, }) @@ -174,12 +215,13 @@ allow { is_null(files) }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") emptyPol := map[string]any{} - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: nil, Fs: fs, }) @@ -206,12 +248,13 @@ allow { count(files) == 0 }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") emptyPol := map[string]any{} - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: nil, Fs: fs, }) @@ -243,12 +286,13 @@ allow { files[0] == "foo/bar" }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") emptyPol := map[string]any{} - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: nil, Fs: fs, }) @@ -280,12 +324,13 @@ allow { files[0] == "foo/bar" }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") emptyPol := map[string]any{} - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: nil, Fs: fs, }) @@ -320,12 +365,13 @@ allow { count(files) == 3 }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") emptyPol := map[string]any{} - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: nil, Fs: fs, }) @@ -363,12 +409,13 @@ allow { count(files) == 3 }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") emptyPol := map[string]any{} - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: nil, Fs: fs, }) @@ -401,12 +448,13 @@ allow { count(files) == 1 }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") emptyPol := map[string]any{} - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: nil, Fs: fs, }) @@ -498,12 +546,13 @@ allow { actions == expected_set }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") emptyPol := map[string]any{} - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: nil, Fs: fs, }) @@ -534,12 +583,13 @@ allow { actions == expected_set }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") emptyPol := map[string]any{} - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: nil, Fs: fs, }) @@ -569,12 +619,13 @@ allow { count(files) == 1 }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") emptyPol := map[string]any{} - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: nil, Fs: fs, }) @@ -615,12 +666,13 @@ allow { count(files) == 3 }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") emptyPol := map[string]any{} - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: nil, Fs: fs, }) @@ -651,12 +703,13 @@ allow { htype == "text/plain; charset=utf-8" }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") emptyPol := map[string]any{} - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: nil, Fs: fs, }) @@ -688,12 +741,13 @@ allow { htype == "application/octet-stream" }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") emptyPol := map[string]any{} - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: nil, Fs: fs, }) @@ -738,12 +792,72 @@ allow { count(files) == 7 }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") emptyPol := map[string]any{} - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + Object: nil, + Fs: fs, + }) + require.NoError(t, err, "could not evaluate") +} + +func TestFileArchive(t *testing.T) { + t.Parallel() + fs := memfs.New() + require.NoError(t, fs.MkdirAll("foo", 0755), "could not create directory") + require.NoError(t, fs.MkdirAll("bar", 0755), "could not create directory") + + require.NoError(t, billyutil.WriteFile(fs, "foo/bar", []byte("bar"), 0644)) + require.NoError(t, billyutil.WriteFile(fs, "foo/baz", []byte("bar"), 0644)) + require.NoError(t, billyutil.WriteFile(fs, "file.txt", []byte("words"), 0644)) + require.NoError(t, billyutil.WriteFile(fs, "README", []byte("docs"), 0644)) + + // N.B. This was constructed by examining the output of the tarball, and + // and verifying by untarring the data with `cat file | tar -tzvf -` + expectedTarball := []byte{ + 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 236, 147, 65, 10, 2, 49, 12, 69, 115, + 148, 57, 129, 254, 98, 211, 158, 103, 68, 11, 130, 16, 232, 84, 20, 79, + 47, 234, 202, 34, 10, 74, 170, 67, 243, 54, 153, 213, 252, 52, 159, 151, + 68, 72, 27, 0, 136, 204, 183, 9, 160, 158, 79, 190, 99, 116, 142, 6, 86, + 223, 140, 136, 14, 83, 25, 51, 1, 223, 254, 167, 126, 220, 76, 72, 34, + 203, 245, 152, 85, 51, 174, 247, 8, 222, 191, 232, 127, 245, 216, 191, + 131, 103, 208, 208, 228, 136, 157, 247, 175, 221, 189, 241, 223, 220, + 253, 63, 171, 102, 124, 226, 127, 48, 255, 155, 96, 254, 247, 77, 218, + 237, 183, 139, 114, 42, 154, 25, 239, 253, 231, 218, 255, 96, 254, 183, + 225, 40, 121, 51, 253, 122, 9, 195, 48, 12, 163, 57, 151, 0, 0, 0, 255, + 255, 203, 184, 208, 59, 0, 18, 0, 0, + } + + featureClient := &flags.FakeClient{} + featureClient.Data = map[string]any{"tar_gz_functions": true} + e, err := rego.NewRegoEvaluator( + &minderv1.RuleType_Definition_Eval_Rego{ + Type: rego.ConstraintsEvaluationType.String(), + Def: ` +package minder +import rego.v1 + +tarball := file.archive(["foo", "file.txt"]) +encoded := base64.encode(tarball) +expectedTar := base64.decode(input.profile.expected) +violations contains {"msg": sprintf("Expected: %s", [input.profile.expected])} if tarball != expectedTar +violations contains {"msg": sprintf("Got : %s", [encoded])} if tarball != expectedTar +`, + }, + featureClient, + ) + require.NoError(t, err, "could not create evaluator") + + policy := map[string]any{ + // Encode to string in Go, to force checking that Go & Rego perform the same encoding + "expected": base64.StdEncoding.EncodeToString(expectedTarball), + } + + _, err = e.Eval(context.Background(), policy, nil, &interfaces.Result{ Object: nil, Fs: fs, }) @@ -888,13 +1002,14 @@ allow { Type: rego.DenyByDefaultEvaluationType.String(), Def: regoCode, }, + nil, ) require.NoError(t, err, "could not create evaluator") emptyPol := map[string]any{} var evalErr *engerrors.EvaluationError - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: nil, Fs: fs, }) @@ -993,10 +1108,11 @@ allow { Type: rego.DenyByDefaultEvaluationType.String(), Def: regoCode, }, + nil, ) require.NoError(t, err, "could not create evaluator") - err = e.Eval(context.Background(), map[string]any{}, nil, &interfaces.Result{}) + _, err = e.Eval(context.Background(), map[string]any{}, nil, &interfaces.Result{}) if s.wantErr { require.Error(t, err) diff --git a/internal/engine/eval/rego/rego_test.go b/internal/engine/eval/rego/rego_test.go index 1e8477d86c..3954f0b5d8 100644 --- a/internal/engine/eval/rego/rego_test.go +++ b/internal/engine/eval/rego/rego_test.go @@ -10,10 +10,14 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "go.uber.org/mock/gomock" engerrors "github.com/mindersec/minder/internal/engine/errors" "github.com/mindersec/minder/internal/engine/eval/rego" + "github.com/mindersec/minder/internal/engine/options" minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + v1datasources "github.com/mindersec/minder/pkg/datasources/v1" + v1mockds "github.com/mindersec/minder/pkg/datasources/v1/mock" "github.com/mindersec/minder/pkg/engine/v1/interfaces" ) @@ -37,13 +41,14 @@ allow { input.ingested.data == "foo" }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") emptyPol := map[string]any{} // Matches - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: map[string]any{ "data": "foo", }, @@ -51,7 +56,7 @@ allow { require.NoError(t, err, "could not evaluate") // Doesn't match - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: map[string]any{ "data": "bar", }, @@ -79,13 +84,14 @@ skip { } `, }, + nil, ) require.NoError(t, err, "could not create evaluator") emptyPol := map[string]any{} // Doesn't match - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: map[string]any{ "data": "bar", }, @@ -107,13 +113,14 @@ violations[{"msg": msg}] { msg := "data did not contain foo" }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") emptyPol := map[string]any{} // Matches - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: map[string]any{ "data": "foo", }, @@ -121,7 +128,7 @@ violations[{"msg": msg}] { require.NoError(t, err, "could not evaluate") // Doesn't match - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: map[string]any{ "data": "bar", }, @@ -150,12 +157,13 @@ violations[{"msg": msg}] { } `, }, + nil, ) require.NoError(t, err, "could not create evaluator") emptyPol := map[string]any{} - err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ Object: map[string]any{ "data": "foo", "datum": "bar", @@ -186,6 +194,7 @@ allow { input.profile.data == input.ingested.data }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") @@ -194,7 +203,7 @@ allow { } // Matches - err = e.Eval(context.Background(), pol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), pol, nil, &interfaces.Result{ Object: map[string]any{ "data": "foo", }, @@ -202,7 +211,7 @@ allow { require.NoError(t, err, "could not evaluate") // Doesn't match - err = e.Eval(context.Background(), pol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), pol, nil, &interfaces.Result{ Object: map[string]any{ "data": "bar", }, @@ -224,6 +233,7 @@ violations[{"msg": msg}] { msg := sprintf("data did not match profile: %s", [input.profile.data]) }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") @@ -232,7 +242,7 @@ violations[{"msg": msg}] { } // Matches - err = e.Eval(context.Background(), pol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), pol, nil, &interfaces.Result{ Object: map[string]any{ "data": "foo", }, @@ -240,7 +250,7 @@ violations[{"msg": msg}] { require.NoError(t, err, "could not evaluate") // Doesn't match - err = e.Eval(context.Background(), pol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), pol, nil, &interfaces.Result{ Object: map[string]any{ "data": "bar", }, @@ -288,6 +298,7 @@ func TestConstraintsJSONOutput(t *testing.T) { ViolationFormat: &violationFormat, Def: jsonPolicyDef, }, + nil, ) require.NoError(t, err, "could not create evaluator") @@ -295,7 +306,7 @@ func TestConstraintsJSONOutput(t *testing.T) { "data": []string{"foo", "bar"}, } - err = e.Eval(context.Background(), pol, nil, &interfaces.Result{ + evalResult, err := e.Eval(context.Background(), pol, nil, &interfaces.Result{ Object: map[string]any{ "data": []string{"foo", "bar", "baz"}, }, @@ -304,13 +315,22 @@ func TestConstraintsJSONOutput(t *testing.T) { // check that the error payload msg is JSON in the expected format errmsg := engerrors.ErrorAsEvalDetails(err) - var result []struct { + var errDetails []struct { ActionsNotAllowed []string `json:"actions_not_allowed"` } - err = json.Unmarshal([]byte(errmsg), &result) + err = json.Unmarshal([]byte(errmsg), &errDetails) require.NoError(t, err, "could not unmarshal error JSON") - assert.Len(t, result, 1, "should have one result") - assert.Contains(t, result[0].ActionsNotAllowed, "baz", "should have baz in the result") + assert.Len(t, errDetails, 1, "should have one result") + assert.Contains(t, errDetails[0].ActionsNotAllowed, "baz", "should have baz in the result") + + // check that result is a list with a single element + outputList, ok := evalResult.Output.([]map[string]interface{}) + require.True(t, ok, "evaluation result output should be a list") + + assert.Len(t, outputList, 1, "evaluation result should have one element") + + assert.Contains(t, outputList[0], "actions_not_allowed", "evaluation result should contain actions_not_allowed key") + assert.Contains(t, outputList[0]["actions_not_allowed"], "baz", "evaluation result should contain baz") } func TestConstraintsJSONFalback(t *testing.T) { @@ -329,6 +349,7 @@ violations[{"msg": msg}] { msg := sprintf("data did not match profile: %s", [input.profile.data]) }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") @@ -336,7 +357,7 @@ violations[{"msg": msg}] { "data": "foo", } - err = e.Eval(context.Background(), pol, nil, &interfaces.Result{ + evalResult, err := e.Eval(context.Background(), pol, nil, &interfaces.Result{ Object: map[string]any{ "data": "bar", }, @@ -345,12 +366,15 @@ violations[{"msg": msg}] { // check that the error payload msg is JSON in the expected format errmsg := engerrors.ErrorAsEvalDetails(err) - var result []struct { + var errDetails []struct { Msg string `json:"msg"` } - err = json.Unmarshal([]byte(errmsg), &result) + err = json.Unmarshal([]byte(errmsg), &errDetails) require.NoError(t, err, "could not unmarshal error JSON") - assert.Len(t, result, 1, "should have one result") + assert.Len(t, errDetails, 1, "error details should have one element") + + // check that result is a list with a single element + assert.Len(t, evalResult.Output, 1, "evaluation result should have one element") } func TestOutputTypePassedIntoRule(t *testing.T) { @@ -361,6 +385,7 @@ func TestOutputTypePassedIntoRule(t *testing.T) { Type: rego.ConstraintsEvaluationType.String(), Def: jsonPolicyDef, }, + nil, ) require.NoError(t, err, "could not create evaluator") @@ -368,7 +393,7 @@ func TestOutputTypePassedIntoRule(t *testing.T) { "data": []string{"one", "two"}, } - err = e.Eval(context.Background(), pol, nil, &interfaces.Result{ + _, err = e.Eval(context.Background(), pol, nil, &interfaces.Result{ Object: map[string]any{ "data": []string{"two", "three"}, }, @@ -387,14 +412,14 @@ func TestCantCreateEvaluatorWithInvalidConfig(t *testing.T) { t.Run("nil", func(t *testing.T) { t.Parallel() - _, err := rego.NewRegoEvaluator(nil) + _, err := rego.NewRegoEvaluator(nil, nil) require.Error(t, err, "should have failed to create evaluator") }) t.Run("empty", func(t *testing.T) { t.Parallel() - _, err := rego.NewRegoEvaluator(&minderv1.RuleType_Definition_Eval_Rego{}) + _, err := rego.NewRegoEvaluator(&minderv1.RuleType_Definition_Eval_Rego{}, nil) require.Error(t, err, "should have failed to create evaluator") }) @@ -405,6 +430,7 @@ func TestCantCreateEvaluatorWithInvalidConfig(t *testing.T) { &minderv1.RuleType_Definition_Eval_Rego{ Type: "invalid", }, + nil, ) require.Error(t, err, "should have failed to create evaluator") }) @@ -423,10 +449,11 @@ package minder violations[{"msg": msg}] {`, }, + nil, ) require.NoError(t, err, "could not create evaluator") - err = e.Eval(context.Background(), map[string]any{}, nil, + _, err = e.Eval(context.Background(), map[string]any{}, nil, &interfaces.Result{Object: map[string]any{}}) assert.Error(t, err, "should have failed to evaluate") } @@ -447,10 +474,68 @@ violations[{"msg": msg}] { msg := "data did not contain foo" }`, }, + nil, ) require.NoError(t, err, "could not create evaluator") - err = e.Eval(context.Background(), map[string]any{}, nil, + _, err = e.Eval(context.Background(), map[string]any{}, nil, &interfaces.Result{Object: map[string]any{}}) assert.Error(t, err, "should have failed to evaluate") } + +func TestCustomDatasourceRegister(t *testing.T) { + t.Parallel() + + ctrl := gomock.NewController(t) + + fds := v1mockds.NewMockDataSource(ctrl) + fdsf := v1mockds.NewMockDataSourceFuncDef(ctrl) + + fds.EXPECT().GetFuncs().Return(map[v1datasources.DataSourceFuncKey]v1datasources.DataSourceFuncDef{ + "source": fdsf, + }).AnyTimes() + + fdsf.EXPECT().ValidateArgs(gomock.Any()).Return(nil).AnyTimes() + + fdsr := v1datasources.NewDataSourceRegistry() + + err := fdsr.RegisterDataSource("fake", fds) + require.NoError(t, err, "could not register data source") + + e, err := rego.NewRegoEvaluator( + &minderv1.RuleType_Definition_Eval_Rego{ + Type: rego.DenyByDefaultEvaluationType.String(), + Def: ` +package minder + +default allow = false + +allow { + minder.datasource.fake.source({"datasourcetest": input.ingested.data}) == "foo" +}`, + }, + nil, + options.WithDataSources(fdsr), + ) + require.NoError(t, err, "could not create evaluator") + + emptyPol := map[string]any{} + + // Matches + fdsf.EXPECT().Call(gomock.Any(), gomock.Any()).Return("foo", nil) + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + Object: map[string]any{ + "data": "foo", + }, + }) + require.NoError(t, err, "could not evaluate") + + // Doesn't match + fdsf.EXPECT().Call(gomock.Any(), gomock.Any()).Return("bar", nil) + _, err = e.Eval(context.Background(), emptyPol, nil, &interfaces.Result{ + Object: map[string]any{ + "data": "bar", + }, + }) + require.ErrorIs(t, err, engerrors.ErrEvaluationFailed, "should have failed the evaluation") +} diff --git a/internal/engine/eval/rego/result.go b/internal/engine/eval/rego/result.go index fff26b5776..d713aa2557 100644 --- a/internal/engine/eval/rego/result.go +++ b/internal/engine/eval/rego/result.go @@ -13,7 +13,9 @@ import ( engerrors "github.com/mindersec/minder/internal/engine/errors" "github.com/mindersec/minder/internal/engine/eval/templates" + pbinternal "github.com/mindersec/minder/internal/proto" minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + "github.com/mindersec/minder/pkg/engine/v1/interfaces" ) // EvaluationType is the type of evaluation to perform @@ -52,7 +54,7 @@ func (c ConstraintsViolationsFormat) String() string { type resultEvaluator interface { getQuery() func(*rego.Rego) - parseResult(rego.ResultSet, protoreflect.ProtoMessage) error + parseResult(rego.ResultSet, protoreflect.ProtoMessage) (*interfaces.EvaluationResult, error) } type denyByDefaultEvaluator struct { @@ -62,10 +64,11 @@ func (*denyByDefaultEvaluator) getQuery() func(r *rego.Rego) { return rego.Query(RegoQueryPrefix) } -func (*denyByDefaultEvaluator) parseResult(rs rego.ResultSet, entity protoreflect.ProtoMessage) error { +func (*denyByDefaultEvaluator) parseResult(rs rego.ResultSet, entity protoreflect.ProtoMessage, +) (*interfaces.EvaluationResult, error) { // This usually happens when the provided Rego code is empty if len(rs) == 0 { - return engerrors.NewDetailedErrEvaluationFailed( + return nil, engerrors.NewDetailedErrEvaluationFailed( templates.RegoDenyByDefaultTemplate, map[string]any{ "message": "no results", @@ -78,7 +81,7 @@ func (*denyByDefaultEvaluator) parseResult(rs rego.ResultSet, entity protoreflec // This usually happens when the provided Rego code is empty if len(res.Expressions) == 0 { - return engerrors.NewDetailedErrEvaluationFailed( + return nil, engerrors.NewDetailedErrEvaluationFailed( templates.RegoDenyByDefaultTemplate, map[string]any{ "message": "no expressions", @@ -92,7 +95,7 @@ func (*denyByDefaultEvaluator) parseResult(rs rego.ResultSet, entity protoreflec exprVal := exprRaw.Value expr, ok := exprVal.(map[string]any) if !ok { - return engerrors.NewDetailedErrEvaluationFailed( + return nil, engerrors.NewDetailedErrEvaluationFailed( templates.RegoDenyByDefaultTemplate, map[string]any{ "message": "unable to get result expression", @@ -107,14 +110,14 @@ func (*denyByDefaultEvaluator) parseResult(rs rego.ResultSet, entity protoreflec skippedBool, ok := skipped.(bool) // if skipped is true, return skipped error if ok && skippedBool { - return engerrors.NewErrEvaluationSkipped("rule not applicable") + return nil, engerrors.NewErrEvaluationSkipped("rule not applicable") } } // check if allowed allowed, ok := expr["allow"] if !ok { - return engerrors.NewDetailedErrEvaluationFailed( + return nil, engerrors.NewDetailedErrEvaluationFailed( templates.RegoDenyByDefaultTemplate, map[string]any{ "message": "unable to get allow result", @@ -125,7 +128,7 @@ func (*denyByDefaultEvaluator) parseResult(rs rego.ResultSet, entity protoreflec allowedBool, ok := allowed.(bool) if !ok { - return engerrors.NewDetailedErrEvaluationFailed( + return nil, engerrors.NewDetailedErrEvaluationFailed( templates.RegoDenyByDefaultTemplate, map[string]any{ "message": "allow result is not a bool", @@ -135,7 +138,7 @@ func (*denyByDefaultEvaluator) parseResult(rs rego.ResultSet, entity protoreflec } if allowedBool { - return nil + return &interfaces.EvaluationResult{}, nil } // check if custom message was provided @@ -151,7 +154,7 @@ func (*denyByDefaultEvaluator) parseResult(rs rego.ResultSet, entity protoreflec } entityName := getEntityName(entity) - return engerrors.NewDetailedErrEvaluationFailed( + return nil, engerrors.NewDetailedErrEvaluationFailed( templates.RegoDenyByDefaultTemplate, map[string]any{ "message": message, @@ -169,26 +172,26 @@ func (*constraintsEvaluator) getQuery() func(r *rego.Rego) { return rego.Query(fmt.Sprintf("%s.violations[details]", RegoQueryPrefix)) } -func (c *constraintsEvaluator) parseResult(rs rego.ResultSet, _ protoreflect.ProtoMessage) error { +func (c *constraintsEvaluator) parseResult(rs rego.ResultSet, _ protoreflect.ProtoMessage) (*interfaces.EvaluationResult, error) { if len(rs) == 0 { // There were no violations - return nil + return &interfaces.EvaluationResult{}, nil } // Gather violations into one resBuilder := c.resultsBuilder(rs) if resBuilder == nil { - return fmt.Errorf("invalid format: %s", c.format) + return nil, fmt.Errorf("invalid format: %s", c.format) } for _, r := range rs { v, err := resultToViolation(r) if err != nil { - return fmt.Errorf("unexpected error in rego violation: %w", err) + return nil, fmt.Errorf("unexpected error in rego violation: %w", err) } err = resBuilder.addResult(v) if err != nil { - return fmt.Errorf("cannot add result: %w", err) + return nil, fmt.Errorf("cannot add result: %w", err) } } @@ -227,7 +230,7 @@ func resultToViolation(r rego.Result) (any, error) { type resultBuilder interface { addResult(msg any) error - formatResults() error + formatResults() (*interfaces.EvaluationResult, error) } type stringResultBuilder struct { @@ -249,15 +252,17 @@ func (srb *stringResultBuilder) addResult(msg any) error { return nil } -func (srb *stringResultBuilder) formatResults() error { - return engerrors.NewDetailedErrEvaluationFailed( - templates.RegoConstraints, - map[string]any{ - "violations": srb.results, - }, - "Evaluation failures: \n - %s", - strings.Join(srb.results, "\n - "), - ) +func (srb *stringResultBuilder) formatResults() (*interfaces.EvaluationResult, error) { + return &interfaces.EvaluationResult{ + Output: srb.results, + }, engerrors.NewDetailedErrEvaluationFailed( + templates.RegoConstraints, + map[string]any{ + "violations": srb.results, + }, + "Evaluation failures: \n - %s", + strings.Join(srb.results, "\n - "), + ) } type jsonResultBuilder struct { @@ -290,18 +295,20 @@ func (jrb *jsonResultBuilder) addResult(msg any) error { return nil } -func (jrb *jsonResultBuilder) formatResults() error { +func (jrb *jsonResultBuilder) formatResults() (*interfaces.EvaluationResult, error) { jsonArray, err := json.Marshal(jrb.results) if err != nil { - return fmt.Errorf("failed to marshal violations: %w", err) + return nil, fmt.Errorf("failed to marshal violations: %w", err) } - return engerrors.NewErrEvaluationFailed("%s", string(jsonArray)) + return &interfaces.EvaluationResult{ + Output: jrb.results, + }, engerrors.NewErrEvaluationFailed("%s", string(jsonArray)) } func getEntityName(entity protoreflect.ProtoMessage) string { switch inner := entity.(type) { - case *minderv1.PullRequest: + case *pbinternal.PullRequest: return fmt.Sprintf("%s/%s#%d", inner.RepoOwner, inner.RepoName, diff --git a/internal/engine/eval/trusty/actions.go b/internal/engine/eval/trusty/actions.go index 5396a65bea..52b9b44280 100644 --- a/internal/engine/eval/trusty/actions.go +++ b/internal/engine/eval/trusty/actions.go @@ -13,16 +13,13 @@ import ( "slices" "strings" template "text/template" - "unicode" "github.com/google/go-github/v63/github" "github.com/rs/zerolog" - trustytypes "github.com/stacklok/trusty-sdk-go/pkg/types" "github.com/mindersec/minder/internal/constants" "github.com/mindersec/minder/internal/engine/eval/pr_actions" pbinternal "github.com/mindersec/minder/internal/proto" - pb "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" provifv1 "github.com/mindersec/minder/pkg/providers/v1" ) @@ -194,13 +191,13 @@ type dependencyAlternatives struct { BlockPR bool // trustyReply is the complete response from trusty for this package - trustyReply *trustytypes.Reply + trustyReply *trustyReport } // summaryPrHandler is a prStatusHandler that adds a summary text to the PR as a comment. type summaryPrHandler struct { cli provifv1.GitHub - pr *pb.PullRequest + pr *pbinternal.PullRequest trustyUrl string trackedAlternatives []dependencyAlternatives @@ -276,8 +273,8 @@ func (sph *summaryPrHandler) generateSummary() (string, error) { for _, alternative := range sph.trackedAlternatives { if _, ok := lowScorePackages[alternative.Dependency.Name]; !ok { var score float64 - if alternative.trustyReply.Summary.Score != nil { - score = *alternative.trustyReply.Summary.Score + if alternative.trustyReply.Score != nil { + score = *alternative.trustyReply.Score } packageUIURL, err := url.JoinPath( @@ -300,39 +297,47 @@ func (sph *summaryPrHandler) generateSummary() (string, error) { if slices.Contains(alternative.Reasons, TRUSTY_MALICIOUS_PKG) { malicious = append(malicious, maliciousTemplateData{ templatePackageData: packageData, - Summary: alternative.trustyReply.PackageData.Malicious.Summary, - Details: preprocessDetails(alternative.trustyReply.PackageData.Malicious.Details), + Summary: alternative.trustyReply.Malicious.Summary, + Details: alternative.trustyReply.Malicious.Details, }) continue } lowScorePackages[alternative.Dependency.Name] = templatePackage{ templatePackageData: packageData, - Deprecated: alternative.trustyReply.PackageData.Deprecated, - Archived: alternative.trustyReply.PackageData.Archived, - ScoreComponents: buildScoreMatrix(alternative), + Deprecated: alternative.trustyReply.IsDeprecated, + Archived: alternative.trustyReply.IsArchived, + ScoreComponents: buildScoreMatrix(alternative.trustyReply.ScoreComponents), Alternatives: []templateAlternative{}, Provenance: buildProvenanceStruct(alternative.trustyReply), } } - for _, altData := range alternative.trustyReply.Alternatives.Packages { - if altData.Score <= lowScorePackages[alternative.Dependency.Name].Score { + for _, altData := range alternative.trustyReply.Alternatives { + // Note: now that the score is deprecated and + // effectively `nil` for all packages, this + // loop will always discard all alternatives, + // rendering the whole block dead code. + // + // Since (1) we don't have score anymore, and + // (2) we don't suggest malicious packages, I + // suggest getting rid of this check + // altogether and always report all available + // alternatives. + if comparePackages(altData, lowScorePackages[alternative.Dependency.Name]) == worse { continue } altPackageData := templateAlternative{ templatePackageData: templatePackageData{ - Ecosystem: alternative.Dependency.Ecosystem.AsString(), + Ecosystem: altData.PackageType, PackageName: altData.PackageName, - TrustyURL: fmt.Sprintf( - "%s%s/%s", constants.TrustyHttpURL, - strings.ToLower(alternative.Dependency.Ecosystem.AsString()), - url.PathEscape(altData.PackageName), - ), - Score: altData.Score, + TrustyURL: altData.TrustyURL, }, } + if altData.Score != nil { + altPackageData.templatePackageData.Score = *altData.Score + } dep := lowScorePackages[alternative.Dependency.Name] dep.Alternatives = append(dep.Alternatives, altPackageData) @@ -343,28 +348,45 @@ func (sph *summaryPrHandler) generateSummary() (string, error) { return sph.compileTemplate(malicious, lowScorePackages) } +type packageComparison int + +const ( + better packageComparison = iota + worse +) + +// comparePackages compares two packages to determine whether the +// first argument is better or worse than the second one. It does so +// by checking Trusty scores. +func comparePackages(alt alternative, examined templatePackage) packageComparison { + if alt.Score != nil && *alt.Score != 0 && *alt.Score <= examined.Score { + return worse + } + return better +} + // buildProvenanceStruct builds the provenance data structure for the PR template -func buildProvenanceStruct(r *trustytypes.Reply) *templateProvenance { +func buildProvenanceStruct(r *trustyReport) *templateProvenance { if r == nil || r.Provenance == nil { return nil } var provenance *templateProvenance if r.Provenance != nil { provenance = &templateProvenance{} - if r.Provenance.Description.Historical.Overlap != 0 { + if r.Provenance.Historical != nil && r.Provenance.Historical.Overlap != 0 { provenance.Historical = &templateHistoricalProvenance{ - NumVersions: int(r.Provenance.Description.Historical.Versions), - NumTags: int(r.Provenance.Description.Historical.Tags), - MatchedVersions: int(r.Provenance.Description.Historical.Common), + NumVersions: int(r.Provenance.Historical.Versions), + NumTags: int(r.Provenance.Historical.Tags), + MatchedVersions: int(r.Provenance.Historical.Common), } } - if r.Provenance.Description.Sigstore.Issuer != "" { + if r.Provenance.Sigstore != nil && r.Provenance.Sigstore.Issuer != "" { provenance.Sigstore = &templateSigstoreProvenance{ - SourceRepository: r.Provenance.Description.Sigstore.SourceRepository, - Workflow: r.Provenance.Description.Sigstore.Workflow, - Issuer: r.Provenance.Description.Sigstore.Issuer, - RekorURI: r.Provenance.Description.Sigstore.Transparency, + SourceRepository: r.Provenance.Sigstore.SourceRepository, + Workflow: r.Provenance.Sigstore.Workflow, + Issuer: r.Provenance.Sigstore.Issuer, + RekorURI: r.Provenance.Sigstore.RekorURI, } } @@ -377,35 +399,12 @@ func buildProvenanceStruct(r *trustytypes.Reply) *templateProvenance { // buildScoreMatrix builds the score components matrix that populates // the score table in the PR comment template -func buildScoreMatrix(alternative dependencyAlternatives) []templateScoreComponent { +// +//nolint:gosimple // This code is legacy and should be removed +func buildScoreMatrix(components []scoreComponent) []templateScoreComponent { scoreComp := []templateScoreComponent{} - if alternative.trustyReply.Summary.Description != nil { - for l, v := range alternative.trustyReply.Summary.Description { - switch l { - case "activity": - l = "Package activity" - case "activity_user": - l = "User activity" - case "provenance": - l = "Provenance" - case "typosquatting": - if v.(float64) > 5.00 { - continue - } - v = "⚠️ Dependency may be trying to impersonate a well known package" - l = "Typosquatting" - case "activity_repo": - l = "Repository activity" - default: - if len(l) > 1 { - l = string(unicode.ToUpper([]rune(l)[0])) + l[1:] - } - } - scoreComp = append(scoreComp, templateScoreComponent{ - Label: l, - Value: v, - }) - } + for _, component := range components { + scoreComp = append(scoreComp, templateScoreComponent(component)) } return scoreComp } @@ -430,7 +429,7 @@ func (sph *summaryPrHandler) compileTemplate(malicious []maliciousTemplateData, } func newSummaryPrHandler( - pr *pb.PullRequest, + pr *pbinternal.PullRequest, cli provifv1.GitHub, trustyUrl string, ) (*summaryPrHandler, error) { @@ -448,8 +447,12 @@ func newSummaryPrHandler( }, nil } -func preprocessDetails(s string) string { - scanner := bufio.NewScanner(strings.NewReader(s)) +func preprocessDetails(s *string) string { + if s == nil { + return "" + } + + scanner := bufio.NewScanner(strings.NewReader(*s)) text := "" for scanner.Scan() { if strings.HasPrefix(scanner.Text(), "#") { diff --git a/internal/engine/eval/trusty/actions_test.go b/internal/engine/eval/trusty/actions_test.go index 2359049d62..4338576b78 100644 --- a/internal/engine/eval/trusty/actions_test.go +++ b/internal/engine/eval/trusty/actions_test.go @@ -7,10 +7,9 @@ package trusty import ( "testing" - trustytypes "github.com/stacklok/trusty-sdk-go/pkg/types" "github.com/stretchr/testify/require" - v1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + pbinternal "github.com/mindersec/minder/internal/proto" ) func TestNewSummaryPrHandler(t *testing.T) { @@ -18,7 +17,7 @@ func TestNewSummaryPrHandler(t *testing.T) { // newSummaryPrHandler must never fail. The only failure point // right now is the pr comment template - _, err := newSummaryPrHandler(&v1.PullRequest{}, nil, "") + _, err := newSummaryPrHandler(&pbinternal.PullRequest{}, nil, "") require.NoError(t, err) } @@ -26,28 +25,25 @@ func TestBuildProvenanceStruct(t *testing.T) { t.Parallel() for _, tc := range []struct { name string - sut *trustytypes.Reply + sut *trustyReport mustNil bool expected *templateProvenance }{ { name: "full-response", - sut: &trustytypes.Reply{ - Provenance: &trustytypes.Provenance{ - Score: 8.0, - Description: trustytypes.ProvenanceDescription{ - Historical: trustytypes.HistoricalProvenance{ - Tags: 10, - Common: 8, - Overlap: 80, - Versions: 10, - }, - Sigstore: trustytypes.SigstoreProvenance{ - Issuer: "CN=sigstore-intermediate,O=sigstore.dev", - Workflow: ".github/workflows/build_and_deploy.yml", - SourceRepository: "https://github.com/vercel/next.js", - Transparency: "https://search.sigstore.dev/?logIndex=88381843", - }, + sut: &trustyReport{ + Provenance: &provenance{ + Historical: &historicalProvenance{ + Tags: 10, + Common: 8, + Overlap: 80, + Versions: 10, + }, + Sigstore: &sigstoreProvenance{ + Issuer: "CN=sigstore-intermediate,O=sigstore.dev", + Workflow: ".github/workflows/build_and_deploy.yml", + SourceRepository: "https://github.com/vercel/next.js", + RekorURI: "https://search.sigstore.dev/?logIndex=88381843", }, }, }, @@ -68,16 +64,13 @@ func TestBuildProvenanceStruct(t *testing.T) { }, { name: "only-historical", - sut: &trustytypes.Reply{ - Provenance: &trustytypes.Provenance{ - Score: 8.0, - Description: trustytypes.ProvenanceDescription{ - Historical: trustytypes.HistoricalProvenance{ - Tags: 10, - Common: 8, - Overlap: 80, - Versions: 10, - }, + sut: &trustyReport{ + Provenance: &provenance{ + Historical: &historicalProvenance{ + Tags: 10, + Common: 8, + Overlap: 80, + Versions: 10, }, }, }, @@ -92,16 +85,13 @@ func TestBuildProvenanceStruct(t *testing.T) { }, { name: "only-sigstore", - sut: &trustytypes.Reply{ - Provenance: &trustytypes.Provenance{ - Score: 8.0, - Description: trustytypes.ProvenanceDescription{ - Sigstore: trustytypes.SigstoreProvenance{ - Issuer: "CN=sigstore-intermediate,O=sigstore.dev", - Workflow: ".github/workflows/build_and_deploy.yml", - SourceRepository: "https://github.com/vercel/next.js", - Transparency: "https://search.sigstore.dev/?logIndex=88381843", - }, + sut: &trustyReport{ + Provenance: &provenance{ + Sigstore: &sigstoreProvenance{ + Issuer: "CN=sigstore-intermediate,O=sigstore.dev", + Workflow: ".github/workflows/build_and_deploy.yml", + SourceRepository: "https://github.com/vercel/next.js", + RekorURI: "https://search.sigstore.dev/?logIndex=88381843", }, }, }, @@ -122,7 +112,7 @@ func TestBuildProvenanceStruct(t *testing.T) { }, { name: "no-provenance", - sut: &trustytypes.Reply{}, + sut: &trustyReport{}, mustNil: true, }, } { diff --git a/internal/engine/eval/trusty/trusty.go b/internal/engine/eval/trusty/trusty.go index 06bb6e1549..bf61a43704 100644 --- a/internal/engine/eval/trusty/trusty.go +++ b/internal/engine/eval/trusty/trusty.go @@ -7,14 +7,16 @@ package trusty import ( "context" "fmt" + "net/url" "os" "strings" "github.com/rs/zerolog" - trusty "github.com/stacklok/trusty-sdk-go/pkg/client" - trustytypes "github.com/stacklok/trusty-sdk-go/pkg/types" + trusty "github.com/stacklok/trusty-sdk-go/pkg/v2/client" + trustytypes "github.com/stacklok/trusty-sdk-go/pkg/v2/types" "google.golang.org/protobuf/reflect/protoreflect" + "github.com/mindersec/minder/internal/constants" evalerrors "github.com/mindersec/minder/internal/engine/errors" "github.com/mindersec/minder/internal/engine/eval/pr_actions" "github.com/mindersec/minder/internal/engine/eval/templates" @@ -35,7 +37,7 @@ const ( type Evaluator struct { cli provifv1.GitHub endpoint string - client *trusty.Trusty + client trusty.Trusty } // NewTrustyEvaluator creates a new trusty evaluator @@ -84,14 +86,14 @@ func (e *Evaluator) Eval( pol map[string]any, _ protoreflect.ProtoMessage, res *interfaces.Result, -) error { +) (*interfaces.EvaluationResult, error) { // Extract the dependency list from the PR prDependencies, err := readPullRequestDependencies(res) if err != nil { - return fmt.Errorf("reading pull request dependencies: %w", err) + return nil, fmt.Errorf("reading pull request dependencies: %w", err) } if len(prDependencies.Deps) == 0 { - return nil + return &interfaces.EvaluationResult{}, nil } logger := zerolog.Ctx(ctx).With(). @@ -102,12 +104,12 @@ func (e *Evaluator) Eval( // Parse the profile data to get the policy configuration ruleConfig, err := parseRuleConfig(pol) if err != nil { - return fmt.Errorf("parsing policy configuration: %w", err) + return nil, fmt.Errorf("parsing policy configuration: %w", err) } prSummaryHandler, err := newSummaryPrHandler(prDependencies.Pr, e.cli, e.endpoint) if err != nil { - return fmt.Errorf("failed to create summary handler: %w", err) + return nil, fmt.Errorf("failed to create summary handler: %w", err) } // Classify all dependencies, tracking all that are malicious or scored low @@ -119,7 +121,7 @@ func (e *Evaluator) Eval( Str("dependency_name", dep.Dep.Name). Str("dependency_version", dep.Dep.Version). Msg("error fetching trusty data") - return fmt.Errorf("getting dependency score: %w", err) + return nil, fmt.Errorf("getting dependency score: %w", err) } if depscore == nil || depscore.PackageName == "" { @@ -135,15 +137,20 @@ func (e *Evaluator) Eval( // If there are no problematic dependencies, return here if len(prSummaryHandler.trackedAlternatives) == 0 { logger.Debug().Msgf("no action, no packages tracked") - return nil + return &interfaces.EvaluationResult{}, nil } if err := submitSummary(ctx, prSummaryHandler, ruleConfig); err != nil { logger.Err(err).Msgf("Failed generating PR summary: %s", err.Error()) - return fmt.Errorf("submitting pull request summary: %w", err) + return nil, fmt.Errorf("submitting pull request summary: %w", err) + } + + err = buildEvalResult(prSummaryHandler) + if err != nil { + return nil, err } - return buildEvalResult(prSummaryHandler) + return &interfaces.EvaluationResult{}, nil } func getEcosystemConfig( @@ -200,9 +207,7 @@ func buildEvalResult(prSummary *summaryPrHandler) error { // Craft an evaluation failed error with the dependency data: var lowScoringPackages, maliciousPackages []string for _, d := range prSummary.trackedAlternatives { - if d.trustyReply.PackageData.Malicious != nil && - d.trustyReply.PackageData.Malicious.Published != nil && - d.trustyReply.PackageData.Malicious.Published.String() != "" { + if d.trustyReply.Malicious != nil { maliciousPackages = append(maliciousPackages, d.trustyReply.PackageName) } else { lowScoringPackages = append(lowScoringPackages, d.trustyReply.PackageName) @@ -240,26 +245,295 @@ func buildEvalResult(prSummary *summaryPrHandler) error { return nil } +type trustyReport struct { + PackageName string + PackageType string + PackageVersion string + TrustyURL string + IsDeprecated bool + IsArchived bool + Score *float64 + ActivityScore float64 + ProvenanceScore float64 + ScoreComponents []scoreComponent + Alternatives []alternative + Provenance *provenance + Malicious *malicious +} + +type scoreComponent struct { + Label string + Value any +} + +type provenance struct { + Historical *historicalProvenance + Sigstore *sigstoreProvenance +} + +type historicalProvenance struct { + Versions int + Tags int + Common int + Overlap float64 +} + +type sigstoreProvenance struct { + SourceRepository string + Workflow string + Issuer string + RekorURI string +} + +type malicious struct { + Summary string + Details string +} + +type alternative struct { + PackageName string + PackageType string + Score *float64 + TrustyURL string +} + func getDependencyScore( - ctx context.Context, trustyClient *trusty.Trusty, dep *pbinternal.PrDependencies_ContextualDependency, -) (*trustytypes.Reply, error) { + ctx context.Context, + trustyClient trusty.Trusty, + dep *pbinternal.PrDependencies_ContextualDependency, +) (*trustyReport, error) { // Call the Trusty API - resp, err := trustyClient.Report(ctx, &trustytypes.Dependency{ - Name: dep.Dep.Name, - Version: dep.Dep.Version, - Ecosystem: trustytypes.Ecosystem(dep.Dep.Ecosystem), - }) - if err != nil { - return nil, fmt.Errorf("failed to send request: %w", err) + packageType := dep.Dep.Ecosystem.AsString() + input := &trustytypes.Dependency{ + PackageName: dep.Dep.Name, + PackageType: packageType, + PackageVersion: &dep.Dep.Version, + } + + summary := make(chan *trustytypes.PackageSummaryAnnotation, 1) + metadata := make(chan *trustytypes.TrustyPackageData, 1) + alternatives := make(chan *trustytypes.PackageAlternatives, 1) + provenance := make(chan *trustytypes.Provenance, 1) + errors := make(chan error) + + defer func() { + close(summary) + close(metadata) + close(alternatives) + close(provenance) + close(errors) + }() + + go func() { + resp, err := trustyClient.Summary(ctx, input) + errors <- err + summary <- resp + }() + + go func() { + resp, err := trustyClient.PackageMetadata(ctx, input) + errors <- err + metadata <- resp + }() + + go func() { + resp, err := trustyClient.Alternatives(ctx, input) + errors <- err + alternatives <- resp + }() + + go func() { + resp, err := trustyClient.Provenance(ctx, input) + errors <- err + provenance <- resp + }() + + // Beware of the magic number 4, which is the number of + // asynchronous calls fired in the previous lines. This must + // be kept in sync. + for i := 0; i < 4; i++ { + err := <-errors + if err != nil { + return nil, fmt.Errorf("Trusty call failed: %w", err) + } + } + respSummary := <-summary + respPkg := <-metadata + respAlternatives := <-alternatives + respProvenance := <-provenance + + res := makeTrustyReport(dep, + *respSummary, + *respPkg, + *respAlternatives, + *respProvenance, + ) + + return res, nil +} + +func makeTrustyReport( + dep *pbinternal.PrDependencies_ContextualDependency, + respSummary trustytypes.PackageSummaryAnnotation, + respPkg trustytypes.TrustyPackageData, + respAlternatives trustytypes.PackageAlternatives, + respProvenance trustytypes.Provenance, +) *trustyReport { + res := &trustyReport{ + PackageName: dep.Dep.Name, + PackageVersion: dep.Dep.Version, + PackageType: dep.Dep.Ecosystem.AsString(), + TrustyURL: makeTrustyURL(dep.Dep.Name, strings.ToLower(dep.Dep.Ecosystem.AsString())), + } + + addSummaryDetails(res, respSummary) + addMetadataDetails(res, respPkg) + + res.ScoreComponents = makeScoreComponents(respSummary.Description) + res.Alternatives = makeAlternatives(dep.Dep.Ecosystem.AsString(), respAlternatives.Packages) + + if respSummary.Description.Malicious { + res.Malicious = makeMaliciousDetails(respPkg.Malicious) + } + + res.Provenance = makeProvenance(respProvenance) + + return res +} + +func addSummaryDetails(res *trustyReport, resp trustytypes.PackageSummaryAnnotation) { + res.Score = resp.Score + res.ActivityScore = resp.Description.Activity + res.ProvenanceScore = resp.Description.Provenance +} + +func addMetadataDetails(res *trustyReport, resp trustytypes.TrustyPackageData) { + res.IsDeprecated = resp.IsDeprecated != nil && *resp.IsDeprecated + res.IsArchived = resp.Archived != nil && *resp.Archived +} + +func makeScoreComponents(resp trustytypes.SummaryDescription) []scoreComponent { + scoreComponents := make([]scoreComponent, 0) + + // activity scores + if resp.Activity != 0 { + scoreComponents = append(scoreComponents, scoreComponent{ + Label: "Package activity", + Value: resp.Activity, + }) } - return resp, nil + if resp.ActivityRepo != 0 { + scoreComponents = append(scoreComponents, scoreComponent{ + Label: "Repository activity", + Value: resp.ActivityRepo, + }) + } + if resp.ActivityUser != 0 { + scoreComponents = append(scoreComponents, scoreComponent{ + Label: "User activity", + Value: resp.ActivityUser, + }) + } + + // provenance information + if resp.ProvenanceType != nil { + scoreComponents = append(scoreComponents, scoreComponent{ + Label: "Provenance", + Value: string(*resp.ProvenanceType), + }) + } + + // typosquatting information + if resp.TypoSquatting != 0 && resp.TypoSquatting <= 5.0 { + scoreComponents = append(scoreComponents, scoreComponent{ + Label: "Typosquatting", + Value: "⚠️ Dependency may be trying to impersonate a well known package", + }) + } + + // Note: in the previous implementation based on Trusty v1 + // API, if new fields were added to the `"description"` field + // of a package they were implicitly added to the table of + // score components. + // + // This was possible because the `Description` field of the go + // struct was defined as `map[string]any`. + // + // This is not the case with v2 API, so we need to keep track + // of new measures being added to the API. + + return scoreComponents +} + +func makeAlternatives( + ecosystem string, + trustyAlternatives []*trustytypes.PackageBasicInfo, +) []alternative { + alternatives := []alternative{} + for _, alt := range trustyAlternatives { + alternatives = append(alternatives, alternative{ + PackageName: alt.PackageName, + PackageType: ecosystem, + Score: alt.Score, + TrustyURL: makeTrustyURL(alt.PackageName, ecosystem), + }) + } + + return alternatives +} + +func makeMaliciousDetails( + maliciousInfo *trustytypes.PackageMaliciousPayload, +) *malicious { + return &malicious{ + Summary: maliciousInfo.Summary, + Details: preprocessDetails(maliciousInfo.Details), + } +} + +func makeProvenance( + resp trustytypes.Provenance, +) *provenance { + prov := &provenance{} + if resp.Historical.Overlap != 0 { + prov.Historical = &historicalProvenance{ + Versions: int(resp.Historical.Versions), + Tags: int(resp.Historical.Tags), + Common: int(resp.Historical.Common), + Overlap: resp.Historical.Overlap, + } + } + + if resp.Sigstore.Issuer != "" { + prov.Sigstore = &sigstoreProvenance{ + SourceRepository: resp.Sigstore.SourceRepo, + Workflow: resp.Sigstore.Workflow, + Issuer: resp.Sigstore.Issuer, + RekorURI: resp.Sigstore.Transparency, + } + } + + return prov +} + +func makeTrustyURL(packageName string, ecosystem string) string { + trustyURL, _ := url.JoinPath( + constants.TrustyHttpURL, + "report", + strings.ToLower(ecosystem), + url.PathEscape(packageName)) + return trustyURL } // classifyDependency checks the dependencies from the PR for maliciousness or // low scores and adds them to the summary if needed func classifyDependency( - _ context.Context, logger *zerolog.Logger, resp *trustytypes.Reply, ruleConfig *config, - prSummary *summaryPrHandler, dep *pbinternal.PrDependencies_ContextualDependency, + _ context.Context, + logger *zerolog.Logger, + resp *trustyReport, + ruleConfig *config, + prSummary *summaryPrHandler, + dep *pbinternal.PrDependencies_ContextualDependency, ) { // Check all the policy violations reasons := []RuleViolationReason{} @@ -274,7 +548,7 @@ func classifyDependency( // If the package is malicious, ensure that the score is 0 to avoid it // getting ignored from the report - if resp.PackageData.Malicious != nil && resp.PackageData.Malicious.Summary != "" { + if resp.Malicious != nil && resp.Malicious.Summary != "" { logger.Debug(). Str("dependency", fmt.Sprintf("%s@%s", dep.Dep.Name, dep.Dep.Version)). Str("malicious", "true"). @@ -288,11 +562,11 @@ func classifyDependency( } // Note if the packages is deprecated or archived - if resp.PackageData.Deprecated || resp.PackageData.Archived { + if resp.IsDeprecated || resp.IsArchived { logger.Debug(). Str("dependency", fmt.Sprintf("%s@%s", dep.Dep.Name, dep.Dep.Version)). - Bool("deprecated", resp.PackageData.Deprecated). - Bool("archived", resp.PackageData.Archived). + Bool("deprecated", resp.IsDeprecated). + Bool("archived", resp.IsArchived). Msgf("deprecated dependency") if !ecoConfig.AllowDeprecated { @@ -303,26 +577,24 @@ func classifyDependency( } else { logger.Debug(). Str("dependency", fmt.Sprintf("%s@%s", dep.Dep.Name, dep.Dep.Version)). - Bool("deprecated", resp.PackageData.Deprecated). + Bool("deprecated", resp.IsDeprecated). Msgf("not deprecated dependency") } packageScore := float64(0) - if resp.Summary.Score != nil { - packageScore = *resp.Summary.Score + if resp.Score != nil { + packageScore = *resp.Score } - descr := readPackageDescription(resp) - if ecoConfig.Score > packageScore { reasons = append(reasons, TRUSTY_LOW_SCORE) } - if ecoConfig.Provenance > descr["provenance"].(float64) && descr["provenance"].(float64) > 0 { + if ecoConfig.Provenance > resp.ProvenanceScore && resp.ProvenanceScore > 0 { reasons = append(reasons, TRUSTY_LOW_PROVENANCE) } - if ecoConfig.Activity > descr["activity"].(float64) && descr["activity"].(float64) > 0 { + if ecoConfig.Activity > resp.ActivityScore && resp.ActivityScore > 0 { reasons = append(reasons, TRUSTY_LOW_ACTIVITY) } @@ -342,28 +614,7 @@ func classifyDependency( } else { logger.Debug(). Str("dependency", dep.Dep.Name). - Float64("score", *resp.Summary.Score). Float64("threshold", ecoConfig.Score). Msgf("dependency ok") } } - -// readPackageDescription reads the description from the package summary and -// normlizes the required values when missing from a partial Trusty response -func readPackageDescription(resp *trustytypes.Reply) map[string]any { - descr := map[string]any{} - if resp == nil { - resp = &trustytypes.Reply{} - } - if resp.Summary.Description != nil { - descr = resp.Summary.Description - } - - // Ensure don't panic checking all fields are there - for _, fld := range []string{"activity", "provenance"} { - if _, ok := descr[fld]; !ok || descr[fld] == nil { - descr[fld] = float64(0) - } - } - return descr -} diff --git a/internal/engine/eval/trusty/trusty_test.go b/internal/engine/eval/trusty/trusty_test.go index b9da915bc6..4f7b307c3a 100644 --- a/internal/engine/eval/trusty/trusty_test.go +++ b/internal/engine/eval/trusty/trusty_test.go @@ -8,10 +8,9 @@ import ( "fmt" "slices" "testing" - "time" "github.com/rs/zerolog" - trustytypes "github.com/stacklok/trusty-sdk-go/pkg/types" + trustytypes "github.com/stacklok/trusty-sdk-go/pkg/v2/types" "github.com/stretchr/testify/require" evalerrors "github.com/mindersec/minder/internal/engine/errors" @@ -26,7 +25,7 @@ import ( func TestBuildEvalResult(t *testing.T) { t.Parallel() sg := float64(6.4) - now := time.Now() + for _, tc := range []struct { name string sut *summaryPrHandler @@ -42,23 +41,14 @@ func TestBuildEvalResult(t *testing.T) { Name: "requests", Version: "0.0.1", }, - trustyReply: &trustytypes.Reply{ - PackageName: "requests", - PackageType: pbinternal.DepEcosystem_DEP_ECOSYSTEM_PYPI.AsString(), - Summary: trustytypes.ScoreSummary{ - Score: &sg, - }, - PackageData: struct { - Archived bool `json:"archived"` - Deprecated bool `json:"is_deprecated"` - Malicious *trustytypes.MaliciousData `json:"malicious"` - }{ - Archived: false, - Deprecated: false, - Malicious: &trustytypes.MaliciousData{ - Summary: "malicuous", - Published: &now, - }, + trustyReply: &trustyReport{ + PackageName: "requests", + PackageType: pbinternal.DepEcosystem_DEP_ECOSYSTEM_PYPI.AsString(), + Score: &sg, + IsArchived: false, + IsDeprecated: false, + Malicious: &malicious{ + Summary: "malicuous", }, }, }, @@ -72,12 +62,10 @@ func TestBuildEvalResult(t *testing.T) { Name: "requests", Version: "0.0.1", }, - trustyReply: &trustytypes.Reply{ + trustyReply: &trustyReport{ PackageName: "requests", PackageType: pbinternal.DepEcosystem_DEP_ECOSYSTEM_PYPI.AsString(), - Summary: trustytypes.ScoreSummary{ - Score: &sg, - }, + Score: &sg, }, }, }, @@ -90,12 +78,10 @@ func TestBuildEvalResult(t *testing.T) { Name: "python-oauth", Version: "0.0.1", }, - trustyReply: &trustytypes.Reply{ + trustyReply: &trustyReport{ PackageName: "requests", PackageType: pbinternal.DepEcosystem_DEP_ECOSYSTEM_PYPI.AsString(), - Summary: trustytypes.ScoreSummary{ - Score: &sg, - }, + Score: &sg, }, }, { @@ -104,23 +90,14 @@ func TestBuildEvalResult(t *testing.T) { Name: "requestts", Version: "0.0.1", }, - trustyReply: &trustytypes.Reply{ - PackageName: "requests", - PackageType: pbinternal.DepEcosystem_DEP_ECOSYSTEM_PYPI.AsString(), - Summary: trustytypes.ScoreSummary{ - Score: &sg, - }, - PackageData: struct { - Archived bool `json:"archived"` - Deprecated bool `json:"is_deprecated"` - Malicious *trustytypes.MaliciousData `json:"malicious"` - }{ - Archived: false, - Deprecated: false, - Malicious: &trustytypes.MaliciousData{ - Summary: "malicuous", - Published: &now, - }, + trustyReply: &trustyReport{ + PackageName: "requests", + PackageType: pbinternal.DepEcosystem_DEP_ECOSYSTEM_PYPI.AsString(), + Score: &sg, + IsArchived: false, + IsDeprecated: false, + Malicious: &malicious{ + Summary: "malicuous", }, }, }, @@ -245,19 +222,17 @@ func TestClassifyDependency(t *testing.T) { } for _, tc := range []struct { name string - score *trustytypes.Reply + score *trustyReport config *config mustFilter bool expected *dependencyAlternatives }{ { name: "normal-good-score", - score: &trustytypes.Reply{ + score: &trustyReport{ PackageName: "test", PackageType: "npm", - Summary: trustytypes.ScoreSummary{ - Score: mkfloat(6.4), - }, + Score: mkfloat(6.4), }, config: defaultConfig(), expected: &dependencyAlternatives{ @@ -267,91 +242,75 @@ func TestClassifyDependency(t *testing.T) { }, { name: "normal-bad-score", - score: &trustytypes.Reply{ + score: &trustyReport{ PackageName: "test", PackageType: "npm", - Summary: trustytypes.ScoreSummary{ - Score: mkfloat(4.0), - }, + Score: mkfloat(4.0), }, config: defaultConfig(), expected: &dependencyAlternatives{ Reasons: []RuleViolationReason{TRUSTY_LOW_SCORE}, - trustyReply: &trustytypes.Reply{}, + trustyReply: &trustyReport{}, }, mustFilter: true, }, { name: "normal-malicious", - score: &trustytypes.Reply{ - PackageName: "test", - PackageType: "npm", - Summary: trustytypes.ScoreSummary{Score: mkfloat(8.0)}, - PackageData: trustytypes.PackageData{ - Archived: false, - Deprecated: false, - Malicious: &trustytypes.MaliciousData{ - Summary: "it is malicious", - Details: "some details", - }, + score: &trustyReport{ + PackageName: "test", + PackageType: "npm", + Score: mkfloat(8.0), + IsArchived: false, + IsDeprecated: false, + Malicious: &malicious{ + Summary: "it is malicious", + Details: "some details", }, }, config: defaultConfig(), expected: &dependencyAlternatives{ Reasons: []RuleViolationReason{TRUSTY_MALICIOUS_PKG}, - trustyReply: &trustytypes.Reply{}, + trustyReply: &trustyReport{}, }, mustFilter: true, }, { name: "normal-lowactivity", - score: &trustytypes.Reply{ - PackageName: "test", - PackageType: "npm", - Summary: trustytypes.ScoreSummary{ - Score: mkfloat(8.0), - Description: map[string]any{ - "activity": float64(3.0), - }, - }, + score: &trustyReport{ + PackageName: "test", + PackageType: "npm", + Score: mkfloat(8.0), + ActivityScore: float64(3.0), }, config: defaultConfig(), expected: &dependencyAlternatives{ Reasons: []RuleViolationReason{TRUSTY_LOW_ACTIVITY}, - trustyReply: &trustytypes.Reply{}, + trustyReply: &trustyReport{}, }, mustFilter: true, }, { name: "normal-low-provenance", - score: &trustytypes.Reply{ - PackageName: "test", - PackageType: "npm", - Summary: trustytypes.ScoreSummary{ - Score: mkfloat(8.0), - Description: map[string]any{ - "provenance": float64(3.0), - }, - }, + score: &trustyReport{ + PackageName: "test", + PackageType: "npm", + Score: mkfloat(8.0), + ProvenanceScore: float64(3.0), }, config: defaultConfig(), expected: &dependencyAlternatives{ Reasons: []RuleViolationReason{TRUSTY_LOW_PROVENANCE}, - trustyReply: &trustytypes.Reply{}, + trustyReply: &trustyReport{}, }, mustFilter: true, }, { name: "nil-activity", - score: &trustytypes.Reply{ - PackageName: "test", - PackageType: "npm", - Summary: trustytypes.ScoreSummary{ - Score: mkfloat(8.0), - Description: map[string]any{ - "provenance": nil, - }, - }, + score: &trustyReport{ + PackageName: "test", + PackageType: "npm", + Score: mkfloat(8.0), + ProvenanceScore: float64(0.0), }, config: defaultConfig(), expected: &dependencyAlternatives{ @@ -381,98 +340,46 @@ func TestClassifyDependency(t *testing.T) { } } -func TestBuildScoreMatrix(t *testing.T) { +func TestMakeScoreComponents(t *testing.T) { t.Parallel() + typ := trustytypes.ProvenanceTypeVerified for _, tc := range []struct { name string - sut dependencyAlternatives - expected []templateScoreComponent + sut trustytypes.SummaryDescription + expected []scoreComponent }{ { name: "no-description", - sut: dependencyAlternatives{ - Dependency: &pbinternal.Dependency{}, - Reasons: []RuleViolationReason{}, - trustyReply: &trustytypes.Reply{ - Summary: trustytypes.ScoreSummary{}, - }, - }, + sut: trustytypes.SummaryDescription{}, }, { name: "normal-response", - sut: dependencyAlternatives{ - Dependency: &pbinternal.Dependency{}, - Reasons: []RuleViolationReason{}, - trustyReply: &trustytypes.Reply{ - Summary: trustytypes.ScoreSummary{ - Description: map[string]any{ - "activity": "a", - "activity_user": "b", - "provenance": "c", - "activity_repo": "d", - }, - }, - }, + sut: trustytypes.SummaryDescription{ + Activity: 1.0, + ActivityUser: 2.0, + ActivityRepo: 3.0, + ProvenanceType: &typ, }, - expected: []templateScoreComponent{ - {Label: "Package activity", Value: "a"}, - {Label: "User activity", Value: "b"}, - {Label: "Provenance", Value: "c"}, - {Label: "Repository activity", Value: "d"}, - }, - }, - { - name: "normal-response", - sut: dependencyAlternatives{ - Dependency: &pbinternal.Dependency{}, - Reasons: []RuleViolationReason{}, - trustyReply: &trustytypes.Reply{ - Summary: trustytypes.ScoreSummary{ - Description: map[string]any{ - "activity": "a", - "activity_user": "b", - "provenance": "c", - "activity_repo": "d", - }, - }, - }, - }, - expected: []templateScoreComponent{ - {Label: "Package activity", Value: "a"}, - {Label: "User activity", Value: "b"}, - {Label: "Provenance", Value: "c"}, - {Label: "Repository activity", Value: "d"}, + expected: []scoreComponent{ + {Label: "Package activity", Value: 1.0}, + {Label: "User activity", Value: 2.0}, + {Label: "Repository activity", Value: 3.0}, + {Label: "Provenance", Value: "verified_provenance_match"}, }, }, { name: "typosquatting-low", - sut: dependencyAlternatives{ - Dependency: &pbinternal.Dependency{}, - Reasons: []RuleViolationReason{}, - trustyReply: &trustytypes.Reply{ - Summary: trustytypes.ScoreSummary{ - Description: map[string]any{ - "typosquatting": float64(10), - }, - }, - }, + sut: trustytypes.SummaryDescription{ + TypoSquatting: 10.0, }, - expected: []templateScoreComponent{}, + expected: []scoreComponent{}, }, { name: "typosquatting-high", - sut: dependencyAlternatives{ - Dependency: &pbinternal.Dependency{}, - Reasons: []RuleViolationReason{}, - trustyReply: &trustytypes.Reply{ - Summary: trustytypes.ScoreSummary{ - Description: map[string]any{ - "typosquatting": float64(1), - }, - }, - }, + sut: trustytypes.SummaryDescription{ + TypoSquatting: 1, }, - expected: []templateScoreComponent{ + expected: []scoreComponent{ {Label: "Typosquatting", Value: "⚠️ Dependency may be trying to impersonate a well known package"}, }, }, @@ -480,7 +387,7 @@ func TestBuildScoreMatrix(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() - scoreMatrix := buildScoreMatrix(tc.sut) + scoreMatrix := makeScoreComponents(tc.sut) require.Len(t, scoreMatrix, len(tc.expected)) if len(tc.expected) == 0 { return @@ -492,45 +399,6 @@ func TestBuildScoreMatrix(t *testing.T) { } } -func TestReadPackageDescription(t *testing.T) { - t.Parallel() - for _, tc := range []struct { - name string - sut *trustytypes.Reply - }{ - { - name: "normal", - sut: &trustytypes.Reply{}, - }, - { - name: "no-provenance", - sut: &trustytypes.Reply{ - Summary: trustytypes.ScoreSummary{ - Description: map[string]any{ - "provenance": 1, - }, - }, - }, - }, - { - name: "nil-response", - sut: nil, - }, - } { - tc := tc - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - data := readPackageDescription(tc.sut) - require.NotNil(t, data) - require.NotNil(t, data) - _, ok := data["provenance"] - require.True(t, ok) - _, ok = data["activity"] - require.True(t, ok) - }) - } -} - func TestEvaluationDetailRendering(t *testing.T) { t.Parallel() diff --git a/internal/engine/eval/vulncheck/actions.go b/internal/engine/eval/vulncheck/actions.go index cac5da4cb2..2cda6c06ac 100644 --- a/internal/engine/eval/vulncheck/actions.go +++ b/internal/engine/eval/vulncheck/actions.go @@ -12,7 +12,6 @@ import ( "github.com/mindersec/minder/internal/engine/eval/pr_actions" pbinternal "github.com/mindersec/minder/internal/proto" - pb "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" provifv1 "github.com/mindersec/minder/pkg/providers/v1" ) @@ -29,7 +28,7 @@ type prStatusHandler interface { func newPrStatusHandler( ctx context.Context, action pr_actions.Action, - pr *pb.PullRequest, + pr *pbinternal.PullRequest, client provifv1.GitHub, ) (prStatusHandler, error) { switch action { diff --git a/internal/engine/eval/vulncheck/review.go b/internal/engine/eval/vulncheck/review.go index 0427ff438f..85691b1cc7 100644 --- a/internal/engine/eval/vulncheck/review.go +++ b/internal/engine/eval/vulncheck/review.go @@ -17,7 +17,6 @@ import ( "github.com/rs/zerolog" pbinternal "github.com/mindersec/minder/internal/proto" - pb "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" provifv1 "github.com/mindersec/minder/pkg/providers/v1" ) @@ -105,7 +104,7 @@ func reviewBodyWithSuggestion(comment string) string { type reviewPrHandler struct { cli provifv1.GitHub - pr *pb.PullRequest + pr *pbinternal.PullRequest trackedDeps []dependencyVulnerabilities @@ -131,7 +130,7 @@ func withVulnsFoundReviewStatus(status *string) reviewPrHandlerOption { func newReviewPrHandler( ctx context.Context, - pr *pb.PullRequest, + pr *pbinternal.PullRequest, cli provifv1.GitHub, opts ...reviewPrHandlerOption, ) (*reviewPrHandler, error) { @@ -469,7 +468,7 @@ type commitStatusPrHandler struct { func newCommitStatusPrHandler( ctx context.Context, - pr *pb.PullRequest, + pr *pbinternal.PullRequest, client provifv1.GitHub, ) (prStatusHandler, error) { // create a reviewPrHandler and embed it in the commitStatusPrHandler @@ -531,7 +530,7 @@ func (csh *commitStatusPrHandler) setCommitStatus( // summaryPrHandler is a prStatusHandler that adds a summary text to the PR as a comment. type summaryPrHandler struct { cli provifv1.GitHub - pr *pb.PullRequest + pr *pbinternal.PullRequest logger zerolog.Logger trackedDeps []dependencyVulnerabilities @@ -577,7 +576,7 @@ func (sph *summaryPrHandler) submit(ctx context.Context) error { func newSummaryPrHandler( ctx context.Context, - pr *pb.PullRequest, + pr *pbinternal.PullRequest, cli provifv1.GitHub, ) *summaryPrHandler { logger := zerolog.Ctx(ctx).With(). diff --git a/internal/engine/eval/vulncheck/review_test.go b/internal/engine/eval/vulncheck/review_test.go index c0baf37c60..8421b1360e 100644 --- a/internal/engine/eval/vulncheck/review_test.go +++ b/internal/engine/eval/vulncheck/review_test.go @@ -20,7 +20,6 @@ import ( pbinternal "github.com/mindersec/minder/internal/proto" mock_ghclient "github.com/mindersec/minder/internal/providers/github/mock" - pb "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" ) const ( @@ -41,7 +40,7 @@ func TestReviewPrHandlerNoVulnerabilities(t *testing.T) { defer ctrl.Finish() mockClient := mock_ghclient.NewMockGitHub(ctrl) - pr := &pb.PullRequest{ + pr := &pbinternal.PullRequest{ Url: "https://api.github.com/repos/jakubtestorg/bad-npm/pulls/43", CommitSha: commitSHA, Number: 43, @@ -80,7 +79,7 @@ func TestReviewPrHandlerVulnerabilitiesDifferentIdentities(t *testing.T) { defer ctrl.Finish() mockClient := mock_ghclient.NewMockGitHub(ctrl) - pr := &pb.PullRequest{ + pr := &pbinternal.PullRequest{ Url: "https://api.github.com/repos/jakubtestorg/bad-npm/pulls/43", CommitSha: commitSHA, Number: 43, @@ -189,7 +188,7 @@ func TestReviewPrHandlerVulnerabilitiesErrLookUpPackage(t *testing.T) { defer ctrl.Finish() mockClient := mock_ghclient.NewMockGitHub(ctrl) - pr := &pb.PullRequest{ + pr := &pbinternal.PullRequest{ Url: "https://api.github.com/repos/jakubtestorg/bad-npm/pulls/43", CommitSha: commitSHA, Number: 43, @@ -283,7 +282,7 @@ func TestReviewPrHandlerVulnerabilitiesWithNoPatchVersion(t *testing.T) { defer ctrl.Finish() mockClient := mock_ghclient.NewMockGitHub(ctrl) - pr := &pb.PullRequest{ + pr := &pbinternal.PullRequest{ Url: "https://api.github.com/repos/jakubtestorg/bad-npm/pulls/43", CommitSha: commitSHA, Number: 43, @@ -383,7 +382,7 @@ func TestReviewPrHandlerVulnerabilitiesDismissReview(t *testing.T) { defer ctrl.Finish() mockClient := mock_ghclient.NewMockGitHub(ctrl) - pr := &pb.PullRequest{ + pr := &pbinternal.PullRequest{ Url: "https://api.github.com/repos/jakubtestorg/bad-npm/pulls/43", CommitSha: commitSHA, Number: 43, @@ -497,7 +496,7 @@ func TestCommitStatusHandlerNoVulnerabilities(t *testing.T) { defer ctrl.Finish() mockClient := mock_ghclient.NewMockGitHub(ctrl) - pr := &pb.PullRequest{ + pr := &pbinternal.PullRequest{ Url: "https://api.github.com/repos/jakubtestorg/bad-npm/pulls/43", CommitSha: commitSHA, Number: 43, @@ -542,7 +541,7 @@ func TestCommitStatusPrHandlerWithVulnerabilities(t *testing.T) { defer ctrl.Finish() mockClient := mock_ghclient.NewMockGitHub(ctrl) - pr := &pb.PullRequest{ + pr := &pbinternal.PullRequest{ Url: "https://api.github.com/repos/jakubtestorg/bad-npm/pulls/43", CommitSha: commitSHA, Number: 43, @@ -658,7 +657,7 @@ func TestReviewPrHandlerReviewPriorReview(t *testing.T) { defer ctrl.Finish() mockClient := mock_ghclient.NewMockGitHub(ctrl) - pr := &pb.PullRequest{ + pr := &pbinternal.PullRequest{ Url: "https://api.github.com/repos/jakubtestorg/bad-npm/pulls/43", CommitSha: commitSHA, Number: 43, @@ -705,7 +704,7 @@ func TestReviewPrHandlerVulnerabilitiesAndNoPriorReview(t *testing.T) { defer ctrl.Finish() mockClient := mock_ghclient.NewMockGitHub(ctrl) - pr := &pb.PullRequest{ + pr := &pbinternal.PullRequest{ Url: "https://api.github.com/repos/jakubtestorg/bad-npm/pulls/43", CommitSha: commitSHA, Number: 43, @@ -749,7 +748,7 @@ func TestReviewPrHandlerReviewAlreadyExistsOnSHA(t *testing.T) { defer ctrl.Finish() mockClient := mock_ghclient.NewMockGitHub(ctrl) - pr := &pb.PullRequest{ + pr := &pbinternal.PullRequest{ Url: "https://api.github.com/repos/jakubtestorg/bad-npm/pulls/43", CommitSha: commitSHA, Number: 43, diff --git a/internal/engine/eval/vulncheck/vulncheck.go b/internal/engine/eval/vulncheck/vulncheck.go index 2aeb637755..d31d09debe 100644 --- a/internal/engine/eval/vulncheck/vulncheck.go +++ b/internal/engine/eval/vulncheck/vulncheck.go @@ -72,15 +72,15 @@ func (e *Evaluator) Eval( pol map[string]any, _ protoreflect.ProtoMessage, res *interfaces.Result, -) error { +) (*interfaces.EvaluationResult, error) { vulnerablePackages, err := e.getVulnerableDependencies(ctx, pol, res) if err != nil { - return err + return nil, err } if len(vulnerablePackages) > 0 { if e.featureFlags != nil && flags.Bool(ctx, e.featureFlags, flags.VulnCheckErrorTemplate) { - return evalerrors.NewDetailedErrEvaluationFailed( + return nil, evalerrors.NewDetailedErrEvaluationFailed( templates.VulncheckTemplate, map[string]any{"packages": vulnerablePackages}, "vulnerable packages: %s", @@ -88,13 +88,13 @@ func (e *Evaluator) Eval( ) } - return evalerrors.NewErrEvaluationFailed( + return nil, evalerrors.NewErrEvaluationFailed( "vulnerable packages: %s", strings.Join(vulnerablePackages, ","), ) } - return nil + return &interfaces.EvaluationResult{}, nil } // getVulnerableDependencies returns a slice containing vulnerable dependencies. diff --git a/internal/engine/executor.go b/internal/engine/executor.go index d2b8d68c4e..34c6b73f19 100644 --- a/internal/engine/executor.go +++ b/internal/engine/executor.go @@ -12,6 +12,7 @@ import ( "github.com/open-feature/go-sdk/openfeature" "github.com/rs/zerolog" + datasourceservice "github.com/mindersec/minder/internal/datasources/service" "github.com/mindersec/minder/internal/db" "github.com/mindersec/minder/internal/engine/actions" "github.com/mindersec/minder/internal/engine/actions/alert" @@ -29,6 +30,7 @@ import ( provsel "github.com/mindersec/minder/internal/providers/selectors" pb "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" "github.com/mindersec/minder/pkg/engine/selectors" + "github.com/mindersec/minder/pkg/engine/v1/interfaces" "github.com/mindersec/minder/pkg/profiles" "github.com/mindersec/minder/pkg/profiles/models" provinfv1 "github.com/mindersec/minder/pkg/providers/v1" @@ -112,6 +114,8 @@ func (e *executor) EvalEntityEvent(ctx context.Context, inf *entities.EntityInfo defer e.releaseLockAndFlush(ctx, inf) + dssvc := datasourceservice.NewDataSourceService(e.querier) + entityType := entities.EntityTypeToDB(inf.Type) // Load all the relevant rule type engines for this entity ruleEngineCache, err := rtengine.NewRuleEngineCache( @@ -120,7 +124,9 @@ func (e *executor) EvalEntityEvent(ctx context.Context, inf *entities.EntityInfo entityType, inf.ProjectID, provider, + e.featureFlags, ingestCache, + dssvc, eoptions.WithFlagsClient(e.featureFlags), ) if err != nil { @@ -179,13 +185,12 @@ func (e *executor) evaluateRule( return fmt.Errorf("cannot create rule actions engine: %w", err) } - evalParams.SetActionsOnOff(actionEngine.GetOnOffState()) - // Update the lock lease at the end of the evaluation defer e.updateLockLease(ctx, *inf.ExecutionID, evalParams) // Evaluate the rule var evalErr error + var result *interfaces.EvaluationResult if profileEvalStatus != nil { evalErr = profileEvalStatus } else { @@ -194,8 +199,8 @@ func (e *executor) evaluateRule( Str("entity_type", inf.Type.ToString()). Str("execution_id", inf.ExecutionID.String()). Logger().WithContext(ctx) - evalErr = ruleEngine.Eval(ctx, inf.Entity, evalParams.GetRule().Def, evalParams.GetRule().Params, evalParams) - + result, evalErr = ruleEngine.Eval(ctx, inf.Entity, evalParams.GetRule().Def, evalParams.GetRule().Params, evalParams) + evalParams.SetEvalResult(result) } evalParams.SetEvalErr(evalErr) diff --git a/internal/engine/ingester/deps/deps.go b/internal/engine/ingester/deps/deps.go new file mode 100644 index 0000000000..7ab05e46b1 --- /dev/null +++ b/internal/engine/ingester/deps/deps.go @@ -0,0 +1,322 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package deps provides the deps rule data ingest engine +package deps + +import ( + "cmp" + "context" + "errors" + "fmt" + "slices" + + "github.com/go-git/go-billy/v5/helper/iofs" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-viper/mapstructure/v2" + "github.com/protobom/protobom/pkg/sbom" + "github.com/rs/zerolog" + "google.golang.org/protobuf/reflect/protoreflect" + + mdeps "github.com/mindersec/minder/internal/deps" + "github.com/mindersec/minder/internal/deps/scalibr" + engerrors "github.com/mindersec/minder/internal/engine/errors" + pbinternal "github.com/mindersec/minder/internal/proto" + pb "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + "github.com/mindersec/minder/pkg/engine/v1/interfaces" + "github.com/mindersec/minder/pkg/entities/v1/checkpoints" + provifv1 "github.com/mindersec/minder/pkg/providers/v1" +) + +const ( + // DepsRuleDataIngestType is the type of the deps rule data ingest engine + DepsRuleDataIngestType = "deps" + defaultBranch = "main" +) + +// Deps is the engine for a rule type that uses deps data ingest +type Deps struct { + cfg *pb.DepsType + gitprov provifv1.Git + extractor mdeps.Extractor +} + +// RepoConfig is the set of parameters to the deps rule data ingest engine for repositories +type RepoConfig struct { + Branch string `json:"branch" yaml:"branch" mapstructure:"branch"` +} + +// PullRequestConfig is the set of parameters to the deps rule data ingest engine for pull requests +type PullRequestConfig struct { + Filter string `json:"filter" yaml:"filter" mapstructure:"filter"` +} + +const ( + // PullRequestIngestTypeNew is a filter that exposes only new dependencies in the pull request + PullRequestIngestTypeNew = "new" + // PullRequestIngestTypeNewAndUpdated is a filter that exposes new and updated + // dependencies in the pull request + PullRequestIngestTypeNewAndUpdated = "new_and_updated" + // PullRequestIngestTypeAll is a filter that exposes all dependencies in the pull request + PullRequestIngestTypeAll = "all" +) + +// NewDepsIngester creates a new deps rule data ingest engine +func NewDepsIngester(cfg *pb.DepsType, gitprov provifv1.Git) (*Deps, error) { + if gitprov == nil { + return nil, fmt.Errorf("provider is nil") + } + + if cfg == nil { + cfg = &pb.DepsType{} + } + + return &Deps{ + cfg: cfg, + gitprov: gitprov, + extractor: scalibr.NewExtractor(), + }, nil +} + +// GetType returns the type of the git rule data ingest engine +func (*Deps) GetType() string { + return DepsRuleDataIngestType +} + +// GetConfig returns the config for the git rule data ingest engine +func (gi *Deps) GetConfig() protoreflect.ProtoMessage { + return gi.cfg +} + +// Ingest does the actual data ingestion for a rule type by cloning a git repo, +// and scanning it for dependencies with a dependency extractor +func (gi *Deps) Ingest(ctx context.Context, ent protoreflect.ProtoMessage, params map[string]any) (*interfaces.Result, error) { + switch entity := ent.(type) { + case *pb.Repository: + return gi.ingestRepository(ctx, entity, params) + case *pbinternal.PullRequest: + return gi.ingestPullRequest(ctx, entity, params) + default: + return nil, fmt.Errorf("deps is only supported for repositories and pull requests") + } +} + +func (gi *Deps) ingestRepository(ctx context.Context, repo *pb.Repository, params map[string]any) (*interfaces.Result, error) { + var logger = zerolog.Ctx(ctx) + // the branch is left unset since we want to auto-discover it + // in case it's not explicitly set + userCfg := &RepoConfig{} + if err := mapstructure.Decode(params, userCfg); err != nil { + return nil, fmt.Errorf("failed to read dependency ingester configuration from params: %w", err) + } + + if repo.GetCloneUrl() == "" { + return nil, fmt.Errorf("could not get clone url") + } + + branch := gi.getBranch(repo, userCfg.Branch) + logger.Info().Interface("repo", repo).Msgf("extracting dependencies from %s#%s", repo.GetCloneUrl(), branch) + + deps, head, err := gi.scanFromUrl(ctx, repo.GetCloneUrl(), branch) + if err != nil { + return nil, fmt.Errorf("could not scan filesystem: %w", err) + } + + logger.Debug().Interface("deps", deps).Msgf("Scanning successful: %d nodes found", len(deps.Nodes)) + + hsh := head.Hash() + + chkpoint := checkpoints.NewCheckpointV1Now(). + WithBranch(branch). + WithCommitHash(hsh.String()) + + return &interfaces.Result{ + Object: map[string]any{ + "node_list": deps, + }, + Checkpoint: chkpoint, + }, nil +} + +func (gi *Deps) getBranch(repo *pb.Repository, userConfigBranch string) string { + // If the user has specified a branch, use that + if userConfigBranch != "" { + return userConfigBranch + } + + // If the branch is provided in the rule-type + // configuration, use that + if gi.cfg.GetRepo().GetBranch() != "" { + return gi.cfg.GetRepo().GetBranch() + } + if repo.GetDefaultBranch() != "" { + return repo.GetDefaultBranch() + } + + // If the branch is not provided in the rule-type + // configuration, use the default branch + return defaultBranch +} + +// ingestTypes returns a sorter function for the given filter type. +// items which compare equal are skipped in output. +var ingestTypes = map[string]func(*sbom.Node, *sbom.Node) int{ + PullRequestIngestTypeNew: func(base *sbom.Node, updated *sbom.Node) int { + return cmp.Compare(base.GetName(), updated.GetName()) + }, + PullRequestIngestTypeNewAndUpdated: func(base *sbom.Node, updated *sbom.Node) int { + return nodeSorter(base, updated) + }, + PullRequestIngestTypeAll: func(_ *sbom.Node, _ *sbom.Node) int { + return -1 + }, +} + +func nodeSorter(a *sbom.Node, b *sbom.Node) int { + // If we compare by name and version first, we can avoid computing map keys. + res := cmp.Or(cmp.Compare(a.GetName(), b.GetName()), + cmp.Compare(a.GetVersion(), b.GetVersion())) + if res != 0 { + return res + } + // Same name and version, compare hashes. Go's shuffling map keys does not help here. + aHashes := make([]int32, 0, len(a.GetHashes())) + for algo := range a.GetHashes() { + aHashes = append(aHashes, algo) + } + slices.Sort(aHashes) + bHashes := make([]int32, 0, len(b.GetHashes())) + for algo := range b.GetHashes() { + bHashes = append(bHashes, algo) + } + slices.Sort(bHashes) + for i, algo := range aHashes { + if i >= len(bHashes) { + return 1 + } + if r := cmp.Compare(algo, bHashes[i]); r != 0 { + return r + } + if r := cmp.Compare(a.GetHashes()[algo], b.GetHashes()[algo]); r != 0 { + return r + } + } + if len(aHashes) < len(bHashes) { + return -1 + } + return 0 +} + +func filterNodes(base []*sbom.Node, updated []*sbom.Node, compare func(*sbom.Node, *sbom.Node) int) []*sbom.Node { + slices.SortFunc(base, nodeSorter) + slices.SortFunc(updated, nodeSorter) + + ret := make([]*sbom.Node, 0, len(updated)) + + baseIdx, newIdx := 0, 0 + for baseIdx < len(base) && newIdx < len(updated) { + cmpResult := compare(base[baseIdx], updated[newIdx]) + if cmpResult < 0 { + baseIdx++ + } else if cmpResult > 0 { + ret = append(ret, updated[newIdx]) + newIdx++ + } else { + newIdx++ + } + } + if newIdx < len(updated) { + ret = append(ret, updated[newIdx:]...) + } + return ret +} + +func (gi *Deps) ingestPullRequest( + ctx context.Context, pr *pbinternal.PullRequest, params map[string]any) (*interfaces.Result, error) { + userCfg := &PullRequestConfig{ + // We default to new_and_updated for user convenience. + Filter: PullRequestIngestTypeNewAndUpdated, + } + if err := mapstructure.Decode(params, userCfg); err != nil { + return nil, fmt.Errorf("failed to read dependency ingester configuration from params: %w", err) + } + + // Enforce that the filter is valid if left empty. + if userCfg.Filter == "" { + userCfg.Filter = PullRequestIngestTypeNewAndUpdated + } + + // At this point the user really set a wrong configuration. So, let's error out. + if _, ok := ingestTypes[userCfg.Filter]; !ok { + return nil, fmt.Errorf("invalid filter type: %s", userCfg.Filter) + } + + if pr.GetBaseCloneUrl() == "" { + return nil, errors.New("could not get base clone url") + } + if pr.GetTargetCloneUrl() == "" { + return nil, errors.New("could not get head clone url") + } + baseDeps, _, err := gi.scanFromUrl(ctx, pr.GetBaseCloneUrl(), pr.GetBaseRef()) + if err != nil { + return nil, fmt.Errorf("could not scan base filesystem: %w", err) + } + targetDeps, ref, err := gi.scanFromUrl(ctx, pr.GetTargetCloneUrl(), pr.GetTargetRef()) + if err != nil { + return nil, fmt.Errorf("could not scan target filesystem: %w", err) + } + + // Overwrite the target list of nodes with the result of filtering by desired match. + // We checked that the filter is valid at the top of the function. + targetDeps.Nodes = filterNodes(baseDeps.GetNodes(), targetDeps.GetNodes(), ingestTypes[userCfg.Filter]) + + chkpoint := checkpoints.NewCheckpointV1Now(). + WithBranch(pr.GetTargetRef()). + WithCommitHash(ref.Hash().String()) + + return &interfaces.Result{ + Object: map[string]any{ + "node_list": targetDeps, + }, + Checkpoint: chkpoint, + }, nil +} + +// TODO: this first part is fairly shared with fetchClone from ../git/git.go. +func (gi *Deps) scanFromUrl(ctx context.Context, url string, branch string) (*sbom.NodeList, *plumbing.Reference, error) { + // We clone to the memfs go-billy filesystem driver, which doesn't + // allow for direct access to the underlying filesystem. This is + // because we want to be able to run this in a sandboxed environment + // where we don't have access to the underlying filesystem. + repo, err := gi.gitprov.Clone(ctx, url, branch) + if err != nil { + if errors.Is(err, provifv1.ErrProviderGitBranchNotFound) { + return nil, nil, fmt.Errorf("%w: %s: branch %s", engerrors.ErrEvaluationFailed, + provifv1.ErrProviderGitBranchNotFound, branch) + } else if errors.Is(err, provifv1.ErrRepositoryEmpty) { + return nil, nil, fmt.Errorf("%w: %s", engerrors.ErrEvaluationSkipped, provifv1.ErrRepositoryEmpty) + } + return nil, nil, err + } + + wt, err := repo.Worktree() + if err != nil { + return nil, nil, fmt.Errorf("could not get worktree: %w", err) + } + + if wt.Filesystem == nil { + return nil, nil, fmt.Errorf("could not get filesystem") + } + + deps, err := gi.extractor.ScanFilesystem(ctx, iofs.New(wt.Filesystem)) + if err != nil { + return nil, nil, fmt.Errorf("%T extractor: %w", gi.extractor, err) + } + + ref, err := repo.Head() + if err != nil { + return nil, nil, fmt.Errorf("could not get head: %w", err) + } + + return deps, ref, nil +} diff --git a/internal/engine/ingester/deps/deps_test.go b/internal/engine/ingester/deps/deps_test.go new file mode 100644 index 0000000000..b33fa4428f --- /dev/null +++ b/internal/engine/ingester/deps/deps_test.go @@ -0,0 +1,539 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package deps + +import ( + "context" + "path/filepath" + "testing" + + "github.com/go-git/go-billy/v5/osfs" + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/storage/memory" + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/protobom/protobom/pkg/sbom" + "github.com/stretchr/testify/require" + "go.uber.org/mock/gomock" + "google.golang.org/protobuf/encoding/prototext" + + mock_github "github.com/mindersec/minder/internal/providers/github/mock" + v1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" +) + +func TestGetBranch(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + name string + repo *v1.Repository + branch string + configBranch string + expect string + }{ + {name: "default", expect: "main"}, + {name: "branch", branch: "test1", expect: "test1"}, + {name: "repo-default", repo: &v1.Repository{DefaultBranch: "defaultBranch"}, expect: "defaultBranch"}, + {name: "repo-default", configBranch: "ingestBranch", expect: "ingestBranch"}, + } { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + gi, err := NewDepsIngester(&v1.DepsType{ + EntityType: &v1.DepsType_Repo{ + Repo: &v1.DepsType_RepoConfigs{ + Branch: tc.configBranch, + }, + }, + }, &mock_github.MockGit{}) + require.NoError(t, err) + + branch := gi.getBranch(tc.repo, tc.branch) + require.Equal(t, tc.expect, branch) + }) + } +} + +func TestSBOMNodeDiff(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + name string + op string + base []*sbom.Node + target []*sbom.Node + expect []*sbom.Node + }{{ + name: "nil", + op: "new", + expect: []*sbom.Node{}, + }, { + name: "nil + all", + op: "all", + expect: []*sbom.Node{}, + }, { + name: "equal, new", + op: "new", + base: []*sbom.Node{ + {Id: "1", Name: "pandas", Version: "2.2.3"}, + {Id: "2", Name: "fastapi", Version: "0.115.6"}, + }, + target: []*sbom.Node{ + {Id: "1", Name: "pandas", Version: "2.2.3"}, + {Id: "2", Name: "fastapi", Version: "0.115.6"}, + }, + expect: []*sbom.Node{}, + }, { + name: "equal, all", + op: "all", + base: []*sbom.Node{ + {Id: "1", Name: "pandas", Version: "2.2.3"}, + {Id: "2", Name: "fastapi", Version: "0.115.6"}, + }, + target: []*sbom.Node{ + {Id: "2", Name: "fastapi", Version: "0.115.6"}, + {Id: "1", Name: "pandas", Version: "2.2.3"}, + }, + expect: []*sbom.Node{ + {Id: "2", Name: "fastapi", Version: "0.115.6"}, + {Id: "1", Name: "pandas", Version: "2.2.3"}, + }, + }, { + name: "different versions only, new", + op: "new", + base: []*sbom.Node{ + {Id: "1", Name: "pandas", Version: "2.2.3"}, + {Id: "2", Name: "fastapi", Version: "0.115.4"}, + }, + target: []*sbom.Node{ + {Id: "1", Name: "pandas", Version: "2.2.3"}, + {Id: "2", Name: "fastapi", Version: "0.115.6"}, + {Id: "3", Name: "pandas", Version: "2.2.9"}, + }, + expect: []*sbom.Node{}, + }, { + name: "different versions, new_and_updated", + op: "new_and_updated", + base: []*sbom.Node{ + {Id: "1", Name: "pandas", Version: "2.1.1"}, + {Id: "2", Name: "fastapi", Version: "0.102.4"}, + }, + target: []*sbom.Node{ + {Id: "1", Name: "pandas", Version: "2.2.3"}, + {Id: "2", Name: "fastapi", Version: "0.115.6"}, + }, + expect: []*sbom.Node{ + // Output is alphabetical by name, then version + {Id: "2", Name: "fastapi", Version: "0.115.6"}, + {Id: "1", Name: "pandas", Version: "2.2.3"}, + }, + }, { + name: "updated hashes, new_and_updated", + op: "new_and_updated", + base: []*sbom.Node{ + {Id: "1", Name: "pandas", Version: "2.2.3", + Hashes: map[int32]string{int32(sbom.HashAlgorithm_SHA1): "abc"}}, + {Id: "2", Name: "fastapi", Version: "0.115.6", + Hashes: map[int32]string{int32(sbom.HashAlgorithm_SHA1): "def"}}, + }, + target: []*sbom.Node{ + {Id: "1", Name: "pandas", Version: "2.2.3", + Hashes: map[int32]string{int32(sbom.HashAlgorithm_SHA1): "abc"}}, + {Id: "2", Name: "fastapi", Version: "0.115.6", + Hashes: map[int32]string{int32(sbom.HashAlgorithm_SHA1): "aou"}}, + }, + expect: []*sbom.Node{ + {Id: "2", Name: "fastapi", Version: "0.115.6", + Hashes: map[int32]string{int32(sbom.HashAlgorithm_SHA1): "aou"}}, + }, + }} { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + selected := filterNodes(tc.base, tc.target, ingestTypes[tc.op]) + got := prototext.Format(&sbom.NodeList{Nodes: selected}) + want := prototext.Format(&sbom.NodeList{Nodes: tc.expect}) + require.Equal(t, want, got) + }) + } +} + +func TestIngestRepo(t *testing.T) { + t.Parallel() + tests := []struct { + name string + sampleDir string // A directory in testdata/ containing the + expected *sbom.NodeList + }{{ + name: "simple Python", + sampleDir: "simple-python", + expected: &sbom.NodeList{ + Nodes: []*sbom.Node{{ + Type: sbom.Node_PACKAGE, + Name: "PyYAML", + Version: "5.3.1", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:pypi/pyyaml@5.3.1", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "requirements.txt", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "stevedore", + Version: "1.20.0", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:pypi/stevedore@1.20.0", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "requirements.txt", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "colorama", + Version: "0.3.9", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:pypi/colorama@0.3.9", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "requirements.txt", + }}, + }}, + // Can't pick up "rich" without a version + }, + }, { + name: "simple JavaScript", + sampleDir: "simple-js", // From MrRio/vtop + expected: &sbom.NodeList{ + Nodes: []*sbom.Node{{ + // We _can_ detect the top-level package and version in JavaScript, unlike Python + Type: sbom.Node_PACKAGE, + Name: "vtop", + Version: "0.6.1", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/vtop@0.6.1", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "package.json", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "balanced-match", + Version: "1.0.0", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/balanced-match@1.0.0", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "blessed", + Version: "0.1.81", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/blessed@0.1.81", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "brace-expansion", + Version: "1.1.11", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/brace-expansion@1.1.11", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "commander", + Version: "2.11.0", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/commander@2.11.0", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "concat-map", + Version: "0.0.1", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/concat-map@0.0.1", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "drawille", + Version: "1.1.0", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/drawille@1.1.0", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "fs.realpath", + Version: "1.0.0", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/fs.realpath@1.0.0", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "glob", + Version: "7.1.2", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/glob@7.1.2", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "husky:", // TODO: This is probably a bug in scalibr! + Version: "0.11.9", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/husky%3A@0.11.9", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "inflight", + Version: "1.0.6", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/inflight@1.0.6", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "inherits", + Version: "2.0.3", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/inherits@2.0.3", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "inpath", + Version: "1.0.2", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/inpath@1.0.2", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "is-ci", + Version: "1.0.9", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/is-ci@1.0.9", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "minimatch", + Version: "3.0.4", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/minimatch@3.0.4", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "mute-stream", + Version: "0.0.6", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/mute-stream@0.0.6", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "normalize-path", + Version: "1.0.0", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/normalize-path@1.0.0", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "once", + Version: "1.4.0", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/once@1.4.0", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "os-utils", + Version: "0.0.14", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/os-utils@0.0.14", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "path-is-absolute", + Version: "1.0.1", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/path-is-absolute@1.0.1", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "pidof", + Version: "1.0.2", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/pidof@1.0.2", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "read", + Version: "1.0.7", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/read@1.0.7", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "sudo", + Version: "1.0.3", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/sudo@1.0.3", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "use-strict:", + Version: "1.0.1", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/use-strict%3A@1.0.1", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }, { + Type: sbom.Node_PACKAGE, + Name: "wrappy", + Version: "1.0.2", + Identifiers: map[int32]string{ + int32(sbom.SoftwareIdentifierType_PURL): "pkg:npm/wrappy@1.0.2", + }, + Properties: []*sbom.Property{{ + Name: "sourceFile", + Data: "yarn.lock", + }}, + }}, + }, + }} + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + url := "https://some.url/repo" + branch := "main" + repoPb := &v1.Repository{ + CloneUrl: url, + } + cfg := map[string]any{ + "repo": map[string]string{ + "branch": branch, + }, + } + + fs := osfs.New(filepath.Join("testdata", tc.sampleDir)) + + ctrl := gomock.NewController(t) + t.Cleanup(ctrl.Finish) + ctx := context.Background() + + gitStore := memory.NewStorage() + require.NoError(t, gitStore.SetReference(plumbing.NewHashReference(plumbing.Main, plumbing.ZeroHash))) + repo, err := git.InitWithOptions(gitStore, fs, git.InitOptions{DefaultBranch: plumbing.Main}) + require.NoError(t, err) + + gitProv := mock_github.NewMockGit(ctrl) + gitProv.EXPECT().Clone(gomock.Any(), url, branch).Return(repo, nil) + + gi, err := NewDepsIngester(nil, gitProv) + require.NoError(t, err) + + result, err := gi.Ingest(ctx, repoPb, cfg) + require.NoError(t, err) + nodes := result.Object.(map[string]any)["node_list"].(*sbom.NodeList) + + diff := cmp.Diff(tc.expected.Nodes, nodes.Nodes, + cmpopts.SortSlices(func(a, b *sbom.Node) bool { + return nodeSorter(a, b) < 0 + }), + cmp.Transformer("IgnoreId", func(n *sbom.Node) *sbom.Node { + n.Id = "" + return n + }), + ) + if diff != "" { + t.Errorf("unexpected result (-want +got):\n%s", diff) + } + }) + } +} diff --git a/internal/engine/ingester/deps/testdata/simple-js/package.json b/internal/engine/ingester/deps/testdata/simple-js/package.json new file mode 100644 index 0000000000..a5c0fc2b27 --- /dev/null +++ b/internal/engine/ingester/deps/testdata/simple-js/package.json @@ -0,0 +1,44 @@ +{ + "name": "vtop", + "version": "0.6.1", + "description": "Wow such top. So stats", + "homepage": "http://parall.ax/vtop", + "main": "app.js", + "preferGlobal": true, + "engines": { + "node": ">= 4" + }, + "scripts": { + "test": "make test", + "precommit": "standard" + }, + "standard": { + "ignore": [ + "bin/vtop.js" + ] + }, + "bin": { + "vtop": "./bin/vtop.js" + }, + "author": { + "name": "James Hall", + "email": "james@parall.ax" + }, + "repository": { + "type": "git", + "url": "git@github.com:MrRio/vtop.git" + }, + "license": "MIT", + "readmeFilename": "README.md", + "dependencies": { + "blessed": "0.1.81", + "commander": "2.11.0", + "drawille": "1.1.0", + "glob": "7.1.2", + "husky": "^0.14.3", + "os-utils": "0.0.14", + "read": "1.0.7", + "sudo": "1.0.3", + "use-strict": "^1.0.1" + } + } \ No newline at end of file diff --git a/internal/engine/ingester/deps/testdata/simple-js/yarn.lock b/internal/engine/ingester/deps/testdata/simple-js/yarn.lock new file mode 100644 index 0000000000..edb82c8a20 --- /dev/null +++ b/internal/engine/ingester/deps/testdata/simple-js/yarn.lock @@ -0,0 +1,125 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +blessed@0.1.81: + version "0.1.81" + resolved "https://registry.yarnpkg.com/blessed/-/blessed-0.1.81.tgz#f962d687ec2c369570ae71af843256e6d0ca1129" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +commander@2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +drawille@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/drawille/-/drawille-1.1.0.tgz#5f7cec246d31b5a10044be84cedd9a486fa31ced" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +glob@7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +husky: + version "0.11.9" + resolved "https://registry.yarnpkg.com/husky/-/husky-0.11.9.tgz#28cd1dc16bffdca1d4d93592814e5f3c327b38ee" + dependencies: + is-ci "^1.0.9" + normalize-path "^1.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inpath@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/inpath/-/inpath-1.0.2.tgz#4ac219710ec7a72f460ff94bf424dd3ef0e52817" + +is-ci@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.9.tgz#de2c5ffe49ab3237fda38c47c8a3bbfd55bbcca7" + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +mute-stream@~0.0.4: + version "0.0.6" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" + +normalize-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +os-utils@0.0.14: + version "0.0.14" + resolved "https://registry.yarnpkg.com/os-utils/-/os-utils-0.0.14.tgz#29e511697b1982b8c627722175fe39797ef64156" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +pidof@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pidof/-/pidof-1.0.2.tgz#fba0eae1c8335a11eb8099f5d0f3efbc45cb4e90" + +read@1.0.7, read@~1.0.3: + version "1.0.7" + resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + dependencies: + mute-stream "~0.0.4" + +sudo@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sudo/-/sudo-1.0.3.tgz#ccf28669120f8b74f82b846dff7f1c95120eff20" + dependencies: + inpath "~1.0.2" + pidof "~1.0.2" + read "~1.0.3" + +use-strict: + version "1.0.1" + resolved "https://registry.yarnpkg.com/use-strict/-/use-strict-1.0.1.tgz#0bb80d94f49a4a05192b84a8c7d34e95f1a7e3a0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" \ No newline at end of file diff --git a/internal/engine/ingester/deps/testdata/simple-python/requirements.txt b/internal/engine/ingester/deps/testdata/simple-python/requirements.txt new file mode 100644 index 0000000000..49b18b4d34 --- /dev/null +++ b/internal/engine/ingester/deps/testdata/simple-python/requirements.txt @@ -0,0 +1,4 @@ +PyYAML>=5.3.1 # MIT +stevedore>=1.20.0 # Apache-2.0 +colorama>=0.3.9;platform_system=="Windows" # BSD License (3 clause) +rich # MIT \ No newline at end of file diff --git a/internal/engine/ingester/diff/diff.go b/internal/engine/ingester/diff/diff.go index a7623d39f5..49de251108 100644 --- a/internal/engine/ingester/diff/diff.go +++ b/internal/engine/ingester/diff/diff.go @@ -84,7 +84,7 @@ func (di *Diff) Ingest( ent protoreflect.ProtoMessage, _ map[string]any, ) (*interfaces.Result, error) { - pr, ok := ent.(*pb.PullRequest) + pr, ok := ent.(*pbinternal.PullRequest) if !ok { return nil, fmt.Errorf("entity is not a pull request") } @@ -111,7 +111,7 @@ func (di *Diff) Ingest( } } -func (di *Diff) getDepTypeDiff(ctx context.Context, prNumber int, pr *pb.PullRequest) (*interfaces.Result, error) { +func (di *Diff) getDepTypeDiff(ctx context.Context, prNumber int, pr *pbinternal.PullRequest) (*interfaces.Result, error) { deps := pbinternal.PrDependencies{Pr: pr} page := 0 @@ -139,7 +139,7 @@ func (di *Diff) getDepTypeDiff(ctx context.Context, prNumber int, pr *pb.PullReq return &interfaces.Result{Object: &deps, Checkpoint: checkpoints.NewCheckpointV1Now()}, nil } -func (di *Diff) getFullTypeDiff(ctx context.Context, prNumber int, pr *pb.PullRequest) (*interfaces.Result, error) { +func (di *Diff) getFullTypeDiff(ctx context.Context, prNumber int, pr *pbinternal.PullRequest) (*interfaces.Result, error) { diff := &pbinternal.PrContents{Pr: pr} page := 0 @@ -196,7 +196,7 @@ func (di *Diff) ingestFileForDepDiff( return batchCtxDeps, nil } -func (di *Diff) getScalibrTypeDiff(ctx context.Context, _ int, pr *pb.PullRequest) (*interfaces.Result, error) { +func (di *Diff) getScalibrTypeDiff(ctx context.Context, _ int, pr *pbinternal.PullRequest) (*interfaces.Result, error) { deps := pbinternal.PrDependencies{Pr: pr} // TODO: we should be able to just fetch the additional commits between base and target. @@ -300,11 +300,7 @@ func inventoryToEcosystem(inventory *extractor.Inventory) pbinternal.DepEcosyste } // This should be inventory.PURL()... but there isn't a convenience wrapper yet - package_url, err := inventory.Extractor.ToPURL(inventory) - if err != nil { - zerolog.Ctx(context.Background()).Warn().Err(err).Msg("error getting ecosystem from inventory") - return pbinternal.DepEcosystem_DEP_ECOSYSTEM_UNSPECIFIED - } + package_url := inventory.Extractor.ToPURL(inventory) // Sometimes Scalibr uses the string "PyPI" instead of "pypi" when reporting the ecosystem. switch package_url.Type { diff --git a/internal/engine/ingester/diff/diff_test.go b/internal/engine/ingester/diff/diff_test.go index 0cebbc03c5..a970979795 100644 --- a/internal/engine/ingester/diff/diff_test.go +++ b/internal/engine/ingester/diff/diff_test.go @@ -291,7 +291,7 @@ func Test_getScalibrTypeDiff(t *testing.T) { t.Fatalf("NewDiffIngester() error = %v", err) } - req := &pb.PullRequest{ + req := &pbinternal.PullRequest{ Url: "https://api.github.com/repos/evan-testing-minder/docs-test/pulls/2", CommitSha: "5fab4eb53bdfdd879b841564ed9e8064de271cd2", Number: 2, diff --git a/internal/engine/ingester/git/git.go b/internal/engine/ingester/git/git.go index 6a74700634..c9f6993fe5 100644 --- a/internal/engine/ingester/git/git.go +++ b/internal/engine/ingester/git/git.go @@ -5,14 +5,19 @@ package git import ( + "cmp" "context" "errors" "fmt" + "github.com/go-git/go-billy/v5" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/storage" "github.com/go-viper/mapstructure/v2" "google.golang.org/protobuf/reflect/protoreflect" engerrors "github.com/mindersec/minder/internal/engine/errors" + pbinternal "github.com/mindersec/minder/internal/proto" pb "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" "github.com/mindersec/minder/pkg/engine/v1/interfaces" "github.com/mindersec/minder/pkg/entities/v1/checkpoints" @@ -59,41 +64,31 @@ func (gi *Git) GetConfig() protoreflect.ProtoMessage { // Ingest does the actual data ingestion for a rule type by cloning a git repo func (gi *Git) Ingest(ctx context.Context, ent protoreflect.ProtoMessage, params map[string]any) (*interfaces.Result, error) { + switch entity := ent.(type) { + case *pb.Repository: + return gi.ingestRepository(ctx, entity, params) + case *pbinternal.PullRequest: + return gi.ingestPullRequest(ctx, entity, params) + default: + return nil, fmt.Errorf("git is only supported for repositories and pull requests") + } +} + +func (gi *Git) ingestRepository(ctx context.Context, repo *pb.Repository, params map[string]any) (*interfaces.Result, error) { userCfg := &IngesterConfig{} if err := mapstructure.Decode(params, userCfg); err != nil { return nil, fmt.Errorf("failed to read git ingester configuration from params: %w", err) } - url := getCloneUrl(ent, userCfg) + url := cmp.Or(userCfg.CloneURL, repo.GetCloneUrl()) if url == "" { return nil, fmt.Errorf("could not get clone url") } - branch := gi.getBranch(ent, userCfg) - - // We clone to the memfs go-billy filesystem driver, which doesn't - // allow for direct access to the underlying filesystem. This is - // because we want to be able to run this in a sandboxed environment - // where we don't have access to the underlying filesystem. - r, err := gi.gitprov.Clone(ctx, url, branch) + branch := cmp.Or(userCfg.Branch, gi.cfg.Branch, repo.GetDefaultBranch(), defaultBranch) + fs, storer, head, err := gi.fetchClone(ctx, url, branch) if err != nil { - if errors.Is(err, provifv1.ErrProviderGitBranchNotFound) { - return nil, fmt.Errorf("%w: %s: branch %s", engerrors.ErrEvaluationFailed, - provifv1.ErrProviderGitBranchNotFound, branch) - } else if errors.Is(err, provifv1.ErrRepositoryEmpty) { - return nil, fmt.Errorf("%w: %s", engerrors.ErrEvaluationSkipped, provifv1.ErrRepositoryEmpty) - } - return nil, err - } - - wt, err := r.Worktree() - if err != nil { - return nil, fmt.Errorf("could not get worktree: %w", err) - } - - head, err := r.Head() - if err != nil { - return nil, fmt.Errorf("could not get head: %w", err) + return nil, fmt.Errorf("failed to clone %s from %s: %w", branch, url, err) } hsh := head.Hash() @@ -104,47 +99,73 @@ func (gi *Git) Ingest(ctx context.Context, ent protoreflect.ProtoMessage, params return &interfaces.Result{ Object: nil, - Fs: wt.Filesystem, - Storer: r.Storer, + Fs: fs, + Storer: storer, Checkpoint: chkpoint, }, nil } -func (gi *Git) getBranch(ent protoreflect.ProtoMessage, userCfg *IngesterConfig) string { - // If the user has specified a branch, use that - if userCfg.Branch != "" { - return userCfg.Branch +func (gi *Git) ingestPullRequest( + ctx context.Context, ent *pbinternal.PullRequest, params map[string]any) (*interfaces.Result, error) { + // TODO: we don't actually have any configuration here. Do we need to read the configuration? + userCfg := &IngesterConfig{} + if err := mapstructure.Decode(params, userCfg); err != nil { + return nil, fmt.Errorf("failed to read git ingester configuration from params: %w", err) } - // If the branch is provided in the rule-type - // configuration, use that - if gi.cfg.Branch != "" { - return gi.cfg.Branch + if ent.GetBaseCloneUrl() == "" || ent.GetBaseRef() == "" { + return nil, fmt.Errorf("could not get PR base branch %q from %q", ent.GetBaseRef(), ent.GetBaseCloneUrl()) + } + if ent.GetTargetCloneUrl() == "" || ent.GetTargetRef() == "" { + return nil, fmt.Errorf("could not get PR target branch %q from %q", ent.GetTargetRef(), ent.GetTargetCloneUrl()) } - // If the entity is a repository get it from the entity - // else, use the default - if repo, ok := ent.(*pb.Repository); ok { - if repo.GetDefaultBranch() != "" { - return repo.GetDefaultBranch() - } + baseFs, _, _, err := gi.fetchClone(ctx, ent.GetBaseCloneUrl(), ent.GetBaseRef()) + if err != nil { + return nil, fmt.Errorf("failed to clone base branch %s from %s: %w", ent.GetBaseRef(), ent.GetBaseCloneUrl(), err) + } + targetFs, storer, head, err := gi.fetchClone(ctx, ent.GetTargetCloneUrl(), ent.GetTargetRef()) + if err != nil { + return nil, fmt.Errorf("failed to clone target branch %s from %s: %w", ent.GetTargetRef(), ent.GetTargetCloneUrl(), err) } - // If the branch is not provided in the rule-type - // configuration, use the default branch - return defaultBranch + checkpoint := checkpoints.NewCheckpointV1Now().WithBranch(ent.GetTargetRef()).WithCommitHash(head.Hash().String()) + + return &interfaces.Result{ + Object: nil, + Fs: targetFs, + Storer: storer, + BaseFs: baseFs, + Checkpoint: checkpoint, + }, nil } -func getCloneUrl(ent protoreflect.ProtoMessage, cfg *IngesterConfig) string { - if cfg.CloneURL != "" { - return cfg.CloneURL +func (gi *Git) fetchClone( + ctx context.Context, url, branch string) (billy.Filesystem, storage.Storer, *plumbing.Reference, error) { + // We clone to the memfs go-billy filesystem driver, which doesn't + // allow for direct access to the underlying filesystem. This is + // because we want to be able to run this in a sandboxed environment + // where we don't have access to the underlying filesystem. + r, err := gi.gitprov.Clone(ctx, url, branch) + if err != nil { + if errors.Is(err, provifv1.ErrProviderGitBranchNotFound) { + return nil, nil, nil, fmt.Errorf("%w: %s: branch %s", engerrors.ErrEvaluationFailed, + provifv1.ErrProviderGitBranchNotFound, branch) + } else if errors.Is(err, provifv1.ErrRepositoryEmpty) { + return nil, nil, nil, fmt.Errorf("%w: %s", engerrors.ErrEvaluationSkipped, provifv1.ErrRepositoryEmpty) + } + return nil, nil, nil, err + } + + wt, err := r.Worktree() + if err != nil { + return nil, nil, nil, fmt.Errorf("could not get worktree: %w", err) } - // If the entity is a repository get it from the entity - // else, get it from the configuration - if repo, ok := ent.(*pb.Repository); ok { - return repo.GetCloneUrl() + head, err := r.Head() + if err != nil { + return nil, nil, nil, fmt.Errorf("could not get head: %w", err) } - return "" + return wt.Filesystem, r.Storer, head, err } diff --git a/internal/engine/ingester/git/git_test.go b/internal/engine/ingester/git/git_test.go index ee71007bc3..a73b8b5834 100644 --- a/internal/engine/ingester/git/git_test.go +++ b/internal/engine/ingester/git/git_test.go @@ -72,7 +72,7 @@ func TestGitIngestWithCloneURLFromParams(t *testing.T) { ) require.NoError(t, err, "expected no error") - got, err := gi.Ingest(context.Background(), &pb.Artifact{}, map[string]any{ + got, err := gi.Ingest(context.Background(), &pb.Repository{}, map[string]any{ "clone_url": "https://github.com/octocat/Hello-World.git", }) require.NoError(t, err, "expected no error") @@ -100,7 +100,7 @@ func TestGitIngestWithCustomBranchFromParams(t *testing.T) { ) require.NoError(t, err, "expected no error") - got, err := gi.Ingest(context.Background(), &pb.Artifact{}, map[string]any{ + got, err := gi.Ingest(context.Background(), &pb.Repository{}, map[string]any{ "clone_url": "https://github.com/octocat/Hello-World.git", "branch": "test", }) @@ -161,7 +161,7 @@ func TestGitIngestWithUnexistentBranchFromParams(t *testing.T) { require.NoError(t, err, "expected no error") - got, err := gi.Ingest(context.Background(), &pb.Artifact{}, map[string]any{ + got, err := gi.Ingest(context.Background(), &pb.Repository{}, map[string]any{ "clone_url": "https://github.com/octocat/Hello-World.git", "branch": "unexistent-branch", }) @@ -181,7 +181,7 @@ func TestGitIngestFailsBecauseOfAuthorization(t *testing.T) { require.NoError(t, err, "expected no error") - got, err := gi.Ingest(context.Background(), &pb.Artifact{}, map[string]any{ + got, err := gi.Ingest(context.Background(), &pb.Repository{}, map[string]any{ "clone_url": "https://github.com/mindersec/minder.git", }) require.Error(t, err, "expected error") @@ -195,7 +195,7 @@ func TestGitIngestFailsBecauseOfUnexistentCloneUrl(t *testing.T) { &pb.GitType{}, testproviders.NewGitProvider(credentials.NewEmptyCredential())) require.NoError(t, err, "expected no error") - got, err := gi.Ingest(context.Background(), &pb.Artifact{}, map[string]any{ + got, err := gi.Ingest(context.Background(), &pb.Repository{}, map[string]any{ "clone_url": "https://github.com/octocat/unexistent-git-repo.git", }) require.Error(t, err, "expected error") @@ -222,7 +222,7 @@ func TestGitIngestFailsWhenRepoTooLarge(t *testing.T) { require.NoError(t, err, "expected no error") - got, err := gi.Ingest(context.Background(), &pb.Artifact{}, map[string]any{ + got, err := gi.Ingest(context.Background(), &pb.Repository{}, map[string]any{ "clone_url": "https://github.com/octocat/Hello-World.git", }) require.Error(t, err, "expected error") @@ -250,7 +250,7 @@ func TestGitIngestFailsWhenRepoHasTooManyFiles(t *testing.T) { require.NoError(t, err, "expected no error") - got, err := gi.Ingest(context.Background(), &pb.Artifact{}, map[string]any{ + got, err := gi.Ingest(context.Background(), &pb.Repository{}, map[string]any{ "clone_url": "https://github.com/octocat/Hello-World.git", }) require.Error(t, err, "expected error") diff --git a/internal/engine/ingester/ingester.go b/internal/engine/ingester/ingester.go index 541f193d57..01669382fe 100644 --- a/internal/engine/ingester/ingester.go +++ b/internal/engine/ingester/ingester.go @@ -11,6 +11,7 @@ import ( "github.com/mindersec/minder/internal/engine/ingester/artifact" "github.com/mindersec/minder/internal/engine/ingester/builtin" + "github.com/mindersec/minder/internal/engine/ingester/deps" "github.com/mindersec/minder/internal/engine/ingester/diff" "github.com/mindersec/minder/internal/engine/ingester/git" "github.com/mindersec/minder/internal/engine/ingester/rest" @@ -65,6 +66,12 @@ func NewRuleDataIngest(rt *pb.RuleType, provider provinfv1.Provider) (interfaces return nil, errors.New("provider does not implement github trait") } return diff.NewDiffIngester(ing.GetDiff(), client) + case deps.DepsRuleDataIngestType: + client, err := provinfv1.As[provinfv1.Git](provider) + if err != nil { + return nil, errors.New("provider does not implement git trait") + } + return deps.NewDepsIngester(ing.GetDeps(), client) default: return nil, fmt.Errorf("unsupported rule type engine: %s", rt.Def.Ingest.Type) } diff --git a/internal/engine/interfaces/interface.go b/internal/engine/interfaces/interface.go index 7ec48402c9..77c4c12f53 100644 --- a/internal/engine/interfaces/interface.go +++ b/internal/engine/interfaces/interface.go @@ -26,8 +26,8 @@ type ActionType string type Action interface { Class() ActionType Type() string - GetOnOffState(models.ActionOpt) models.ActionOpt - Do(ctx context.Context, cmd ActionCmd, setting models.ActionOpt, entity protoreflect.ProtoMessage, + GetOnOffState() models.ActionOpt + Do(ctx context.Context, cmd ActionCmd, entity protoreflect.ProtoMessage, params ActionsParams, metadata *json.RawMessage) (json.RawMessage, error) } @@ -60,13 +60,12 @@ type EvalStatusParams struct { EntityID uuid.UUID EvalStatusFromDb *db.ListRuleEvaluationsByProfileIdRow evalErr error - actionsOnOff map[ActionType]models.ActionOpt + evalResult *interfaces.EvaluationResult actionsErr evalerrors.ActionsError ExecutionID uuid.UUID } // Ensure EvalStatusParams implements the necessary interfaces -var _ ActionsParams = (*EvalStatusParams)(nil) var _ EvalParamsReader = (*EvalStatusParams)(nil) var _ interfaces.ResultSink = (*EvalStatusParams)(nil) @@ -80,14 +79,14 @@ func (e *EvalStatusParams) SetEvalErr(err error) { e.evalErr = err } -// GetActionsOnOff returns the actions' on/off state -func (e *EvalStatusParams) GetActionsOnOff() map[ActionType]models.ActionOpt { - return e.actionsOnOff +// GetEvalResult returns the evaluation result +func (e *EvalStatusParams) GetEvalResult() *interfaces.EvaluationResult { + return e.evalResult } -// SetActionsOnOff sets the actions' on/off state -func (e *EvalStatusParams) SetActionsOnOff(actionsOnOff map[ActionType]models.ActionOpt) { - e.actionsOnOff = actionsOnOff +// SetEvalResult sets the evaluation result for use later on in the actions +func (e *EvalStatusParams) SetEvalResult(res *interfaces.EvaluationResult) { + e.evalResult = res } // SetActionsErr sets the actions' error @@ -173,9 +172,9 @@ type EvalParamsReader interface { type ActionsParams interface { EvalParamsReader interfaces.ResultSink - GetActionsOnOff() map[ActionType]models.ActionOpt GetActionsErr() evalerrors.ActionsError GetEvalErr() error + GetEvalResult() *interfaces.EvaluationResult GetEvalStatusFromDb() *db.ListRuleEvaluationsByProfileIdRow GetProfile() *models.ProfileAggregate } diff --git a/internal/engine/options/options.go b/internal/engine/options/options.go index 7e2ceb1353..0da6223418 100644 --- a/internal/engine/options/options.go +++ b/internal/engine/options/options.go @@ -8,6 +8,7 @@ package options import ( "github.com/open-feature/go-sdk/openfeature" + v1datasources "github.com/mindersec/minder/pkg/datasources/v1" "github.com/mindersec/minder/pkg/engine/v1/interfaces" ) @@ -33,3 +34,23 @@ func WithFlagsClient(client openfeature.IClient) Option { return inner.SetFlagsClient(client) } } + +// SupportsDataSources interface advertises the fact that the implementer +// can register data sources with the evaluator. +type SupportsDataSources interface { + RegisterDataSources(ds *v1datasources.DataSourceRegistry) +} + +// WithDataSources provides the evaluation engine with a list of data sources +// to register. In case the given evaluator does not support data sources, +// WithDataSources silently ignores the error. +func WithDataSources(ds *v1datasources.DataSourceRegistry) Option { + return func(e interfaces.Evaluator) error { + inner, ok := e.(SupportsDataSources) + if !ok { + return nil + } + inner.RegisterDataSources(ds) + return nil + } +} diff --git a/internal/engine/rtengine/cache.go b/internal/engine/rtengine/cache.go index 6023c6aad2..a03129c1f0 100644 --- a/internal/engine/rtengine/cache.go +++ b/internal/engine/rtengine/cache.go @@ -10,7 +10,9 @@ import ( "fmt" "github.com/google/uuid" + "github.com/open-feature/go-sdk/openfeature" + datasourceservice "github.com/mindersec/minder/internal/datasources/service" "github.com/mindersec/minder/internal/db" "github.com/mindersec/minder/internal/engine/ingestcache" eoptions "github.com/mindersec/minder/internal/engine/options" @@ -28,11 +30,13 @@ type Cache interface { type cacheType = map[uuid.UUID]*rtengine2.RuleTypeEngine type ruleEngineCache struct { - store db.Store - provider provinfv1.Provider - ingestCache ingestcache.Cache - engines cacheType - opts []eoptions.Option + store db.Store + provider provinfv1.Provider + featureFlags openfeature.IClient + ingestCache ingestcache.Cache + engines cacheType + dssvc datasourceservice.DataSourcesService + opts []eoptions.Option } // NewRuleEngineCache creates the rule engine cache @@ -40,13 +44,16 @@ type ruleEngineCache struct { // for this entity and project hierarchy. func NewRuleEngineCache( ctx context.Context, - store db.Querier, + store db.Store, entityType db.Entities, projectID uuid.UUID, provider provinfv1.Provider, + featureFlags openfeature.IClient, ingestCache ingestcache.Cache, + dssvc datasourceservice.DataSourcesService, opts ...eoptions.Option, ) (Cache, error) { + // Get the full project hierarchy hierarchy, err := store.GetParentProjects(ctx, projectID) if err != nil { @@ -66,14 +73,23 @@ func NewRuleEngineCache( // Populate the cache with rule type engines for the rule types we found. engines := make(cacheType, len(ruleTypes)) for _, ruleType := range ruleTypes { - ruleEngine, err := cacheRuleEngine(ctx, &ruleType, provider, ingestCache, engines, opts...) + ruleEngine, err := cacheRuleEngine( + ctx, &ruleType, provider, featureFlags, ingestCache, engines, dssvc, opts...) if err != nil { return nil, err } engines[ruleType.ID] = ruleEngine } - return &ruleEngineCache{engines: engines, opts: opts}, nil + return &ruleEngineCache{ + store: store, + provider: provider, + featureFlags: featureFlags, + ingestCache: ingestCache, + engines: engines, + opts: opts, + dssvc: dssvc, + }, nil } func (r *ruleEngineCache) GetRuleEngine(ctx context.Context, ruleTypeID uuid.UUID) (*rtengine2.RuleTypeEngine, error) { @@ -100,7 +116,8 @@ func (r *ruleEngineCache) GetRuleEngine(ctx context.Context, ruleTypeID uuid.UUI } // If we find the rule type, insert into the cache and return. - ruleTypeEngine, err := cacheRuleEngine(ctx, &ruleType, r.provider, r.ingestCache, r.engines, r.opts...) + ruleTypeEngine, err := cacheRuleEngine( + ctx, &ruleType, r.provider, r.featureFlags, r.ingestCache, r.engines, r.dssvc, r.opts...) if err != nil { return nil, fmt.Errorf("error while caching rule type engine: %w", err) } @@ -111,8 +128,10 @@ func cacheRuleEngine( ctx context.Context, ruleType *db.RuleType, provider provinfv1.Provider, + featureFlags openfeature.IClient, ingestCache ingestcache.Cache, engineCache cacheType, + dssvc datasourceservice.DataSourcesService, opts ...eoptions.Option, ) (*rtengine2.RuleTypeEngine, error) { // Parse the rule type @@ -121,8 +140,23 @@ func cacheRuleEngine( return nil, fmt.Errorf("error parsing rule type when parsing rule type %s: %w", ruleType.ID, err) } + // Build a registry instance per rule type. This allows us to have an + // isolated data source list per instance of the rule type engine which is + // what we want. We don't want rule types using data sources they haven't + // instantiated. It is in this spot that we would add something like a cache + // so data sources could optimize in a per-execution context. + // + // TODO: Do we need to pass in a transaction here? + // TODO: We _might_ want to pass in a slice of the hierarchy here. + dsreg, err := dssvc.BuildDataSourceRegistry(ctx, pbRuleType, nil) + if err != nil { + return nil, fmt.Errorf("error building data source registry: %w", err) + } + + opts = append(opts, eoptions.WithDataSources(dsreg)) + // Create the rule type engine - ruleEngine, err := rtengine2.NewRuleTypeEngine(ctx, pbRuleType, provider, opts...) + ruleEngine, err := rtengine2.NewRuleTypeEngine(ctx, pbRuleType, provider, featureFlags, opts...) if err != nil { return nil, fmt.Errorf("error creating rule type engine: %w", err) } diff --git a/internal/engine/rtengine/cache_test.go b/internal/engine/rtengine/cache_test.go index 8fec738e45..5f6a348eb5 100644 --- a/internal/engine/rtengine/cache_test.go +++ b/internal/engine/rtengine/cache_test.go @@ -13,21 +13,145 @@ import ( "github.com/stretchr/testify/require" "go.uber.org/mock/gomock" + mockdssvc "github.com/mindersec/minder/internal/datasources/service/mock" "github.com/mindersec/minder/internal/db" dbf "github.com/mindersec/minder/internal/db/fixtures" "github.com/mindersec/minder/internal/engine/ingestcache" "github.com/mindersec/minder/internal/providers/testproviders" + v1datasources "github.com/mindersec/minder/pkg/datasources/v1" rtengine2 "github.com/mindersec/minder/pkg/engine/v1/rtengine" ) +func TestNewRuleTypeEngineCacheConstructor(t *testing.T) { + t.Parallel() + + scenarios := []struct { + Name string + DBSetup dbf.DBMockBuilder + DSServiceSetup func(service *mockdssvc.MockDataSourcesService) + ExpectedError string + }{ + { + Name: "Returns error when getting parent projects fails", + DBSetup: dbf.NewDBMock(func(mock dbf.DBMock) { + mock.EXPECT().GetParentProjects(gomock.Any(), gomock.Any()).Return(nil, errTest) + }), + ExpectedError: "error getting parent projects", + }, + { + Name: "Returns error when getting rule types fails", + DBSetup: dbf.NewDBMock(func(mock dbf.DBMock) { + mock.EXPECT().GetParentProjects(gomock.Any(), gomock.Any()). + Return([]uuid.UUID{uuid.New()}, nil) + mock.EXPECT().GetRuleTypesByEntityInHierarchy(gomock.Any(), gomock.Any()). + Return(nil, errTest) + }), + ExpectedError: "error while retrieving rule types", + }, + { + Name: "Returns error when getting rule type with no def", + DBSetup: dbf.NewDBMock(func(mock dbf.DBMock) { + mock.EXPECT().GetParentProjects(gomock.Any(), gomock.Any()). + Return([]uuid.UUID{uuid.New()}, nil) + mock.EXPECT().GetRuleTypesByEntityInHierarchy(gomock.Any(), gomock.Any()). + Return([]db.RuleType{{ID: uuid.New()}}, nil) + }), + ExpectedError: "cannot unmarshal rule type definition", + }, + { + Name: "Returns error when building data source registry fails", + DBSetup: dbf.NewDBMock(func(mock dbf.DBMock) { + hierarchy := []uuid.UUID{uuid.New(), uuid.New()} + // Calls from the engine builder itself + mock.EXPECT().GetParentProjects(gomock.Any(), gomock.Any()). + Return(hierarchy, nil) + mock.EXPECT().GetRuleTypesByEntityInHierarchy(gomock.Any(), gomock.Any()). + Return([]db.RuleType{{ + ID: uuid.New(), + ProjectID: hierarchy[0], + Definition: []byte(ruleDefJSON), + }}, nil) + }), + DSServiceSetup: func(service *mockdssvc.MockDataSourcesService) { + service.EXPECT().BuildDataSourceRegistry(gomock.Any(), gomock.Any(), gomock.Any()). + Return(nil, errTest) + }, + ExpectedError: errTest.Error(), + }, + { + Name: "Creates rule engine cache", + DBSetup: dbf.NewDBMock(func(mock dbf.DBMock) { + hierarchy := []uuid.UUID{uuid.New(), uuid.New()} + // Calls from the engine builder itself + mock.EXPECT().GetParentProjects(gomock.Any(), gomock.Any()). + Return(hierarchy, nil) + mock.EXPECT().GetRuleTypesByEntityInHierarchy(gomock.Any(), gomock.Any()). + Return([]db.RuleType{{ + ID: uuid.New(), + ProjectID: hierarchy[0], + Definition: []byte(ruleDefJSON), + }}, nil) + }), + DSServiceSetup: func(service *mockdssvc.MockDataSourcesService) { + service.EXPECT().BuildDataSourceRegistry(gomock.Any(), gomock.Any(), gomock.Any()). + Return(v1datasources.NewDataSourceRegistry(), nil) + }, + }, + } + + for _, scenario := range scenarios { + t.Run(scenario.Name, func(t *testing.T) { + t.Parallel() + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + ctx := context.Background() + + dssvc := mockdssvc.NewMockDataSourcesService(ctrl) + + var store db.Store + if scenario.DBSetup != nil { + store = scenario.DBSetup(ctrl) + } + + if scenario.DSServiceSetup != nil { + scenario.DSServiceSetup(dssvc) + } + + cache, err := NewRuleEngineCache( + ctx, store, db.EntitiesRepository, uuid.New(), + testproviders.NewGitProvider(nil), nil, ingestcache.NewNoopCache(), + dssvc) + if scenario.ExpectedError != "" { + require.ErrorContains(t, err, scenario.ExpectedError) + require.Nil(t, cache) + } else { + require.NoError(t, err) + require.NotNil(t, cache) + + // Ensure members are not null so we don't fall on the same issue + // we had of not initializing them. + impl, ok := cache.(*ruleEngineCache) + require.True(t, ok) + require.NotNil(t, impl.store) + require.NotNil(t, impl.provider) + require.NotNil(t, impl.ingestCache) + require.NotNil(t, impl.engines) + require.NotNil(t, impl.dssvc) + } + }) + } +} + func TestGetRuleEngine(t *testing.T) { t.Parallel() scenarios := []struct { - Name string - Cache cacheType - DBSetup dbf.DBMockBuilder - ExpectedError string + Name string + Cache cacheType + DBSetup dbf.DBMockBuilder + ExpectedError string + dsRegistryError error }{ { Name: "Retrieves rule engine from cache", @@ -62,6 +186,13 @@ func TestGetRuleEngine(t *testing.T) { Cache: cacheType{}, DBSetup: dbf.NewDBMock(withRuleTypeLookup(&ruleType, nil)), }, + { + Name: "Returns error when building data source registry fails", + Cache: cacheType{}, + DBSetup: dbf.NewDBMock(withRuleTypeLookup(&ruleType, nil)), + dsRegistryError: errTest, + ExpectedError: errTest.Error(), + }, } for _, scenario := range scenarios { @@ -77,11 +208,18 @@ func TestGetRuleEngine(t *testing.T) { store = scenario.DBSetup(ctrl) } + dssvc := mockdssvc.NewMockDataSourcesService(ctrl) + reg := v1datasources.NewDataSourceRegistry() + + dssvc.EXPECT().BuildDataSourceRegistry(gomock.Any(), gomock.Any(), gomock.Any()). + Return(reg, scenario.dsRegistryError).AnyTimes() + cache := ruleEngineCache{ store: store, provider: testproviders.NewGitProvider(nil), ingestCache: ingestcache.NewNoopCache(), engines: scenario.Cache, + dssvc: dssvc, } result, err := cache.GetRuleEngine(ctx, ruleTypeID) @@ -136,8 +274,8 @@ const ruleDefJSON = ` "eval": { "type": "jq", "jq": [{ - "ingested": {"def": "abc"}, - "profile": {"def": "xyz"} + "ingested": {"def": ".abc"}, + "profile": {"def": ".xyz"} }] } } diff --git a/internal/entities/handlers/handler_test.go b/internal/entities/handlers/handler_test.go index afb40cf27c..9f1af4ebc2 100644 --- a/internal/entities/handlers/handler_test.go +++ b/internal/entities/handlers/handler_test.go @@ -25,6 +25,7 @@ import ( "github.com/mindersec/minder/internal/entities/properties/service" "github.com/mindersec/minder/internal/entities/properties/service/mock/fixtures" stubeventer "github.com/mindersec/minder/internal/events/stubs" + pbinternal "github.com/mindersec/minder/internal/proto" mockgithub "github.com/mindersec/minder/internal/providers/github/mock" ghprops "github.com/mindersec/minder/internal/providers/github/properties" "github.com/mindersec/minder/internal/providers/manager" @@ -181,7 +182,7 @@ func checkPullRequestMessage(t *testing.T, msg *watermill.Message) { require.NoError(t, err) require.NotNil(t, eiw) - pbpr, ok := eiw.Entity.(*minderv1.PullRequest) + pbpr, ok := eiw.Entity.(*pbinternal.PullRequest) require.True(t, ok) assert.Equal(t, pullRequestPropMap[ghprops.PullPropertyNumber].(int64), pbpr.Number) } @@ -609,7 +610,7 @@ func TestRefreshEntityAndDoHandler_HandleRefreshEntityAndEval(t *testing.T) { providerSetup: newProviderMock( withSuccessfulGetEntityName(pullName), withSuccessfulFetchAllProperties(getPullRequestProperties()), - WithSuccessfulPropertiesToProtoMessage(&minderv1.PullRequest{ + WithSuccessfulPropertiesToProtoMessage(&pbinternal.PullRequest{ Number: 789, }), ), diff --git a/internal/entities/properties/constants.go b/internal/entities/properties/constants.go index d885c3b682..3005b76b5e 100644 --- a/internal/entities/properties/constants.go +++ b/internal/entities/properties/constants.go @@ -21,8 +21,36 @@ const ( RepoPropertyIsFork = "is_fork" ) +// Pull Request property keys +const ( + // PullRequestCommitSHA represents the commit SHA of the pull request + PullRequestCommitSHA = "commit_sha" + // PullRequestBaseCloneURL represents the clone URL of the base repository + PullRequestBaseCloneURL = "base_clone_url" + // PullRequestBaseDefaultBranch represents the default branch of the base repository + PullRequestBaseDefaultBranch = "base_default_branch" + // PullRequestTargetCloneURL represents the clone URL of the target repository. + // Where the pull request comes from. + PullRequestTargetCloneURL = "target_clone_url" + // PullRequestTargetBranch represents the default branch of the target repository. + // Where the pull request comes from. + PullRequestTargetBranch = "target_branch" + // PullRequestUpstreamURL represents the URL of the pull request in the provider + PullRequestUpstreamURL = "upstream_url" +) + // Artifact property keys const ( // ArtifactPropertyType represents the type of the artifact (e.g 'container') ArtifactPropertyType = "type" ) + +// Release property keys +const ( + // ReleasePropertyTag represents the release tag name. + ReleasePropertyTag = "tag" + // ReleasePropertyBranch represents the release branch + ReleasePropertyBranch = "branch" + // ReleaseCommitSHA represents the commit SHA of the release + ReleaseCommitSHA = "commit_sha" +) diff --git a/internal/entities/properties/service/mock/service.go b/internal/entities/properties/service/mock/service.go index 491c99708d..9a7da8b2b7 100644 --- a/internal/entities/properties/service/mock/service.go +++ b/internal/entities/properties/service/mock/service.go @@ -150,21 +150,6 @@ func (mr *MockPropertiesServiceMockRecorder) RetrieveAllPropertiesForEntity(ctx, return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RetrieveAllPropertiesForEntity", reflect.TypeOf((*MockPropertiesService)(nil).RetrieveAllPropertiesForEntity), ctx, efp, provMan, opts) } -// RetrieveProperty mocks base method. -func (m *MockPropertiesService) RetrieveProperty(ctx context.Context, provider v10.Provider, projectId, providerID uuid.UUID, lookupProperties *properties.Properties, entType v1.Entity, key string, opts *service.ReadOptions) (*properties.Property, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "RetrieveProperty", ctx, provider, projectId, providerID, lookupProperties, entType, key, opts) - ret0, _ := ret[0].(*properties.Property) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// RetrieveProperty indicates an expected call of RetrieveProperty. -func (mr *MockPropertiesServiceMockRecorder) RetrieveProperty(ctx, provider, projectId, providerID, lookupProperties, entType, key, opts any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RetrieveProperty", reflect.TypeOf((*MockPropertiesService)(nil).RetrieveProperty), ctx, provider, projectId, providerID, lookupProperties, entType, key, opts) -} - // SaveAllProperties mocks base method. func (m *MockPropertiesService) SaveAllProperties(ctx context.Context, entityID uuid.UUID, props *properties.Properties, opts *service.CallOptions) error { m.ctrl.T.Helper() diff --git a/internal/entities/properties/service/service.go b/internal/entities/properties/service/service.go index 48f4e54478..5260145a6f 100644 --- a/internal/entities/properties/service/service.go +++ b/internal/entities/properties/service/service.go @@ -81,14 +81,6 @@ type PropertiesService interface { RetrieveAllPropertiesForEntity(ctx context.Context, efp *models.EntityWithProperties, provMan manager.ProviderManager, opts *ReadOptions, ) error - // RetrieveProperty fetches a single property for the given entity given - // a project, provider, and identifying properties. - RetrieveProperty( - ctx context.Context, provider provifv1.Provider, projectId uuid.UUID, - providerID uuid.UUID, - lookupProperties *properties.Properties, entType minderv1.Entity, key string, - opts *ReadOptions, - ) (*properties.Property, error) // ReplaceAllProperties saves all properties for the given entity ReplaceAllProperties( ctx context.Context, entityID uuid.UUID, props *properties.Properties, opts *CallOptions, @@ -181,55 +173,6 @@ func (ps *propertiesService) RetrieveAllPropertiesForEntity( return nil } -// RetrieveProperty fetches a single property for the given entity -func (ps *propertiesService) RetrieveProperty( - ctx context.Context, provider provifv1.Provider, projectId uuid.UUID, - providerID uuid.UUID, - lookupProperties *properties.Properties, entType minderv1.Entity, key string, - opts *ReadOptions, -) (*properties.Property, error) { - l := zerolog.Ctx(ctx).With(). - Str("projectID", projectId.String()). - Str("providerID", providerID.String()). - Str("entityType", entType.String()). - Logger() - - // fetch the entity first. If there's no entity, there's no properties, go straight to provider - entID, err := getEntityIdByProperties(ctx, projectId, providerID, lookupProperties, entType, ps.store) - if err != nil && !errors.Is(err, ErrEntityNotFound) { - return nil, err - } - - // fetch properties from db - var dbProp db.Property - if entID != uuid.Nil { - dbProp, err = ps.store.GetProperty(ctx, db.GetPropertyParams{ - EntityID: entID, - Key: key, - }) - if err != nil && !errors.Is(err, ErrPropertyNotFound) { - return nil, err - } - } else { - l.Info().Msg("no entity found, skipping properties fetch") - } - - // if exists, turn into our model - if ps.isDatabasePropertyValid(dbProp, opts) { - return models.DbPropToModel(dbProp) - } - - // if not, fetch from provider - prop, err := provider.FetchProperty(ctx, lookupProperties, entType, key) - if errors.Is(err, provifv1.ErrEntityNotFound) { - return nil, fmt.Errorf("failed to fetch upstream property: %w", ErrEntityNotFound) - } else if err != nil { - return nil, err - } - - return prop, nil -} - func (ps *propertiesService) ReplaceAllProperties( ctx context.Context, entityID uuid.UUID, props *properties.Properties, opts *CallOptions, diff --git a/internal/entities/properties/service/service_test.go b/internal/entities/properties/service/service_test.go index 74937d5879..382c74d883 100644 --- a/internal/entities/properties/service/service_test.go +++ b/internal/entities/properties/service/service_test.go @@ -51,18 +51,6 @@ func withUpstreamRepoProperties(repoProperties map[string]any, entType minderv1. } } -func withUpstreamRepoProperty(key string, val any, entType minderv1.Entity) func(mock *mock_github.MockGitHub) { - return func(mock *mock_github.MockGitHub) { - prop, err := properties.NewProperty(val) - if err != nil { - panic(err) - } - mock.EXPECT(). - FetchProperty(gomock.Any(), gomock.Any(), entType, key). - Return(prop, nil) - } -} - func insertProperties(ctx context.Context, t *testing.T, store db.Store, entID uuid.UUID, props *properties.Properties) { t.Helper() @@ -95,8 +83,6 @@ type fetchParams struct { providerID uuid.UUID projectID uuid.UUID - - other map[string]any } type testCtx struct { @@ -415,196 +401,6 @@ func TestPropertiesService_SaveAllProperties(t *testing.T) { } } -func TestPropertiesService_RetrieveProperty(t *testing.T) { - t.Parallel() - - seed := time.Now().UnixNano() - - scenarios := []struct { - name string - propName string - dbSetup func(t *testing.T, store db.Store, params fetchParams) - githubSetup func(params fetchParams) githubMockBuilder - params fetchParams - expectErr string - checkResult func(t *testing.T, props *properties.Property) - opts []propertiesServiceOption - }{ - { - name: "No cache, fetch from provider", - propName: properties.RepoPropertyIsPrivate, - dbSetup: func(_ *testing.T, _ db.Store, _ fetchParams) { - }, - githubSetup: func(params fetchParams) githubMockBuilder { - return newGithubMock( - withUpstreamRepoProperty(properties.RepoPropertyIsPrivate, true, params.entType), - ) - }, - params: fetchParams{ - entType: minderv1.Entity_ENTITY_REPOSITORIES, - entName: rand.RandomName(seed), - }, - checkResult: func(t *testing.T, prop *properties.Property) { - t.Helper() - require.Equal(t, prop.GetBool(), true) - }, - }, - { - name: "Cache miss, fetch from provider", - propName: ghprop.RepoPropertyId, - dbSetup: func(t *testing.T, store db.Store, params fetchParams) { - t.Helper() - ent, err := store.CreateEntity(context.TODO(), db.CreateEntityParams{ - EntityType: entities.EntityTypeToDB(params.entType), - Name: params.entName, - ProjectID: params.projectID, - ProviderID: params.providerID, - }) - require.NoError(t, err) - - // these are different than tt.params.properties - oldPropMap := map[string]any{ - ghprop.RepoPropertyId: int64(1234), - } - insertPropertiesFromMap(context.TODO(), t, store, ent.ID, oldPropMap) - }, - githubSetup: func(params fetchParams) githubMockBuilder { - t.Helper() - return newGithubMock( - withUpstreamRepoProperty(ghprop.RepoPropertyId, int64(123), params.entType), - ) - }, - params: fetchParams{ - entType: minderv1.Entity_ENTITY_REPOSITORIES, - entName: rand.RandomName(seed), - }, - checkResult: func(t *testing.T, prop *properties.Property) { - t.Helper() - require.Equal(t, prop.GetInt64(), int64(123)) - }, - opts: []propertiesServiceOption{ - WithEntityTimeout(bypassCacheTimeout), - }, - }, - { - name: "Cache hit by name, fetch from cache", - propName: ghprop.RepoPropertyId, - dbSetup: func(t *testing.T, store db.Store, params fetchParams) { - t.Helper() - - ent, err := store.CreateEntity(context.TODO(), db.CreateEntityParams{ - EntityType: entities.EntityTypeToDB(params.entType), - Name: params.entName, - ProjectID: params.projectID, - ProviderID: params.providerID, - }) - require.NoError(t, err) - - propMap := map[string]any{ - ghprop.RepoPropertyId: int64(123), - } - props, err := properties.NewProperties(propMap) - require.NoError(t, err) - insertProperties(context.TODO(), t, store, ent.ID, props) - }, - githubSetup: func(_ fetchParams) githubMockBuilder { - return newGithubMock() - }, - params: fetchParams{ - entType: minderv1.Entity_ENTITY_REPOSITORIES, - entName: rand.RandomName(seed), - }, - checkResult: func(t *testing.T, prop *properties.Property) { - t.Helper() - - require.Equal(t, prop.GetInt64(), int64(123)) - }, - }, - { - name: "Cache hit by upstream ID, fetch from cache", - propName: properties.RepoPropertyIsArchived, - dbSetup: func(t *testing.T, store db.Store, params fetchParams) { - t.Helper() - - ent, err := store.CreateEntity(context.TODO(), db.CreateEntityParams{ - EntityType: entities.EntityTypeToDB(params.entType), - Name: params.entName, - ProjectID: params.projectID, - ProviderID: params.providerID, - }) - require.NoError(t, err) - - propMap := map[string]any{ - properties.PropertyUpstreamID: "this is an upstream ID", - properties.RepoPropertyIsArchived: true, - } - props, err := properties.NewProperties(propMap) - require.NoError(t, err) - insertProperties(context.TODO(), t, store, ent.ID, props) - }, - githubSetup: func(_ fetchParams) githubMockBuilder { - return newGithubMock() - }, - params: fetchParams{ - entType: minderv1.Entity_ENTITY_REPOSITORIES, - other: map[string]any{ - properties.PropertyUpstreamID: "this is an upstream ID", - }, - }, - checkResult: func(t *testing.T, prop *properties.Property) { - t.Helper() - - // This is checking for IsArchived - require.Equal(t, prop.GetBool(), true) - }, - }, - } - - ctx, cancel := context.WithCancel(context.Background()) - t.Cleanup(cancel) - - tctx := createTestCtx(ctx, t) - - for _, tt := range scenarios { - t.Run(tt.name, func(t *testing.T) { - t.Parallel() - - ctrl := gomock.NewController(t) - t.Cleanup(ctrl.Finish) - - tt.params.providerID = tctx.ghAppProvider.ID - tt.params.projectID = tctx.dbProj.ID - - githubSetup := tt.githubSetup(tt.params) - githubMock := githubSetup(ctrl) - - tt.dbSetup(t, tctx.testQueries, tt.params) - - propSvc := NewPropertiesService(tctx.testQueries, tt.opts...) - - propSearch := map[string]any{} - if tt.params.entName == "" { - propSearch[properties.PropertyUpstreamID] = tt.params.other[properties.PropertyUpstreamID] - } else { - propSearch[properties.PropertyName] = tt.params.entName - } - getByProps, err := properties.NewProperties(propSearch) - require.NoError(t, err) - - gotProps, err := propSvc.RetrieveProperty( - ctx, githubMock, tctx.dbProj.ID, tctx.ghAppProvider.ID, getByProps, tt.params.entType, tt.propName, nil) - - if tt.expectErr != "" { - require.Contains(t, err.Error(), tt.expectErr) - return - } - - require.NoError(t, err) - tt.checkResult(t, gotProps) - }) - } -} - func TestPropertiesService_EntityWithPropertiesByUpstreamHint(t *testing.T) { t.Parallel() diff --git a/internal/events/events.go b/internal/events/events.go index 55eb85eedf..62bf03db01 100644 --- a/internal/events/events.go +++ b/internal/events/events.go @@ -58,11 +58,16 @@ type messageInstruments struct { messageProcessingTimeHistogram metric.Int64Histogram } +const ( + // metricsNamespace is the namespace for all metrics emitted by the eventer + metricsNamespace = "minder" + // metricsSubsystem is the subsystem for all metrics emitted by the eventer + metricsSubsystem = "eventer" +) + // NewEventer creates an eventer object which isolates the watermill setup code -func NewEventer(ctx context.Context, _ openfeature.IClient, cfg *serverconfig.EventConfig) (interfaces.Interface, error) { - if cfg == nil { - return nil, errors.New("event config is nil") - } +func NewEventer( + ctx context.Context, flagClient openfeature.IClient, cfg *serverconfig.EventConfig) (interfaces.Interface, error) { if cfg == nil { return nil, errors.New("event config is nil") } @@ -79,19 +84,19 @@ func NewEventer(ctx context.Context, _ openfeature.IClient, cfg *serverconfig.Ev metricsBuilder := metrics.NewPrometheusMetricsBuilder( promgo.DefaultRegisterer, - constants.MetricsNamespace, - constants.MetricsSubsystem) + metricsNamespace, + metricsSubsystem) metricsBuilder.AddPrometheusRouterMetrics(router) zerolog.Ctx(ctx).Info().Msg("Router Metrics registered") - meter := otel.Meter("eventer") + meter := otel.Meter(metricsSubsystem) metricInstruments, err := initMetricsInstruments(meter) if err != nil { return nil, err } zerolog.Ctx(ctx).Info().Msg("Metrics Instruments registered") - pub, sub, cl, err := instantiateDriver(ctx, cfg.Driver, cfg) + pub, sub, cl, err := instantiateDriver(ctx, cfg.Driver, cfg, flagClient) if err != nil { return nil, fmt.Errorf("failed instantiating driver: %w", err) } @@ -143,6 +148,7 @@ func instantiateDriver( ctx context.Context, driver string, cfg *serverconfig.EventConfig, + flagClient openfeature.IClient, ) (message.Publisher, message.Subscriber, common.DriverCloser, error) { switch driver { case constants.GoChannelDriver: @@ -154,6 +160,9 @@ func instantiateDriver( case constants.NATSDriver: zerolog.Ctx(ctx).Info().Msg("Using NATS driver") return nats.BuildNatsChannelDriver(cfg) + case constants.FlaggedDriver: + zerolog.Ctx(ctx).Info().Msg("Using Flagged driver") + return makeFlaggedDriver(ctx, cfg, flagClient) default: zerolog.Ctx(ctx).Info().Msg("Driver unknown") return nil, nil, nil, fmt.Errorf("unknown driver %s", driver) diff --git a/internal/events/flagged_driver.go b/internal/events/flagged_driver.go new file mode 100644 index 0000000000..c7fd3f98fd --- /dev/null +++ b/internal/events/flagged_driver.go @@ -0,0 +1,153 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package events + +import ( + "context" + "fmt" + "runtime/debug" + + "github.com/ThreeDotsLabs/watermill/message" + "github.com/open-feature/go-sdk/openfeature" + "github.com/rs/zerolog" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" + + "github.com/mindersec/minder/internal/engine/engcontext" + "github.com/mindersec/minder/internal/events/common" + "github.com/mindersec/minder/internal/flags" + serverconfig "github.com/mindersec/minder/pkg/config/server" +) + +type flaggedDriver struct { + basePub message.Publisher + experimentPub message.Publisher + baseSub message.Subscriber + experimentSub message.Subscriber + + flags openfeature.IClient + publishedMessages metric.Int64Counter + readMessages metric.Int64Counter +} + +// Publish implements message.Publisher. If the message is flagged by the +// alternate_message_driver experiment, it is published to the experiment +// driver, otherwise it is published to the base driver. +func (f *flaggedDriver) Publish(topic string, messages ...*message.Message) error { + // Each message has its own context, so they _could_ be in different flag treatments + emptyContext := engcontext.EntityContext{} + for _, m := range messages { + if engcontext.EntityFromContext(m.Context()) == emptyContext { + zerolog.Ctx(m.Context()).Warn().Str("stack", string(debug.Stack())).Msg("No entity in context") + } + if flags.Bool(m.Context(), f.flags, flags.AlternateMessageDriver) { + if err := f.experimentPub.Publish(topic, m); err != nil { + return err + } + f.publishedMessages.Add(m.Context(), 1, metric.WithAttributes(attribute.Bool("experiment", true))) + } else { + if err := f.basePub.Publish(topic, m); err != nil { + return err + } + f.publishedMessages.Add(m.Context(), 1, metric.WithAttributes(attribute.Bool("experiment", false))) + } + } + return nil +} + +// Subscribe implements message.Subscriber. In this case, it should subscribe +// to both the base and experiment drivers, because we might get messages for +// either. +func (f *flaggedDriver) Subscribe(ctx context.Context, topic string) (<-chan *message.Message, error) { + out := make(chan *message.Message) + base, err := f.baseSub.Subscribe(ctx, topic) + if err != nil { + return nil, fmt.Errorf("Failed to subscribe to base: %w", err) + } + experiment, err := f.experimentSub.Subscribe(ctx, topic) + if err != nil { + return nil, fmt.Errorf("Failed to subscribe to experiment: %w", err) + } + go func() { + defer close(out) + // Cribbed from https://medium.com/justforfunc/why-are-there-nil-channels-in-go-9877cc0b2308 + for base != nil || experiment != nil { + select { + case msg, ok := <-base: + if !ok { + base = nil + continue + } + out <- msg + f.readMessages.Add(ctx, 1, metric.WithAttributes(attribute.Bool("experiment", false))) + case msg, ok := <-experiment: + if !ok { + experiment = nil + continue + } + out <- msg + f.readMessages.Add(ctx, 1, metric.WithAttributes(attribute.Bool("experiment", true))) + case <-ctx.Done(): + return + } + } + }() + return out, nil +} + +// Close implements message.Publisher and message.Subscriber. It closes all +// the drivers managed by the flagged publisher. +func (f *flaggedDriver) Close() error { + if err := f.basePub.Close(); err != nil { + return fmt.Errorf("Failed to close base publisher: %w", err) + } + if err := f.experimentPub.Close(); err != nil { + return fmt.Errorf("Failed to close experiment publisher: %w", err) + } + return nil +} + +func makeFlaggedDriver(ctx context.Context, cfg *serverconfig.EventConfig, flagClient openfeature.IClient, +) (message.Publisher, message.Subscriber, common.DriverCloser, error) { + meter := otel.Meter(metricsSubsystem) + publishedMessages, err := meter.Int64Counter("events_published") + if err != nil { + return nil, nil, nil, fmt.Errorf("Failed to create published messages counter: %w", err) + } + readMessages, err := meter.Int64Counter("events_read") + if err != nil { + return nil, nil, nil, fmt.Errorf("Failed to create read messages counter: %w", err) + } + + basePub, baseSub, baseCloser, err := instantiateDriver(ctx, cfg.Flags.MainDriver, cfg, flagClient) + if err != nil { + return nil, nil, nil, fmt.Errorf("Failed to instantiate base: %w", err) + } + experimentPub, experimentSub, experimentCloser, err := instantiateDriver(ctx, cfg.Flags.AlternateDriver, cfg, flagClient) + if err != nil { + baseCloser() + return nil, nil, nil, fmt.Errorf("Failed to instantiate experiment: %w", err) + } + + ret := &flaggedDriver{ + basePub: basePub, + experimentPub: experimentPub, + baseSub: baseSub, + experimentSub: experimentSub, + + flags: flagClient, + publishedMessages: publishedMessages, + readMessages: readMessages, + } + closer := func() { + baseCloser() + experimentCloser() + } + + return ret, ret, closer, nil +} + +var _ message.Publisher = (*flaggedDriver)(nil) +var _ message.Subscriber = (*flaggedDriver)(nil) diff --git a/internal/events/flagged_driver_test.go b/internal/events/flagged_driver_test.go new file mode 100644 index 0000000000..1683e9d074 --- /dev/null +++ b/internal/events/flagged_driver_test.go @@ -0,0 +1,220 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package events + +import ( + "context" + "fmt" + "io" + "os" + "path/filepath" + "reflect" + "sync" + "testing" + "time" + + "github.com/ThreeDotsLabs/watermill/message" + "github.com/google/uuid" + "github.com/open-feature/go-sdk/openfeature" + "go.opentelemetry.io/otel" + sdkmetric "go.opentelemetry.io/otel/sdk/metric" + "go.opentelemetry.io/otel/sdk/metric/metricdata" + + "github.com/mindersec/minder/internal/engine/engcontext" + "github.com/mindersec/minder/internal/flags" + serverconfig "github.com/mindersec/minder/pkg/config/server" + "github.com/mindersec/minder/pkg/eventer/constants" +) + +// Test_flaggedDriver_Publish tests both publish and consume of messages +// through the flaggedDriver. It uses the exported OpenTelemetry metrics +// to verify where messages were published and received; this ends up +// touching global state, so it is not parallel. +// nolint: paralleltest,tparallel +func Test_flaggedDriver_Publish(t *testing.T) { + experimentProject := uuid.New() + + flagFile := filepath.Clean(filepath.Join(t.TempDir(), "testflags.yaml")) + tempFile, err := os.Create(flagFile) + if err != nil { + t.Fatalf("failed to create temp file: %v", err) + } + t.Cleanup(func() { _ = tempFile.Close() }) + configFile := fmt.Sprintf(` +alternate_message_driver: + variations: + Base: false + NATS: true + targeting: + - query: project eq "%s" + percentage: + NATS: 100 + Base: 0 + defaultRule: + variation: Base +`, experimentProject) + if _, err := io.WriteString(tempFile, configFile); err != nil { + t.Fatalf("failed to write to temp file: %v", err) + } + + existingProvider := otel.GetMeterProvider() + reader := sdkmetric.NewManualReader() + meterProvider := sdkmetric.NewMeterProvider(sdkmetric.WithReader(reader)) + t.Cleanup(func() { + otel.SetMeterProvider(existingProvider) + if err := reader.Shutdown(context.Background()); err != nil { + t.Fatalf("failed to shutdown reader: %v", err) + } + }) + otel.SetMeterProvider(meterProvider) + // We're using t.Parallel() in the test cases, but we don't want them to + // increment counters at the same time, so we need to actually mutex their + // execution. + metricMutex := &sync.Mutex{} + + tests := []struct { + name string + sendExperiment bool + messageContext func() context.Context + }{{ + name: "No flags", + messageContext: func() context.Context { + return context.Background() + }, + }, { + name: "With context", + messageContext: func() context.Context { + return engcontext.WithEntityContext( + context.Background(), + &engcontext.EntityContext{ + Project: engcontext.Project{ID: uuid.New()}, + }, + ) + }, + }, { + name: "With experiment flag", + sendExperiment: true, + messageContext: func() context.Context { + return engcontext.WithEntityContext( + context.Background(), + &engcontext.EntityContext{ + Project: engcontext.Project{ID: experimentProject}, + }, + ) + }, + }} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + ctx := context.Background() + + config := serverconfig.Config{ + Events: serverconfig.EventConfig{ + Driver: constants.FlaggedDriver, + Flags: serverconfig.FlagDriverConfig{ + MainDriver: constants.GoChannelDriver, + AlternateDriver: constants.GoChannelDriver, + }, + GoChannel: serverconfig.GoChannelEventConfig{ + BlockPublishUntilSubscriberAck: false, + }, + }, + Flags: serverconfig.FlagsConfig{ + GoFeature: serverconfig.GoFeatureConfig{ + FilePath: flagFile, + }, + }, + } + flags.OpenFeatureProviderFromFlags(ctx, config.Flags) + flagClient := openfeature.NewClient("test") + + sendMsg := message.NewMessage("test-id", []byte(t.Name())) + sendMsg.SetContext(tt.messageContext()) + + eventer, err := NewEventer(ctx, flagClient, &config.Events) + if err != nil { + t.Fatalf("failed to setup eventer: %v", err) + } + + var recvMsg *message.Message + done := make(chan struct{}) + eventer.Register("test-topic", func(msg *message.Message) error { + recvMsg = msg + done <- struct{}{} + return nil + }) + + go eventer.Run(ctx) + t.Cleanup(func() { + if err := eventer.Close(); err != nil { + t.Fatalf("failed to close eventer: %v", err) + } + }) + <-eventer.Running() + + metricMutex.Lock() + defer metricMutex.Unlock() + + sendBefore := getMetric(t, reader, "events_published", tt.sendExperiment) + readBefore := getMetric(t, reader, "events_read", tt.sendExperiment) + + if err := eventer.Publish("test-topic", sendMsg); err != nil { + t.Fatalf("failed to publish message: %v", err) + } + + select { + case <-time.After(5 * time.Second): + t.Fatal("timed out waiting for message") + case <-done: + } + + if !reflect.DeepEqual(recvMsg.Payload, sendMsg.Payload) { + t.Errorf("received message %v does not match published message %v", recvMsg.Payload, sendMsg.Payload) + } + + sendAfter := getMetric(t, reader, "events_published", tt.sendExperiment) + readAfter := getMetric(t, reader, "events_read", tt.sendExperiment) + + if sendBefore+1 != sendAfter { + t.Errorf("send metric not as expected: started at %d, ended at %d", sendAfter, sendBefore) + } + if readBefore+1 != readAfter { + t.Errorf("read metric not as expected: started at %d, ended at %d", readAfter, readBefore) + } + }) + } +} + +func getMetric(t *testing.T, r sdkmetric.Reader, name string, experiment bool) int64 { + t.Helper() + rm := metricdata.ResourceMetrics{} + // read ResourceMetrics from r, and extract the metric with the given name, or return an empty metric + if err := r.Collect(context.Background(), &rm); err != nil { + t.Fatalf("failed to collect metrics: %v", err) + } + for _, metric := range rm.ScopeMetrics { + for _, metric := range metric.Metrics { + if metric.Name == name { + sums, ok := metric.Data.(metricdata.Sum[int64]) + if !ok { + t.Errorf("metric %q is not a Sum metric, it is a %T", name, metric.Data) + break + } + for _, series := range sums.DataPoints { + v, ok := series.Attributes.Value("experiment") + if !ok { + t.Errorf("metric %q does not have an experiment attribute", name) + continue + } + if v.AsBool() == experiment { + return series.Value + } + } + } + } + } + // It's okay if we don't have a data point with the correct attribute yet. + // Attributes are created when the first value is recorded. + return 0 +} diff --git a/internal/events/nats/natschannel.go b/internal/events/nats/natschannel.go index b650c4a6d9..687ebd656e 100644 --- a/internal/events/nats/natschannel.go +++ b/internal/events/nats/natschannel.go @@ -12,8 +12,10 @@ import ( "sync" "github.com/ThreeDotsLabs/watermill/message" + ce_observability "github.com/cloudevents/sdk-go/observability/opentelemetry/v2/client" cejsm "github.com/cloudevents/sdk-go/protocol/nats_jetstream/v2" cloudevents "github.com/cloudevents/sdk-go/v2" + "github.com/cloudevents/sdk-go/v2/client" "github.com/nats-io/nats.go" "github.com/rs/zerolog" @@ -98,7 +100,8 @@ func (c *cloudEventsNatsAdapter) ensureTopic(ctx context.Context, topic string, return nil, err } - ceSub, err := cloudevents.NewClient(consumer) + ceSub, err := cloudevents.NewClient(consumer, + client.WithObservabilityService(ce_observability.NewOTelObservabilityService())) if err != nil { _ = consumer.Close(ctx) return nil, err @@ -186,7 +189,7 @@ func (c *cloudEventsNatsAdapter) Publish(topic string, messages ...*message.Mess ctx := context.Background() subject := fmt.Sprintf("%s.%s", c.cfg.Prefix, topic) - state, err := c.ensureTopic(ctx, subject, "sender") // subject) + state, err := c.ensureTopic(ctx, subject, "sender") if err != nil { return fmt.Errorf("Error creating topic %q: %w", subject, err) } diff --git a/internal/events/nats/natschannel_test.go b/internal/events/nats/natschannel_test.go index ed3e2398fd..e21751d52a 100644 --- a/internal/events/nats/natschannel_test.go +++ b/internal/events/nats/natschannel_test.go @@ -66,10 +66,11 @@ func TestNatsChannel(t *testing.T) { // the last message published be dropped if the following Close call // is within a few milliseconds of the Publish call. time.Sleep(5 * time.Millisecond) - // Don't let sub1 see the last message, even though it's published by pub1. + // Don't let sub1 see the last two messages, even though it's published by pub1. if err := sub1.Close(); err != nil { t.Fatalf("failed to close sub1: %v", err) } + time.Sleep(5 * time.Millisecond) if err := pub2.Publish("test", m3); err != nil { t.Fatalf("failed to publish message: %v", err) } diff --git a/internal/flags/constants.go b/internal/flags/constants.go index 65c5ce8049..0b3be69d78 100644 --- a/internal/flags/constants.go +++ b/internal/flags/constants.go @@ -13,4 +13,15 @@ const ( // VulnCheckErrorTemplate enables improved evaluation details // messages in the vulncheck rule. VulnCheckErrorTemplate Experiment = "vulncheck_error_template" + // AlternateMessageDriver enables an an alternate message driver. + AlternateMessageDriver Experiment = "alternate_message_driver" + // DataSources enables data sources management. + DataSources Experiment = "data_sources" + // PRCommentAlert enables the pull request comment alert engine. + PRCommentAlert Experiment = "pr_comment_alert" + // GitPRDiffs enables the git ingester for pull requests. + GitPRDiffs Experiment = "git_pr_diffs" + // TarGzFunctions enables functions to produce tar.gz data in the rego + // evaluation environment. + TarGzFunctions Experiment = "tar_gz_functions" ) diff --git a/internal/flags/flags.go b/internal/flags/flags.go index 3a3215ee9c..0bfcfee2e0 100644 --- a/internal/flags/flags.go +++ b/internal/flags/flags.go @@ -39,6 +39,10 @@ func fromContext(ctx context.Context) openfeature.EvaluationContext { // Bool provides a simple wrapper around client.Boolean to normalize usage for Minder. func Bool(ctx context.Context, client openfeature.IClient, feature Experiment) bool { + if client == nil { + zerolog.Ctx(ctx).Debug().Str("flag", string(feature)).Msg("Bool called with client, returning false") + return false + } ret := client.Boolean(ctx, string(feature), false, fromContext(ctx)) // TODO: capture in telemetry records return ret diff --git a/internal/history/models.go b/internal/history/models.go index bdf579691f..9638bada61 100644 --- a/internal/history/models.go +++ b/internal/history/models.go @@ -177,6 +177,18 @@ type ProfileNameFilter interface { ExcludedProfileNames() []string } +// LabelFilter interface should be implemented by types implementing a +// filter on labels. +type LabelFilter interface { + // AddLabel adds a label for inclusion/exclusion in the + // filter. + AddLabel(string) error + // IncludedLabels returns the list of included labels. + IncludedLabels() []string + // ExcludedLabels returns the list of excluded labels. + ExcludedLabels() []string +} + // StatusFilter interface should be implemented by types implementing // a filter on statuses. type StatusFilter interface { @@ -235,6 +247,7 @@ type ListEvaluationFilter interface { EntityTypeFilter EntityNameFilter ProfileNameFilter + LabelFilter StatusFilter RemediationFilter AlertFilter @@ -256,6 +269,10 @@ type listEvaluationFilter struct { includedProfileNames []string // List of profile names to exclude from the selection excludedProfileNames []string + // List of included labels + includedLabels []string + // List of excluded labels + excludedLabels []string // List of statuses to include in the selection includedStatuses []string // List of statuses to exclude from the selection @@ -357,6 +374,29 @@ func (filter *listEvaluationFilter) ExcludedProfileNames() []string { return filter.excludedProfileNames } +func (filter *listEvaluationFilter) AddLabel(label string) error { + if label == "!*" { + return fmt.Errorf("%w: label", ErrInvalidIdentifier) + } + if label == "*" && len(filter.includedLabels) != 0 { + return fmt.Errorf("%w: label", ErrInvalidIdentifier) + } + if strings.HasPrefix(label, "!") { + label = strings.Split(label, "!")[1] // guaranteed to exist + filter.excludedLabels = append(filter.excludedLabels, label) + } else { + filter.includedLabels = append(filter.includedLabels, label) + } + + return nil +} +func (filter *listEvaluationFilter) IncludedLabels() []string { + return filter.includedLabels +} +func (filter *listEvaluationFilter) ExcludedLabels() []string { + return filter.excludedLabels +} + func (filter *listEvaluationFilter) AddStatus(status string) error { if strings.HasPrefix(status, "!") { status = strings.Split(status, "!")[1] // guaranteed to exist @@ -529,6 +569,22 @@ func WithProfileName(profileName string) FilterOpt { } } +// WithLabel adds a label string to the filter. It is only possible to +// filter by inclusion. The string "*" can be used to select all +// records. +func WithLabel(label string) FilterOpt { + return func(filter Filter) error { + if label == "" { + return fmt.Errorf("%w: label", ErrInvalidIdentifier) + } + inner, ok := filter.(LabelFilter) + if !ok { + return fmt.Errorf("%w: wront filter type", ErrInvalidIdentifier) + } + return inner.AddLabel(label) + } +} + // WithStatus adds a status string to the filter. The status is added // for inclusion unless it starts with a `!` characters, in which case // it is added for exclusion. diff --git a/internal/history/models_test.go b/internal/history/models_test.go index 36a11b9856..a0fbd5b663 100644 --- a/internal/history/models_test.go +++ b/internal/history/models_test.go @@ -657,6 +657,80 @@ func TestFilterOptions(t *testing.T) { err: true, }, + // label + { + name: "label in filter", + option: func(t *testing.T) FilterOpt { + t.Helper() + return WithLabel("label") + }, + filter: func(t *testing.T) Filter { + t.Helper() + return &listEvaluationFilter{} + }, + check: func(t *testing.T, filter Filter) { + t.Helper() + f := filter.(LabelFilter) + require.NotNil(t, f.IncludedLabels()) + require.Nil(t, f.ExcludedLabels()) + require.Equal(t, []string{"label"}, f.IncludedLabels()) + }, + }, + { + name: "label not in filter", + option: func(t *testing.T) FilterOpt { + t.Helper() + return WithLabel("!label") + }, + filter: func(t *testing.T) Filter { + t.Helper() + return &listEvaluationFilter{} + }, + check: func(t *testing.T, filter Filter) { + t.Helper() + f := filter.(LabelFilter) + require.Nil(t, f.IncludedLabels()) + require.NotNil(t, f.ExcludedLabels()) + require.Equal(t, []string{"label"}, f.ExcludedLabels()) + }, + }, + { + name: "empty label", + option: func(t *testing.T) FilterOpt { + t.Helper() + return WithLabel("") + }, + filter: func(t *testing.T) Filter { + t.Helper() + return &listEvaluationFilter{} + }, + err: true, + }, + { + name: "wrong label filter", + option: func(t *testing.T) FilterOpt { + t.Helper() + return WithLabel("label") + }, + filter: func(t *testing.T) Filter { + t.Helper() + return foo + }, + err: true, + }, + { + name: "label exclude star", + option: func(t *testing.T) FilterOpt { + t.Helper() + return WithLabel("!*") + }, + filter: func(t *testing.T) Filter { + t.Helper() + return foo + }, + err: true, + }, + // status { name: "status in filter", diff --git a/internal/history/service.go b/internal/history/service.go index fe606046c2..8b912f9c82 100644 --- a/internal/history/service.go +++ b/internal/history/service.go @@ -296,6 +296,9 @@ func toSQLFilter( if err := paramsFromProfileNameFilter(filter, params); err != nil { return err } + if err := paramsFromLabelFilter(filter, params); err != nil { + return err + } if err := paramsFromRemediationFilter(filter, params); err != nil { return err } @@ -369,6 +372,17 @@ func paramsFromProfileNameFilter( return nil } +func paramsFromLabelFilter( + filter LabelFilter, + params *db.ListEvaluationHistoryParams, +) error { + if len(filter.IncludedLabels()) != 0 { + params.Labels = filter.IncludedLabels() + } + // We do not exclude based on labels + return nil +} + func paramsFromRemediationFilter( filter RemediationFilter, params *db.ListEvaluationHistoryParams, diff --git a/internal/invites/service.go b/internal/invites/service.go index dd7bb2609c..f84907e95d 100644 --- a/internal/invites/service.go +++ b/internal/invites/service.go @@ -5,6 +5,7 @@ package invites import ( "context" + "errors" "fmt" "net/url" "time" @@ -132,7 +133,10 @@ func (_ *inviteService) UpdateInvite(ctx context.Context, qtx db.Querier, idClie identity.Human(), ) if err != nil { - return nil, fmt.Errorf("error generating UUID: %w", err) + if errors.Is(err, email.ErrValidationFailed) { + return nil, util.UserVisibleError(codes.InvalidArgument, "error creating email message: %v", err) + } + return nil, status.Errorf(codes.Internal, "error creating email message: %v", err) } err = eventsPub.Publish(email.TopicQueueInviteEmail, msg) if err != nil { @@ -232,7 +236,6 @@ func (_ *inviteService) RemoveInvite(ctx context.Context, qtx db.Querier, idClie func (_ *inviteService) CreateInvite(ctx context.Context, qtx db.Querier, idClient auth.Resolver, eventsPub interfaces.Publisher, emailConfig serverconfig.EmailConfig, targetProject uuid.UUID, authzRole authz.Role, inviteeEmail string, ) (*minder.Invitation, error) { - // Get the sponsor's user information (current user) currentUser, err := qtx.GetUserBySubject(ctx, jwt.GetUserSubjectFromContext(ctx)) if err != nil { @@ -305,7 +308,10 @@ func (_ *inviteService) CreateInvite(ctx context.Context, qtx db.Querier, idClie sponsorDisplay, ) if err != nil { - return nil, fmt.Errorf("error generating UUID: %w", err) + if errors.Is(err, email.ErrValidationFailed) { + return nil, util.UserVisibleError(codes.InvalidArgument, "error creating email message: %v", err) + } + return nil, status.Errorf(codes.Internal, "error creating email message: %v", err) } err = eventsPub.Publish(email.TopicQueueInviteEmail, msg) diff --git a/internal/logger/telemetry_store.go b/internal/logger/telemetry_store.go index 04e8067275..cc7e8ab4f8 100644 --- a/internal/logger/telemetry_store.go +++ b/internal/logger/telemetry_store.go @@ -129,16 +129,19 @@ func (ts *TelemetryStore) AddRuleEval( RuleType: RuleType{Name: ruleTypeName, ID: evalInfo.GetRule().RuleTypeID}, Profile: Profile{Name: evalInfo.GetProfile().Name, ID: evalInfo.GetProfile().ID}, EvalResult: errors.EvalErrorAsString(evalInfo.GetEvalErr()), - Actions: map[interfaces.ActionType]ActionEvalData{ - remediate.ActionType: { - State: evalInfo.GetActionsOnOff()[remediate.ActionType].String(), - Result: errors.RemediationErrorAsString(evalInfo.GetActionsErr().RemediateErr), - }, - alert.ActionType: { - State: evalInfo.GetActionsOnOff()[alert.ActionType].String(), - Result: errors.AlertErrorAsString(evalInfo.GetActionsErr().AlertErr), - }, - }, + Actions: map[interfaces.ActionType]ActionEvalData{}, + } + + if p := evalInfo.GetProfile(); p != nil { + actionCfg := p.ActionConfig + red.Actions[remediate.ActionType] = ActionEvalData{ + State: actionCfg.Remediate.String(), + Result: errors.RemediationErrorAsString(evalInfo.GetActionsErr().RemediateErr), + } + red.Actions[alert.ActionType] = ActionEvalData{ + State: actionCfg.Alert.String(), + Result: errors.AlertErrorAsString(evalInfo.GetActionsErr().AlertErr), + } } ts.Evals = append(ts.Evals, red) diff --git a/internal/logger/telemetry_store_test.go b/internal/logger/telemetry_store_test.go index 0e7b59f433..bde9620ed0 100644 --- a/internal/logger/telemetry_store_test.go +++ b/internal/logger/telemetry_store_test.go @@ -13,8 +13,6 @@ import ( "github.com/google/uuid" "github.com/rs/zerolog" - "github.com/mindersec/minder/internal/engine/actions/alert" - "github.com/mindersec/minder/internal/engine/actions/remediate" enginerr "github.com/mindersec/minder/internal/engine/errors" engif "github.com/mindersec/minder/internal/engine/interfaces" "github.com/mindersec/minder/internal/logger" @@ -42,12 +40,12 @@ func TestTelemetryStore_Record(t *testing.T) { ep.Profile = &models.ProfileAggregate{ Name: "artifact_profile", ID: testUUID, + ActionConfig: models.ActionConfiguration{ + Remediate: models.ActionOptOff, + Alert: models.ActionOptOn, + }, } ep.SetEvalErr(enginerr.NewErrEvaluationFailed("evaluation failure reason")) - ep.SetActionsOnOff(map[engif.ActionType]models.ActionOpt{ - alert.ActionType: models.ActionOptOn, - remediate.ActionType: models.ActionOptOff, - }) ep.SetActionsErr(context.Background(), enginerr.ActionsError{ RemediateErr: nil, AlertErr: enginerr.ErrActionSkipped, @@ -70,12 +68,12 @@ func TestTelemetryStore_Record(t *testing.T) { ep.Profile = &models.ProfileAggregate{ Name: "artifact_profile", ID: testUUID, + ActionConfig: models.ActionConfiguration{ + Remediate: models.ActionOptOn, + Alert: models.ActionOptOff, + }, } ep.SetEvalErr(enginerr.NewErrEvaluationFailed("evaluation failure reason")) - ep.SetActionsOnOff(map[engif.ActionType]models.ActionOpt{ - alert.ActionType: models.ActionOptOff, - remediate.ActionType: models.ActionOptOn, - }) ep.SetActionsErr(context.Background(), enginerr.ActionsError{ RemediateErr: nil, AlertErr: enginerr.ErrActionSkipped, diff --git a/internal/projects/creator.go b/internal/projects/creator.go index 6d1797f6bf..13b4f422a8 100644 --- a/internal/projects/creator.go +++ b/internal/projects/creator.go @@ -39,17 +39,20 @@ type projectCreator struct { authzClient authz.Client marketplace marketplaces.Marketplace profilesCfg *server.DefaultProfilesConfig + featuresCfg *server.FeaturesConfig } // NewProjectCreator creates a new instance of the project creator func NewProjectCreator(authzClient authz.Client, marketplace marketplaces.Marketplace, profilesCfg *server.DefaultProfilesConfig, + featuresCfg *server.FeaturesConfig, ) ProjectCreator { return &projectCreator{ authzClient: authzClient, marketplace: marketplace, profilesCfg: profilesCfg, + featuresCfg: featuresCfg, } } @@ -105,6 +108,15 @@ func (p *projectCreator) ProvisionSelfEnrolledProject( return nil, fmt.Errorf("failed to create default project: %v", err) } + // Retrieve the membership-to-feature mapping from the configuration + projectFeatures := p.featuresCfg.GetFeaturesForMemberships(ctx) + if err := qtx.CreateEntitlements(ctx, db.CreateEntitlementsParams{ + Features: projectFeatures, + ProjectID: project.ID, + }); err != nil { + return nil, fmt.Errorf("error creating entitlements: %w", err) + } + // Enable any default profiles and rule types in the project. // For now, we subscribe to a single bundle and a single profile. // Both are specified in the service config. diff --git a/internal/projects/creator_test.go b/internal/projects/creator_test.go index 8c890038bb..edae7a922f 100644 --- a/internal/projects/creator_test.go +++ b/internal/projects/creator_test.go @@ -6,13 +6,17 @@ package projects_test import ( "context" "fmt" + "reflect" "testing" "github.com/google/uuid" + "github.com/lestrrat-go/jwx/v2/jwt/openid" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "go.uber.org/mock/gomock" mockdb "github.com/mindersec/minder/database/mock" + "github.com/mindersec/minder/internal/auth/jwt" "github.com/mindersec/minder/internal/authz/mock" "github.com/mindersec/minder/internal/db" "github.com/mindersec/minder/internal/marketplaces" @@ -33,10 +37,28 @@ func TestProvisionSelfEnrolledProject(t *testing.T) { Return(db.Project{ ID: uuid.New(), }, nil) + mockStore.EXPECT().CreateEntitlements(gomock.Any(), gomock.Any()). + DoAndReturn(func(_ context.Context, params db.CreateEntitlementsParams) error { + expectedFeatures := []string{"featureA", "featureB"} + if !reflect.DeepEqual(params.Features, expectedFeatures) { + t.Errorf("expected features %v, got %v", expectedFeatures, params.Features) + } + return nil + }) + + ctx := prepareTestToken(context.Background(), t, []any{ + "teamA", + "teamB", + "teamC", + }) + + creator := projects.NewProjectCreator(authzClient, marketplaces.NewNoopMarketplace(), &server.DefaultProfilesConfig{}, &server.FeaturesConfig{ + MembershipFeatureMapping: map[string]string{ + "teamA": "featureA", + "teamB": "featureB", + }, + }) - ctx := context.Background() - - creator := projects.NewProjectCreator(authzClient, marketplaces.NewNoopMarketplace(), &server.DefaultProfilesConfig{}) _, err := creator.ProvisionSelfEnrolledProject( ctx, mockStore, @@ -62,8 +84,7 @@ func TestProvisionSelfEnrolledProjectFailsWritingProjectToDB(t *testing.T) { Return(db.Project{}, fmt.Errorf("failed to create project")) ctx := context.Background() - - creator := projects.NewProjectCreator(authzClient, marketplaces.NewNoopMarketplace(), &server.DefaultProfilesConfig{}) + creator := projects.NewProjectCreator(authzClient, marketplaces.NewNoopMarketplace(), &server.DefaultProfilesConfig{}, &server.FeaturesConfig{}) _, err := creator.ProvisionSelfEnrolledProject( ctx, mockStore, @@ -94,7 +115,7 @@ func TestProvisionSelfEnrolledProjectInvalidName(t *testing.T) { mockStore := mockdb.NewMockStore(ctrl) ctx := context.Background() - creator := projects.NewProjectCreator(authzClient, marketplaces.NewNoopMarketplace(), &server.DefaultProfilesConfig{}) + creator := projects.NewProjectCreator(authzClient, marketplaces.NewNoopMarketplace(), &server.DefaultProfilesConfig{}, &server.FeaturesConfig{}) for _, tc := range testCases { _, err := creator.ProvisionSelfEnrolledProject( @@ -107,3 +128,15 @@ func TestProvisionSelfEnrolledProjectInvalidName(t *testing.T) { } } + +// prepareTestToken creates a JWT token with the specified roles and returns the context with the token. +func prepareTestToken(ctx context.Context, t *testing.T, roles []any) context.Context { + t.Helper() + + token := openid.New() + require.NoError(t, token.Set("realm_access", map[string]any{ + "roles": roles, + })) + + return jwt.WithAuthTokenContext(ctx, token) +} diff --git a/internal/proto/internal.pb.go b/internal/proto/internal.pb.go index 43f5ed9118..39252daa85 100644 --- a/internal/proto/internal.pb.go +++ b/internal/proto/internal.pb.go @@ -3,7 +3,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.1 // protoc (unknown) // source: internal.proto @@ -80,13 +80,12 @@ func (DepEcosystem) EnumDescriptor() ([]byte, []int) { } type Dependency struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ecosystem DepEcosystem `protobuf:"varint,1,opt,name=ecosystem,proto3,enum=internal.DepEcosystem" json:"ecosystem,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` unknownFields protoimpl.UnknownFields - - Ecosystem DepEcosystem `protobuf:"varint,1,opt,name=ecosystem,proto3,enum=internal.DepEcosystem" json:"ecosystem,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Dependency) Reset() { @@ -140,18 +139,158 @@ func (x *Dependency) GetVersion() string { return "" } +type PullRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"` // The full URL to the PR + CommitSha string `protobuf:"bytes,2,opt,name=commit_sha,json=commitSha,proto3" json:"commit_sha,omitempty"` // Commit SHA of the PR HEAD. Will be useful to submit a review + Number int64 `protobuf:"varint,3,opt,name=number,proto3" json:"number,omitempty"` // The sequential PR number (not the DB PK!) + RepoOwner string `protobuf:"bytes,4,opt,name=repo_owner,json=repoOwner,proto3" json:"repo_owner,omitempty"` // The owner of the repo, will be used to submit a review + RepoName string `protobuf:"bytes,5,opt,name=repo_name,json=repoName,proto3" json:"repo_name,omitempty"` // The name of the repo, will be used to submit a review + AuthorId int64 `protobuf:"varint,6,opt,name=author_id,json=authorId,proto3" json:"author_id,omitempty"` // The author of the PR, will be used to check if we can request changes + Action string `protobuf:"bytes,7,opt,name=action,proto3" json:"action,omitempty"` // The action that triggered the webhook + Context *v1.Context `protobuf:"bytes,8,opt,name=context,proto3" json:"context,omitempty"` + // properties is a map of properties of the entity. + Properties *structpb.Struct `protobuf:"bytes,9,opt,name=properties,proto3" json:"properties,omitempty"` + BaseCloneUrl string `protobuf:"bytes,10,opt,name=base_clone_url,json=baseCloneUrl,proto3" json:"base_clone_url,omitempty"` // URL used to clone the base repository + TargetCloneUrl string `protobuf:"bytes,11,opt,name=target_clone_url,json=targetCloneUrl,proto3" json:"target_clone_url,omitempty"` // URL used to clone the target repository + BaseRef string `protobuf:"bytes,12,opt,name=base_ref,json=baseRef,proto3" json:"base_ref,omitempty"` // The base ref of the PR + TargetRef string `protobuf:"bytes,13,opt,name=target_ref,json=targetRef,proto3" json:"target_ref,omitempty"` // The target ref of the PR + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PullRequest) Reset() { + *x = PullRequest{} + mi := &file_internal_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PullRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PullRequest) ProtoMessage() {} + +func (x *PullRequest) ProtoReflect() protoreflect.Message { + mi := &file_internal_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PullRequest.ProtoReflect.Descriptor instead. +func (*PullRequest) Descriptor() ([]byte, []int) { + return file_internal_proto_rawDescGZIP(), []int{1} +} + +func (x *PullRequest) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *PullRequest) GetCommitSha() string { + if x != nil { + return x.CommitSha + } + return "" +} + +func (x *PullRequest) GetNumber() int64 { + if x != nil { + return x.Number + } + return 0 +} + +func (x *PullRequest) GetRepoOwner() string { + if x != nil { + return x.RepoOwner + } + return "" +} + +func (x *PullRequest) GetRepoName() string { + if x != nil { + return x.RepoName + } + return "" +} + +func (x *PullRequest) GetAuthorId() int64 { + if x != nil { + return x.AuthorId + } + return 0 +} + +func (x *PullRequest) GetAction() string { + if x != nil { + return x.Action + } + return "" +} + +func (x *PullRequest) GetContext() *v1.Context { + if x != nil { + return x.Context + } + return nil +} + +func (x *PullRequest) GetProperties() *structpb.Struct { + if x != nil { + return x.Properties + } + return nil +} + +func (x *PullRequest) GetBaseCloneUrl() string { + if x != nil { + return x.BaseCloneUrl + } + return "" +} + +func (x *PullRequest) GetTargetCloneUrl() string { + if x != nil { + return x.TargetCloneUrl + } + return "" +} + +func (x *PullRequest) GetBaseRef() string { + if x != nil { + return x.BaseRef + } + return "" +} + +func (x *PullRequest) GetTargetRef() string { + if x != nil { + return x.TargetRef + } + return "" +} + type PrDependencies struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Pr *PullRequest `protobuf:"bytes,1,opt,name=pr,proto3" json:"pr,omitempty"` + Deps []*PrDependencies_ContextualDependency `protobuf:"bytes,2,rep,name=deps,proto3" json:"deps,omitempty"` unknownFields protoimpl.UnknownFields - - Pr *v1.PullRequest `protobuf:"bytes,1,opt,name=pr,proto3" json:"pr,omitempty"` - Deps []*PrDependencies_ContextualDependency `protobuf:"bytes,2,rep,name=deps,proto3" json:"deps,omitempty"` + sizeCache protoimpl.SizeCache } func (x *PrDependencies) Reset() { *x = PrDependencies{} - mi := &file_internal_proto_msgTypes[1] + mi := &file_internal_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -163,7 +302,7 @@ func (x *PrDependencies) String() string { func (*PrDependencies) ProtoMessage() {} func (x *PrDependencies) ProtoReflect() protoreflect.Message { - mi := &file_internal_proto_msgTypes[1] + mi := &file_internal_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -176,10 +315,10 @@ func (x *PrDependencies) ProtoReflect() protoreflect.Message { // Deprecated: Use PrDependencies.ProtoReflect.Descriptor instead. func (*PrDependencies) Descriptor() ([]byte, []int) { - return file_internal_proto_rawDescGZIP(), []int{1} + return file_internal_proto_rawDescGZIP(), []int{2} } -func (x *PrDependencies) GetPr() *v1.PullRequest { +func (x *PrDependencies) GetPr() *PullRequest { if x != nil { return x.Pr } @@ -194,17 +333,16 @@ func (x *PrDependencies) GetDeps() []*PrDependencies_ContextualDependency { } type PrContents struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Pr *PullRequest `protobuf:"bytes,1,opt,name=pr,proto3" json:"pr,omitempty"` + Files []*PrContents_File `protobuf:"bytes,2,rep,name=files,proto3" json:"files,omitempty"` unknownFields protoimpl.UnknownFields - - Pr *v1.PullRequest `protobuf:"bytes,1,opt,name=pr,proto3" json:"pr,omitempty"` - Files []*PrContents_File `protobuf:"bytes,2,rep,name=files,proto3" json:"files,omitempty"` + sizeCache protoimpl.SizeCache } func (x *PrContents) Reset() { *x = PrContents{} - mi := &file_internal_proto_msgTypes[2] + mi := &file_internal_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -216,7 +354,7 @@ func (x *PrContents) String() string { func (*PrContents) ProtoMessage() {} func (x *PrContents) ProtoReflect() protoreflect.Message { - mi := &file_internal_proto_msgTypes[2] + mi := &file_internal_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -229,10 +367,10 @@ func (x *PrContents) ProtoReflect() protoreflect.Message { // Deprecated: Use PrContents.ProtoReflect.Descriptor instead. func (*PrContents) Descriptor() ([]byte, []int) { - return file_internal_proto_rawDescGZIP(), []int{2} + return file_internal_proto_rawDescGZIP(), []int{3} } -func (x *PrContents) GetPr() *v1.PullRequest { +func (x *PrContents) GetPr() *PullRequest { if x != nil { return x.Pr } @@ -247,19 +385,18 @@ func (x *PrContents) GetFiles() []*PrContents_File { } type SelectorProvider struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // the name of the provider, e.g. github-app-jakubtestorg Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // the class of the provider, e.g. github-app - Class string `protobuf:"bytes,2,opt,name=class,proto3" json:"class,omitempty"` + Class string `protobuf:"bytes,2,opt,name=class,proto3" json:"class,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SelectorProvider) Reset() { *x = SelectorProvider{} - mi := &file_internal_proto_msgTypes[3] + mi := &file_internal_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -271,7 +408,7 @@ func (x *SelectorProvider) String() string { func (*SelectorProvider) ProtoMessage() {} func (x *SelectorProvider) ProtoReflect() protoreflect.Message { - mi := &file_internal_proto_msgTypes[3] + mi := &file_internal_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -284,7 +421,7 @@ func (x *SelectorProvider) ProtoReflect() protoreflect.Message { // Deprecated: Use SelectorProvider.ProtoReflect.Descriptor instead. func (*SelectorProvider) Descriptor() ([]byte, []int) { - return file_internal_proto_rawDescGZIP(), []int{3} + return file_internal_proto_rawDescGZIP(), []int{4} } func (x *SelectorProvider) GetName() string { @@ -302,10 +439,7 @@ func (x *SelectorProvider) GetClass() string { } type SelectorRepository struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // the full name of the repository, e.g. mindersec/minder Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // the provider of the repository @@ -315,13 +449,15 @@ type SelectorRepository struct { IsFork *bool `protobuf:"varint,3,opt,name=is_fork,json=isFork,proto3,oneof" json:"is_fork,omitempty"` // is_private is true if the repository is private, nil if "don't know" or rather // not applicable to this provider - IsPrivate *bool `protobuf:"varint,4,opt,name=is_private,json=isPrivate,proto3,oneof" json:"is_private,omitempty"` - Properties *structpb.Struct `protobuf:"bytes,5,opt,name=properties,proto3" json:"properties,omitempty"` + IsPrivate *bool `protobuf:"varint,4,opt,name=is_private,json=isPrivate,proto3,oneof" json:"is_private,omitempty"` + Properties *structpb.Struct `protobuf:"bytes,5,opt,name=properties,proto3" json:"properties,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SelectorRepository) Reset() { *x = SelectorRepository{} - mi := &file_internal_proto_msgTypes[4] + mi := &file_internal_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -333,7 +469,7 @@ func (x *SelectorRepository) String() string { func (*SelectorRepository) ProtoMessage() {} func (x *SelectorRepository) ProtoReflect() protoreflect.Message { - mi := &file_internal_proto_msgTypes[4] + mi := &file_internal_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -346,7 +482,7 @@ func (x *SelectorRepository) ProtoReflect() protoreflect.Message { // Deprecated: Use SelectorRepository.ProtoReflect.Descriptor instead. func (*SelectorRepository) Descriptor() ([]byte, []int) { - return file_internal_proto_rawDescGZIP(), []int{4} + return file_internal_proto_rawDescGZIP(), []int{5} } func (x *SelectorRepository) GetName() string { @@ -385,22 +521,21 @@ func (x *SelectorRepository) GetProperties() *structpb.Struct { } type SelectorArtifact struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // the full name of the artifact, e.g. mindersec/minder-server Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // the provider of the artifact Provider *SelectorProvider `protobuf:"bytes,2,opt,name=provider,proto3" json:"provider,omitempty"` // the type of the artifact, e.g. "container" - Type string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"` - Properties *structpb.Struct `protobuf:"bytes,5,opt,name=properties,proto3" json:"properties,omitempty"` + Type string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"` + Properties *structpb.Struct `protobuf:"bytes,5,opt,name=properties,proto3" json:"properties,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SelectorArtifact) Reset() { *x = SelectorArtifact{} - mi := &file_internal_proto_msgTypes[5] + mi := &file_internal_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -412,7 +547,7 @@ func (x *SelectorArtifact) String() string { func (*SelectorArtifact) ProtoMessage() {} func (x *SelectorArtifact) ProtoReflect() protoreflect.Message { - mi := &file_internal_proto_msgTypes[5] + mi := &file_internal_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -425,7 +560,7 @@ func (x *SelectorArtifact) ProtoReflect() protoreflect.Message { // Deprecated: Use SelectorArtifact.ProtoReflect.Descriptor instead. func (*SelectorArtifact) Descriptor() ([]byte, []int) { - return file_internal_proto_rawDescGZIP(), []int{5} + return file_internal_proto_rawDescGZIP(), []int{6} } func (x *SelectorArtifact) GetName() string { @@ -457,21 +592,20 @@ func (x *SelectorArtifact) GetProperties() *structpb.Struct { } type SelectorPullRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // the full name of the pr, e.g. mindersec/minder-server/123 Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // the provider of the pull request Provider *SelectorProvider `protobuf:"bytes,3,opt,name=provider,proto3" json:"provider,omitempty"` // provider-specific properties - Properties *structpb.Struct `protobuf:"bytes,2,opt,name=properties,proto3" json:"properties,omitempty"` + Properties *structpb.Struct `protobuf:"bytes,2,opt,name=properties,proto3" json:"properties,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SelectorPullRequest) Reset() { *x = SelectorPullRequest{} - mi := &file_internal_proto_msgTypes[6] + mi := &file_internal_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -483,7 +617,7 @@ func (x *SelectorPullRequest) String() string { func (*SelectorPullRequest) ProtoMessage() {} func (x *SelectorPullRequest) ProtoReflect() protoreflect.Message { - mi := &file_internal_proto_msgTypes[6] + mi := &file_internal_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -496,7 +630,7 @@ func (x *SelectorPullRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SelectorPullRequest.ProtoReflect.Descriptor instead. func (*SelectorPullRequest) Descriptor() ([]byte, []int) { - return file_internal_proto_rawDescGZIP(), []int{6} + return file_internal_proto_rawDescGZIP(), []int{7} } func (x *SelectorPullRequest) GetName() string { @@ -521,26 +655,25 @@ func (x *SelectorPullRequest) GetProperties() *structpb.Struct { } type SelectorEntity struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // one of repository, pull_request, artifact (see oneof entity) EntityType v1.Entity `protobuf:"varint,1,opt,name=entity_type,json=entityType,proto3,enum=minder.v1.Entity" json:"entity_type,omitempty"` // the name of the entity, same as the name in the entity message Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` Provider *SelectorProvider `protobuf:"bytes,3,opt,name=provider,proto3" json:"provider,omitempty"` - // Types that are assignable to Entity: + // Types that are valid to be assigned to Entity: // // *SelectorEntity_Repository // *SelectorEntity_Artifact // *SelectorEntity_PullRequest - Entity isSelectorEntity_Entity `protobuf_oneof:"entity"` + Entity isSelectorEntity_Entity `protobuf_oneof:"entity"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SelectorEntity) Reset() { *x = SelectorEntity{} - mi := &file_internal_proto_msgTypes[7] + mi := &file_internal_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -552,7 +685,7 @@ func (x *SelectorEntity) String() string { func (*SelectorEntity) ProtoMessage() {} func (x *SelectorEntity) ProtoReflect() protoreflect.Message { - mi := &file_internal_proto_msgTypes[7] + mi := &file_internal_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -565,7 +698,7 @@ func (x *SelectorEntity) ProtoReflect() protoreflect.Message { // Deprecated: Use SelectorEntity.ProtoReflect.Descriptor instead. func (*SelectorEntity) Descriptor() ([]byte, []int) { - return file_internal_proto_rawDescGZIP(), []int{7} + return file_internal_proto_rawDescGZIP(), []int{8} } func (x *SelectorEntity) GetEntityType() v1.Entity { @@ -589,30 +722,36 @@ func (x *SelectorEntity) GetProvider() *SelectorProvider { return nil } -func (m *SelectorEntity) GetEntity() isSelectorEntity_Entity { - if m != nil { - return m.Entity +func (x *SelectorEntity) GetEntity() isSelectorEntity_Entity { + if x != nil { + return x.Entity } return nil } func (x *SelectorEntity) GetRepository() *SelectorRepository { - if x, ok := x.GetEntity().(*SelectorEntity_Repository); ok { - return x.Repository + if x != nil { + if x, ok := x.Entity.(*SelectorEntity_Repository); ok { + return x.Repository + } } return nil } func (x *SelectorEntity) GetArtifact() *SelectorArtifact { - if x, ok := x.GetEntity().(*SelectorEntity_Artifact); ok { - return x.Artifact + if x != nil { + if x, ok := x.Entity.(*SelectorEntity_Artifact); ok { + return x.Artifact + } } return nil } func (x *SelectorEntity) GetPullRequest() *SelectorPullRequest { - if x, ok := x.GetEntity().(*SelectorEntity_PullRequest); ok { - return x.PullRequest + if x != nil { + if x, ok := x.Entity.(*SelectorEntity_PullRequest); ok { + return x.PullRequest + } } return nil } @@ -640,17 +779,16 @@ func (*SelectorEntity_Artifact) isSelectorEntity_Entity() {} func (*SelectorEntity_PullRequest) isSelectorEntity_Entity() {} type PrDependencies_ContextualDependency struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Dep *Dependency `protobuf:"bytes,1,opt,name=dep,proto3" json:"dep,omitempty"` + File *PrDependencies_ContextualDependency_FilePatch `protobuf:"bytes,2,opt,name=file,proto3" json:"file,omitempty"` unknownFields protoimpl.UnknownFields - - Dep *Dependency `protobuf:"bytes,1,opt,name=dep,proto3" json:"dep,omitempty"` - File *PrDependencies_ContextualDependency_FilePatch `protobuf:"bytes,2,opt,name=file,proto3" json:"file,omitempty"` + sizeCache protoimpl.SizeCache } func (x *PrDependencies_ContextualDependency) Reset() { *x = PrDependencies_ContextualDependency{} - mi := &file_internal_proto_msgTypes[8] + mi := &file_internal_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -662,7 +800,7 @@ func (x *PrDependencies_ContextualDependency) String() string { func (*PrDependencies_ContextualDependency) ProtoMessage() {} func (x *PrDependencies_ContextualDependency) ProtoReflect() protoreflect.Message { - mi := &file_internal_proto_msgTypes[8] + mi := &file_internal_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -675,7 +813,7 @@ func (x *PrDependencies_ContextualDependency) ProtoReflect() protoreflect.Messag // Deprecated: Use PrDependencies_ContextualDependency.ProtoReflect.Descriptor instead. func (*PrDependencies_ContextualDependency) Descriptor() ([]byte, []int) { - return file_internal_proto_rawDescGZIP(), []int{1, 0} + return file_internal_proto_rawDescGZIP(), []int{2, 0} } func (x *PrDependencies_ContextualDependency) GetDep() *Dependency { @@ -693,17 +831,16 @@ func (x *PrDependencies_ContextualDependency) GetFile() *PrDependencies_Contextu } type PrDependencies_ContextualDependency_FilePatch struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // file changed, e.g. package-lock.json + PatchUrl string `protobuf:"bytes,2,opt,name=patch_url,json=patchUrl,proto3" json:"patch_url,omitempty"` // points to the the raw patchfile unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // file changed, e.g. package-lock.json - PatchUrl string `protobuf:"bytes,2,opt,name=patch_url,json=patchUrl,proto3" json:"patch_url,omitempty"` // points to the the raw patchfile + sizeCache protoimpl.SizeCache } func (x *PrDependencies_ContextualDependency_FilePatch) Reset() { *x = PrDependencies_ContextualDependency_FilePatch{} - mi := &file_internal_proto_msgTypes[9] + mi := &file_internal_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -715,7 +852,7 @@ func (x *PrDependencies_ContextualDependency_FilePatch) String() string { func (*PrDependencies_ContextualDependency_FilePatch) ProtoMessage() {} func (x *PrDependencies_ContextualDependency_FilePatch) ProtoReflect() protoreflect.Message { - mi := &file_internal_proto_msgTypes[9] + mi := &file_internal_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -728,7 +865,7 @@ func (x *PrDependencies_ContextualDependency_FilePatch) ProtoReflect() protorefl // Deprecated: Use PrDependencies_ContextualDependency_FilePatch.ProtoReflect.Descriptor instead. func (*PrDependencies_ContextualDependency_FilePatch) Descriptor() ([]byte, []int) { - return file_internal_proto_rawDescGZIP(), []int{1, 0, 0} + return file_internal_proto_rawDescGZIP(), []int{2, 0, 0} } func (x *PrDependencies_ContextualDependency_FilePatch) GetName() string { @@ -746,18 +883,17 @@ func (x *PrDependencies_ContextualDependency_FilePatch) GetPatchUrl() string { } type PrContents_File struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + FilePatchUrl string `protobuf:"bytes,2,opt,name=file_patch_url,json=filePatchUrl,proto3" json:"file_patch_url,omitempty"` + PatchLines []*PrContents_File_Line `protobuf:"bytes,3,rep,name=patch_lines,json=patchLines,proto3" json:"patch_lines,omitempty"` unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - FilePatchUrl string `protobuf:"bytes,2,opt,name=file_patch_url,json=filePatchUrl,proto3" json:"file_patch_url,omitempty"` - PatchLines []*PrContents_File_Line `protobuf:"bytes,3,rep,name=patch_lines,json=patchLines,proto3" json:"patch_lines,omitempty"` + sizeCache protoimpl.SizeCache } func (x *PrContents_File) Reset() { *x = PrContents_File{} - mi := &file_internal_proto_msgTypes[10] + mi := &file_internal_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -769,7 +905,7 @@ func (x *PrContents_File) String() string { func (*PrContents_File) ProtoMessage() {} func (x *PrContents_File) ProtoReflect() protoreflect.Message { - mi := &file_internal_proto_msgTypes[10] + mi := &file_internal_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -782,7 +918,7 @@ func (x *PrContents_File) ProtoReflect() protoreflect.Message { // Deprecated: Use PrContents_File.ProtoReflect.Descriptor instead. func (*PrContents_File) Descriptor() ([]byte, []int) { - return file_internal_proto_rawDescGZIP(), []int{2, 0} + return file_internal_proto_rawDescGZIP(), []int{3, 0} } func (x *PrContents_File) GetName() string { @@ -807,19 +943,18 @@ func (x *PrContents_File) GetPatchLines() []*PrContents_File_Line { } type PrContents_File_Line struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Deliberately left as an int32: a diff with more than 2^31 lines // could lead to various problems while processing. - LineNumber int32 `protobuf:"varint,1,opt,name=line_number,json=lineNumber,proto3" json:"line_number,omitempty"` - Content string `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` + LineNumber int32 `protobuf:"varint,1,opt,name=line_number,json=lineNumber,proto3" json:"line_number,omitempty"` + Content string `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PrContents_File_Line) Reset() { *x = PrContents_File_Line{} - mi := &file_internal_proto_msgTypes[11] + mi := &file_internal_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -831,7 +966,7 @@ func (x *PrContents_File_Line) String() string { func (*PrContents_File_Line) ProtoMessage() {} func (x *PrContents_File_Line) ProtoReflect() protoreflect.Message { - mi := &file_internal_proto_msgTypes[11] + mi := &file_internal_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -844,7 +979,7 @@ func (x *PrContents_File_Line) ProtoReflect() protoreflect.Message { // Deprecated: Use PrContents_File_Line.ProtoReflect.Descriptor instead. func (*PrContents_File_Line) Descriptor() ([]byte, []int) { - return file_internal_proto_rawDescGZIP(), []int{2, 0, 0} + return file_internal_proto_rawDescGZIP(), []int{3, 0, 0} } func (x *PrContents_File_Line) GetLineNumber() int32 { @@ -876,119 +1011,146 @@ var file_internal_proto_rawDesc = []byte{ 0x73, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0xc7, 0x02, 0x0a, 0x0e, 0x50, 0x72, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, - 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x02, 0x70, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, - 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x02, 0x70, 0x72, 0x12, 0x41, 0x0a, - 0x04, 0x64, 0x65, 0x70, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x50, 0x72, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, - 0x6e, 0x63, 0x69, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, - 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x04, 0x64, 0x65, 0x70, 0x73, - 0x1a, 0xc9, 0x01, 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x44, - 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x26, 0x0a, 0x03, 0x64, 0x65, 0x70, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x03, 0x64, 0x65, - 0x70, 0x12, 0x4b, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x37, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x50, 0x72, 0x44, 0x65, 0x70, - 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x75, 0x61, 0x6c, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x2e, 0x46, - 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x63, 0x68, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x1a, 0x3c, - 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x63, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x63, 0x68, 0x55, 0x72, 0x6c, 0x22, 0xac, 0x02, 0x0a, - 0x0a, 0x50, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x02, 0x70, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, - 0x02, 0x70, 0x72, 0x12, 0x2f, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x50, 0x72, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x66, - 0x69, 0x6c, 0x65, 0x73, 0x1a, 0xc4, 0x01, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6c, 0x65, 0x50, - 0x61, 0x74, 0x63, 0x68, 0x55, 0x72, 0x6c, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x61, 0x74, 0x63, 0x68, - 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x50, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x0a, 0x70, 0x61, - 0x74, 0x63, 0x68, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x1a, 0x41, 0x0a, 0x04, 0x4c, 0x69, 0x6e, 0x65, - 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3c, 0x0a, 0x10, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x22, 0xf6, 0x01, 0x0a, 0x12, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, + 0x6f, 0x6e, 0x22, 0xb8, 0x03, 0x0a, 0x0b, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x73, + 0x68, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x53, 0x68, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x72, + 0x65, 0x70, 0x6f, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x72, 0x65, 0x70, 0x6f, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, + 0x70, 0x6f, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x70, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x61, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x6c, 0x6f, 0x6e, + 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x61, 0x73, + 0x65, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6c, 0x6f, 0x6e, 0x65, + 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x66, 0x12, 0x1d, + 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x66, 0x22, 0xc6, 0x02, + 0x0a, 0x0e, 0x50, 0x72, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, + 0x12, 0x25, 0x0a, 0x02, 0x70, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x52, 0x02, 0x70, 0x72, 0x12, 0x41, 0x0a, 0x04, 0x64, 0x65, 0x70, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x50, 0x72, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x2e, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, + 0x65, 0x6e, 0x63, 0x79, 0x52, 0x04, 0x64, 0x65, 0x70, 0x73, 0x1a, 0xc9, 0x01, 0x0a, 0x14, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, + 0x6e, 0x63, 0x79, 0x12, 0x26, 0x0a, 0x03, 0x64, 0x65, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x44, 0x65, 0x70, 0x65, + 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x03, 0x64, 0x65, 0x70, 0x12, 0x4b, 0x0a, 0x04, 0x66, + 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x50, 0x72, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, + 0x69, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x44, 0x65, + 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, + 0x63, 0x68, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x1a, 0x3c, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, + 0x50, 0x61, 0x74, 0x63, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x74, + 0x63, 0x68, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, + 0x74, 0x63, 0x68, 0x55, 0x72, 0x6c, 0x22, 0xab, 0x02, 0x0a, 0x0a, 0x50, 0x72, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x02, 0x70, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x50, 0x75, 0x6c, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x02, 0x70, 0x72, 0x12, 0x2f, 0x0a, 0x05, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x50, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x1a, 0xc4, 0x01, + 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x69, + 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x63, 0x68, 0x55, 0x72, 0x6c, + 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x50, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, + 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x69, 0x6e, 0x65, + 0x73, 0x1a, 0x41, 0x0a, 0x04, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, + 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3c, 0x0a, 0x10, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x22, 0xf6, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, + 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x08, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x6b, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x69, 0x73, 0x46, 0x6f, 0x72, 0x6b, + 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x09, 0x69, 0x73, 0x50, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x69, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x6b, 0x42, 0x0d, 0x0a, 0x0b, + 0x5f, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x22, 0xab, 0x01, 0x0a, 0x10, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x07, - 0x69, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, - 0x06, 0x69, 0x73, 0x46, 0x6f, 0x72, 0x6b, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x69, 0x73, - 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, - 0x52, 0x09, 0x69, 0x73, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x37, - 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0a, 0x70, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x69, 0x73, 0x5f, 0x66, - 0x6f, 0x72, 0x6b, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x22, 0xab, 0x01, 0x0a, 0x10, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x41, - 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x65, 0x72, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x9a, 0x01, 0x0a, 0x13, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x37, 0x0a, + 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0xd8, 0x02, 0x0a, 0x0e, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x32, 0x0a, 0x0b, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, + 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x52, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x36, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, + 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0a, 0x72, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x22, 0x9a, 0x01, 0x0a, 0x13, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x6c, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x08, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0xd8, 0x02, - 0x0a, 0x0e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x12, 0x32, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x12, 0x3e, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x48, 0x00, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, - 0x12, 0x38, 0x0a, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x48, 0x00, - 0x52, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x42, 0x0a, 0x0c, 0x70, 0x75, - 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, - 0x00, 0x52, 0x0b, 0x70, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x08, - 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2a, 0x72, 0x0a, 0x0c, 0x44, 0x65, 0x70, 0x45, - 0x63, 0x6f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x1d, 0x0a, 0x19, 0x44, 0x45, 0x50, 0x5f, - 0x45, 0x43, 0x4f, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x44, 0x45, 0x50, 0x5f, 0x45, - 0x43, 0x4f, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x5f, 0x4e, 0x50, 0x4d, 0x10, 0x01, 0x12, 0x14, - 0x0a, 0x10, 0x44, 0x45, 0x50, 0x5f, 0x45, 0x43, 0x4f, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x5f, - 0x47, 0x4f, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, 0x50, 0x5f, 0x45, 0x43, 0x4f, 0x53, - 0x59, 0x53, 0x54, 0x45, 0x4d, 0x5f, 0x50, 0x59, 0x50, 0x49, 0x10, 0x03, 0x42, 0x2c, 0x5a, 0x2a, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x73, 0x65, 0x63, 0x2f, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x72, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x48, 0x00, 0x52, 0x0a, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x38, 0x0a, 0x08, 0x61, 0x72, 0x74, + 0x69, 0x66, 0x61, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x41, + 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x48, 0x00, 0x52, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x12, 0x42, 0x0a, 0x0c, 0x70, 0x75, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x6c, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x75, 0x6c, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x2a, 0x72, 0x0a, 0x0c, 0x44, 0x65, 0x70, 0x45, 0x63, 0x6f, 0x73, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x12, 0x1d, 0x0a, 0x19, 0x44, 0x45, 0x50, 0x5f, 0x45, 0x43, 0x4f, 0x53, 0x59, 0x53, 0x54, + 0x45, 0x4d, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x15, 0x0a, 0x11, 0x44, 0x45, 0x50, 0x5f, 0x45, 0x43, 0x4f, 0x53, 0x59, 0x53, 0x54, 0x45, + 0x4d, 0x5f, 0x4e, 0x50, 0x4d, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x45, 0x50, 0x5f, 0x45, + 0x43, 0x4f, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x5f, 0x47, 0x4f, 0x10, 0x02, 0x12, 0x16, 0x0a, + 0x12, 0x44, 0x45, 0x50, 0x5f, 0x45, 0x43, 0x4f, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x5f, 0x50, + 0x59, 0x50, 0x49, 0x10, 0x03, 0x42, 0x2c, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x65, 0x63, 0x2f, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1004,50 +1166,53 @@ func file_internal_proto_rawDescGZIP() []byte { } var file_internal_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_internal_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_internal_proto_msgTypes = make([]protoimpl.MessageInfo, 13) var file_internal_proto_goTypes = []any{ (DepEcosystem)(0), // 0: internal.DepEcosystem (*Dependency)(nil), // 1: internal.Dependency - (*PrDependencies)(nil), // 2: internal.PrDependencies - (*PrContents)(nil), // 3: internal.PrContents - (*SelectorProvider)(nil), // 4: internal.SelectorProvider - (*SelectorRepository)(nil), // 5: internal.SelectorRepository - (*SelectorArtifact)(nil), // 6: internal.SelectorArtifact - (*SelectorPullRequest)(nil), // 7: internal.SelectorPullRequest - (*SelectorEntity)(nil), // 8: internal.SelectorEntity - (*PrDependencies_ContextualDependency)(nil), // 9: internal.PrDependencies.ContextualDependency - (*PrDependencies_ContextualDependency_FilePatch)(nil), // 10: internal.PrDependencies.ContextualDependency.FilePatch - (*PrContents_File)(nil), // 11: internal.PrContents.File - (*PrContents_File_Line)(nil), // 12: internal.PrContents.File.Line - (*v1.PullRequest)(nil), // 13: minder.v1.PullRequest - (*structpb.Struct)(nil), // 14: google.protobuf.Struct - (v1.Entity)(0), // 15: minder.v1.Entity + (*PullRequest)(nil), // 2: internal.PullRequest + (*PrDependencies)(nil), // 3: internal.PrDependencies + (*PrContents)(nil), // 4: internal.PrContents + (*SelectorProvider)(nil), // 5: internal.SelectorProvider + (*SelectorRepository)(nil), // 6: internal.SelectorRepository + (*SelectorArtifact)(nil), // 7: internal.SelectorArtifact + (*SelectorPullRequest)(nil), // 8: internal.SelectorPullRequest + (*SelectorEntity)(nil), // 9: internal.SelectorEntity + (*PrDependencies_ContextualDependency)(nil), // 10: internal.PrDependencies.ContextualDependency + (*PrDependencies_ContextualDependency_FilePatch)(nil), // 11: internal.PrDependencies.ContextualDependency.FilePatch + (*PrContents_File)(nil), // 12: internal.PrContents.File + (*PrContents_File_Line)(nil), // 13: internal.PrContents.File.Line + (*v1.Context)(nil), // 14: minder.v1.Context + (*structpb.Struct)(nil), // 15: google.protobuf.Struct + (v1.Entity)(0), // 16: minder.v1.Entity } var file_internal_proto_depIdxs = []int32{ 0, // 0: internal.Dependency.ecosystem:type_name -> internal.DepEcosystem - 13, // 1: internal.PrDependencies.pr:type_name -> minder.v1.PullRequest - 9, // 2: internal.PrDependencies.deps:type_name -> internal.PrDependencies.ContextualDependency - 13, // 3: internal.PrContents.pr:type_name -> minder.v1.PullRequest - 11, // 4: internal.PrContents.files:type_name -> internal.PrContents.File - 4, // 5: internal.SelectorRepository.provider:type_name -> internal.SelectorProvider - 14, // 6: internal.SelectorRepository.properties:type_name -> google.protobuf.Struct - 4, // 7: internal.SelectorArtifact.provider:type_name -> internal.SelectorProvider - 14, // 8: internal.SelectorArtifact.properties:type_name -> google.protobuf.Struct - 4, // 9: internal.SelectorPullRequest.provider:type_name -> internal.SelectorProvider - 14, // 10: internal.SelectorPullRequest.properties:type_name -> google.protobuf.Struct - 15, // 11: internal.SelectorEntity.entity_type:type_name -> minder.v1.Entity - 4, // 12: internal.SelectorEntity.provider:type_name -> internal.SelectorProvider - 5, // 13: internal.SelectorEntity.repository:type_name -> internal.SelectorRepository - 6, // 14: internal.SelectorEntity.artifact:type_name -> internal.SelectorArtifact - 7, // 15: internal.SelectorEntity.pull_request:type_name -> internal.SelectorPullRequest - 1, // 16: internal.PrDependencies.ContextualDependency.dep:type_name -> internal.Dependency - 10, // 17: internal.PrDependencies.ContextualDependency.file:type_name -> internal.PrDependencies.ContextualDependency.FilePatch - 12, // 18: internal.PrContents.File.patch_lines:type_name -> internal.PrContents.File.Line - 19, // [19:19] is the sub-list for method output_type - 19, // [19:19] is the sub-list for method input_type - 19, // [19:19] is the sub-list for extension type_name - 19, // [19:19] is the sub-list for extension extendee - 0, // [0:19] is the sub-list for field type_name + 14, // 1: internal.PullRequest.context:type_name -> minder.v1.Context + 15, // 2: internal.PullRequest.properties:type_name -> google.protobuf.Struct + 2, // 3: internal.PrDependencies.pr:type_name -> internal.PullRequest + 10, // 4: internal.PrDependencies.deps:type_name -> internal.PrDependencies.ContextualDependency + 2, // 5: internal.PrContents.pr:type_name -> internal.PullRequest + 12, // 6: internal.PrContents.files:type_name -> internal.PrContents.File + 5, // 7: internal.SelectorRepository.provider:type_name -> internal.SelectorProvider + 15, // 8: internal.SelectorRepository.properties:type_name -> google.protobuf.Struct + 5, // 9: internal.SelectorArtifact.provider:type_name -> internal.SelectorProvider + 15, // 10: internal.SelectorArtifact.properties:type_name -> google.protobuf.Struct + 5, // 11: internal.SelectorPullRequest.provider:type_name -> internal.SelectorProvider + 15, // 12: internal.SelectorPullRequest.properties:type_name -> google.protobuf.Struct + 16, // 13: internal.SelectorEntity.entity_type:type_name -> minder.v1.Entity + 5, // 14: internal.SelectorEntity.provider:type_name -> internal.SelectorProvider + 6, // 15: internal.SelectorEntity.repository:type_name -> internal.SelectorRepository + 7, // 16: internal.SelectorEntity.artifact:type_name -> internal.SelectorArtifact + 8, // 17: internal.SelectorEntity.pull_request:type_name -> internal.SelectorPullRequest + 1, // 18: internal.PrDependencies.ContextualDependency.dep:type_name -> internal.Dependency + 11, // 19: internal.PrDependencies.ContextualDependency.file:type_name -> internal.PrDependencies.ContextualDependency.FilePatch + 13, // 20: internal.PrContents.File.patch_lines:type_name -> internal.PrContents.File.Line + 21, // [21:21] is the sub-list for method output_type + 21, // [21:21] is the sub-list for method input_type + 21, // [21:21] is the sub-list for extension type_name + 21, // [21:21] is the sub-list for extension extendee + 0, // [0:21] is the sub-list for field type_name } func init() { file_internal_proto_init() } @@ -1055,8 +1220,8 @@ func file_internal_proto_init() { if File_internal_proto != nil { return } - file_internal_proto_msgTypes[4].OneofWrappers = []any{} - file_internal_proto_msgTypes[7].OneofWrappers = []any{ + file_internal_proto_msgTypes[5].OneofWrappers = []any{} + file_internal_proto_msgTypes[8].OneofWrappers = []any{ (*SelectorEntity_Repository)(nil), (*SelectorEntity_Artifact)(nil), (*SelectorEntity_PullRequest)(nil), @@ -1067,7 +1232,7 @@ func file_internal_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_internal_proto_rawDesc, NumEnums: 1, - NumMessages: 12, + NumMessages: 13, NumExtensions: 0, NumServices: 0, }, diff --git a/internal/proto/internal.proto b/internal/proto/internal.proto index 665adce779..f812004d5e 100644 --- a/internal/proto/internal.proto +++ b/internal/proto/internal.proto @@ -25,6 +25,29 @@ message Dependency { string version = 3; } +message PullRequest { + string url = 1; // The full URL to the PR + string commit_sha = 2; // Commit SHA of the PR HEAD. Will be useful to submit a review + int64 number = 3; // The sequential PR number (not the DB PK!) + + string repo_owner = 4; // The owner of the repo, will be used to submit a review + string repo_name = 5; // The name of the repo, will be used to submit a review + + int64 author_id = 6; // The author of the PR, will be used to check if we can request changes + + string action = 7; // The action that triggered the webhook + + minder.v1.Context context = 8; + + // properties is a map of properties of the entity. + google.protobuf.Struct properties = 9; + + string base_clone_url = 10; // URL used to clone the base repository + string target_clone_url = 11; // URL used to clone the target repository + string base_ref = 12; // The base ref of the PR + string target_ref = 13; // The target ref of the PR +} + message PrDependencies { message ContextualDependency { message FilePatch { @@ -36,7 +59,7 @@ message PrDependencies { FilePatch file = 2; } - minder.v1.PullRequest pr = 1; + PullRequest pr = 1; repeated ContextualDependency deps = 2; } @@ -54,7 +77,7 @@ message PrContents { } } - minder.v1.PullRequest pr = 1; + PullRequest pr = 1; repeated File files = 2; } diff --git a/internal/providers/github/entities.go b/internal/providers/github/entities.go index 8be40fec26..405ca72c28 100644 --- a/internal/providers/github/entities.go +++ b/internal/providers/github/entities.go @@ -247,6 +247,8 @@ func (c *GitHub) PropertiesToProtoMessage( return ghprop.ArtifactV1FromProperties(props) case minderv1.Entity_ENTITY_PULL_REQUESTS: return ghprop.PullRequestV1FromProperties(props) + case minderv1.Entity_ENTITY_RELEASE: + return ghprop.EntityInstanceV1FromReleaseProperties(props) } return nil, fmt.Errorf("conversion of entity type %s is not handled by the github provider", entType) diff --git a/internal/providers/github/properties/fetcher.go b/internal/providers/github/properties/fetcher.go index 169c2a84e4..c6c55a9a50 100644 --- a/internal/providers/github/properties/fetcher.go +++ b/internal/providers/github/properties/fetcher.go @@ -52,6 +52,8 @@ func (_ ghEntityFetcher) EntityPropertyFetcher(entType minderv1.Entity) GhProper return NewRepositoryFetcher() case minderv1.Entity_ENTITY_ARTIFACTS: return NewArtifactFetcher() + case minderv1.Entity_ENTITY_RELEASE: + return NewReleaseFetcher() } return nil diff --git a/internal/providers/github/properties/pull_request.go b/internal/providers/github/properties/pull_request.go index b6fae1b2fc..21e6c6c293 100644 --- a/internal/providers/github/properties/pull_request.go +++ b/internal/providers/github/properties/pull_request.go @@ -15,7 +15,7 @@ import ( go_github "github.com/google/go-github/v63/github" "github.com/mindersec/minder/internal/entities/properties" - minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + pbinternal "github.com/mindersec/minder/internal/proto" v1 "github.com/mindersec/minder/pkg/providers/v1" ) @@ -52,6 +52,12 @@ var prPropertyDefinitions = []propertyOrigin{ // general entity properties.PropertyName, properties.PropertyUpstreamID, + properties.PullRequestCommitSHA, + properties.PullRequestBaseCloneURL, + properties.PullRequestBaseDefaultBranch, + properties.PullRequestTargetCloneURL, + properties.PullRequestTargetBranch, + properties.PullRequestUpstreamURL, // github-specific PullPropertyURL, PullPropertyNumber, @@ -150,8 +156,14 @@ func getPrWrapper( prProps := map[string]any{ // general entity - properties.PropertyUpstreamID: properties.NumericalValueToUpstreamID(prReply.GetID()), - properties.PropertyName: fmt.Sprintf("%s/%s/%d", owner, name, intId), + properties.PropertyUpstreamID: properties.NumericalValueToUpstreamID(prReply.GetID()), + properties.PropertyName: fmt.Sprintf("%s/%s/%d", owner, name, intId), + properties.PullRequestCommitSHA: prReply.GetHead().GetSHA(), + properties.PullRequestBaseCloneURL: prReply.GetBase().GetRepo().GetCloneURL(), + properties.PullRequestBaseDefaultBranch: prReply.GetBase().GetRepo().GetDefaultBranch(), + properties.PullRequestTargetCloneURL: prReply.GetHead().GetRepo().GetCloneURL(), + properties.PullRequestTargetBranch: prReply.GetHead().GetRef(), + properties.PullRequestUpstreamURL: prReply.GetHTMLURL(), // github-specific PullPropertyURL: prReply.GetHTMLURL(), // our proto representation uses int64 for the number but GH uses int @@ -187,8 +199,8 @@ func getPrWrapperAttrsFromProps(props *properties.Properties) (string, string, i } // PullRequestV1FromProperties creates a PullRequestV1 from a properties object -func PullRequestV1FromProperties(props *properties.Properties) (*minderv1.PullRequest, error) { - return &minderv1.PullRequest{ +func PullRequestV1FromProperties(props *properties.Properties) (*pbinternal.PullRequest, error) { + return &pbinternal.PullRequest{ Url: props.GetProperty(PullPropertyURL).GetString(), CommitSha: props.GetProperty(PullPropertySha).GetString(), TargetRef: props.GetProperty(PullPropertyTargetRef).GetString(), @@ -200,5 +212,6 @@ func PullRequestV1FromProperties(props *properties.Properties) (*minderv1.PullRe Action: props.GetProperty(PullPropertyAction).GetString(), BaseCloneUrl: props.GetProperty(PullPropertyBaseCloneURL).GetString(), TargetCloneUrl: props.GetProperty(PullPropertyTargetCloneURL).GetString(), + Properties: props.ToProtoStruct(), }, nil } diff --git a/internal/providers/github/properties/release.go b/internal/providers/github/properties/release.go new file mode 100644 index 0000000000..42486f7d43 --- /dev/null +++ b/internal/providers/github/properties/release.go @@ -0,0 +1,178 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package properties + +import ( + "context" + "fmt" + "net/http" + + go_github "github.com/google/go-github/v63/github" + + "github.com/mindersec/minder/internal/entities/properties" + minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + v1 "github.com/mindersec/minder/pkg/providers/v1" +) + +// Release Properties +const ( + // ReleasePropertyOwner represents the github owner + ReleasePropertyOwner = "github/owner" + // ReleasePropertyRepo represents the github repo + ReleasePropertyRepo = "github/repo" +) + +// ReleaseFetcher is a property fetcher for releases +type ReleaseFetcher struct { + propertyFetcherBase +} + +// NewReleaseFetcher creates a new ReleaseFetcher +func NewReleaseFetcher() *ReleaseFetcher { + return &ReleaseFetcher{ + propertyFetcherBase: propertyFetcherBase{ + propertyOrigins: []propertyOrigin{ + { + keys: []string{ + // general entity + properties.PropertyName, + properties.PropertyUpstreamID, + // general release + properties.ReleasePropertyTag, + properties.ReleasePropertyBranch, + ReleasePropertyOwner, + ReleasePropertyRepo, + }, + wrapper: getReleaseWrapper, + }, + }, + operationalProperties: []string{}, + }, + } +} + +// GetName returns the name of the release +func (_ *ReleaseFetcher) GetName(props *properties.Properties) (string, error) { + owner := props.GetProperty(ReleasePropertyOwner).GetString() + repo, err := props.GetProperty(ReleasePropertyRepo).AsString() + if err != nil { + return "", fmt.Errorf("failed to get repo name: %w", err) + } + + tag, err := props.GetProperty(properties.ReleasePropertyTag).AsString() + if err != nil { + return "", fmt.Errorf("failed to get tag name: %w", err) + } + + return getReleaseNameFromParams(owner, repo, tag), nil +} + +func getReleaseNameFromParams(owner, repo, tag string) string { + if owner == "" { + return fmt.Sprintf("%s/%s", repo, tag) + } + + return fmt.Sprintf("%s/%s/%s", owner, repo, tag) +} + +func getReleaseWrapper( + ctx context.Context, ghCli *go_github.Client, _ bool, getByProps *properties.Properties, +) (map[string]any, error) { + upstreamID, err := getByProps.GetProperty(properties.PropertyUpstreamID).AsInt64() + if err != nil { + return nil, fmt.Errorf("upstream ID not found or invalid: %w", err) + } + + owner, err := getByProps.GetProperty(ReleasePropertyOwner).AsString() + if err != nil { + return nil, fmt.Errorf("owner not found or invalid: %w", err) + } + + repo, err := getByProps.GetProperty(ReleasePropertyRepo).AsString() + if err != nil { + return nil, fmt.Errorf("repo not found or invalid: %w", err) + } + + var fetchErr error + var release *go_github.RepositoryRelease + var result *go_github.Response + release, result, fetchErr = ghCli.Repositories.GetRelease(ctx, owner, repo, + upstreamID) + if fetchErr != nil { + if result != nil && result.StatusCode == http.StatusNotFound { + return nil, v1.ErrEntityNotFound + } + return nil, fmt.Errorf("failed to fetch release: %w", fetchErr) + } + + branch, commitSha, err := getBranchAndCommit(ctx, owner, repo, release.GetTargetCommitish(), ghCli) + if err != nil { + return nil, fmt.Errorf("failed to get branch and commit SHA: %w", err) + } + + return map[string]any{ + properties.PropertyUpstreamID: properties.NumericalValueToUpstreamID(release.GetID()), + properties.PropertyName: getReleaseNameFromParams(owner, repo, release.GetTagName()), + ReleasePropertyOwner: owner, + ReleasePropertyRepo: repo, + properties.ReleasePropertyTag: release.GetTagName(), + properties.ReleaseCommitSHA: commitSha, + properties.ReleasePropertyBranch: branch, + }, nil +} + +func getBranchAndCommit( + ctx context.Context, + owner string, + repo string, + commitish string, + ghCli *go_github.Client, +) (branch string, commitSha string, err error) { + if commitish == "" { + // We have no info, but this is not an error. We simply don't fill this + // information just yet. We'll get it on entity refresh. + return "", "", nil + } + + // check if the target commitish is a branch + br, res, err := ghCli.Repositories.GetBranch(ctx, owner, repo, commitish, 1) + if err == nil { + return br.GetName(), br.GetCommit().GetSHA(), nil + } + + if res == nil || res.StatusCode != http.StatusNotFound { + return "", "", fmt.Errorf("failed to fetch branch: %w", err) + } + + // The commitish is a commit SHA without a branch + return "", commitish, nil +} + +// EntityInstanceV1FromReleaseProperties creates a new EntityInstance from the given properties +func EntityInstanceV1FromReleaseProperties(props *properties.Properties) (*minderv1.EntityInstance, error) { + _, err := props.GetProperty(properties.PropertyUpstreamID).AsString() + if err != nil { + return nil, fmt.Errorf("upstream ID not found or invalid: %w", err) + } + + tag, err := props.GetProperty(properties.ReleasePropertyTag).AsString() + if err != nil { + return nil, fmt.Errorf("tag not found or invalid: %w", err) + } + + owner := props.GetProperty(ReleasePropertyOwner).GetString() + + repo, err := props.GetProperty(ReleasePropertyRepo).AsString() + if err != nil { + return nil, fmt.Errorf("repo not found or invalid: %w", err) + } + + name := getReleaseNameFromParams(owner, repo, tag) + + return &minderv1.EntityInstance{ + Type: minderv1.Entity_ENTITY_RELEASE, + Name: name, + Properties: props.ToProtoStruct(), + }, nil +} diff --git a/internal/providers/github/properties/repository.go b/internal/providers/github/properties/repository.go index 768a485056..20114a1787 100644 --- a/internal/providers/github/properties/repository.go +++ b/internal/providers/github/properties/repository.go @@ -225,6 +225,7 @@ func RepoV1FromProperties(repoProperties *properties.Properties) (*minderv1.Repo IsFork: isFork, DefaultBranch: repoProperties.GetProperty(RepoPropertyDefaultBranch).GetString(), License: repoProperties.GetProperty(RepoPropertyLicense).GetString(), + Properties: repoProperties.ToProtoStruct(), } return pbRepo, nil diff --git a/internal/providers/github/webhook/handlers_githubwebhooks_test.go b/internal/providers/github/webhook/handlers_githubwebhooks_test.go index 3894a5f487..6f3a7cbad6 100644 --- a/internal/providers/github/webhook/handlers_githubwebhooks_test.go +++ b/internal/providers/github/webhook/handlers_githubwebhooks_test.go @@ -2514,7 +2514,7 @@ func (s *UnitTestSuite) TestHandleGitHubWebHook() { ghMocks: []func(hubMock gf.GitHubMock){ gf.WithSuccessfulGetEntityName("mindersec/minder/42"), }, - topic: constants.TopicQueueOriginatingEntityAdd, + topic: constants.TopicQueueRefreshEntityAndEvaluate, statusCode: http.StatusOK, queued: func(t *testing.T, event string, ch <-chan *message.Message) { t.Helper() diff --git a/internal/providers/github/webhook/handlers_pull_requests.go b/internal/providers/github/webhook/handlers_pull_requests.go index a4061ef0a5..13390e9139 100644 --- a/internal/providers/github/webhook/handlers_pull_requests.go +++ b/internal/providers/github/webhook/handlers_pull_requests.go @@ -137,18 +137,12 @@ func processPullRequestEvent( } pullProps.SetProperty(properties.PropertyName, nameProp) - var topic string - switch pullProps.GetProperty(ghprop.PullPropertyAction).GetString() { - case webhookActionEventOpened, - webhookActionEventReopened, - webhookActionEventSynchronize: - topic = constants.TopicQueueOriginatingEntityAdd - case webhookActionEventClosed: - topic = constants.TopicQueueOriginatingEntityDelete - default: - zerolog.Ctx(ctx).Info().Msgf("action %s is not handled for pull requests", - pullProps.GetProperty(ghprop.PullPropertyAction).GetString()) - return nil, errNotHandled + topic, err := getPREventHandlingTopic(pullProps) + if err != nil { + zerolog.Ctx(ctx).Error().Err(err). + Str("action", event.GetAction()). + Msg("error getting PR event handling topic") + return nil, err } prMsg := entityMessage.NewEntityRefreshAndDoMessage(). @@ -156,7 +150,21 @@ func processPullRequestEvent( WithOriginator(pb.Entity_ENTITY_REPOSITORIES, repoProps). WithProviderImplementsHint(string(db.ProviderTypeGithub)) - l.Info().Msgf("evaluating PR %s\n", event.GetPullRequest().GetURL()) + l.Info().Msgf("evaluating PR %s: %s => %s\n", event.GetPullRequest().GetURL(), event.GetAction(), topic) return &processingResult{topic: topic, wrapper: prMsg}, nil } + +func getPREventHandlingTopic(pullProps *properties.Properties) (string, error) { + switch pullProps.GetProperty(ghprop.PullPropertyAction).GetString() { + case webhookActionEventOpened, + webhookActionEventReopened: + return constants.TopicQueueOriginatingEntityAdd, nil + case webhookActionEventSynchronize: + return constants.TopicQueueRefreshEntityAndEvaluate, nil + case webhookActionEventClosed: + return constants.TopicQueueOriginatingEntityDelete, nil + default: + return "", errNotHandled + } +} diff --git a/internal/providers/github/webhook/handlers_releases.go b/internal/providers/github/webhook/handlers_releases.go new file mode 100644 index 0000000000..70feec9223 --- /dev/null +++ b/internal/providers/github/webhook/handlers_releases.go @@ -0,0 +1,147 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package webhook + +import ( + "context" + "encoding/json" + "errors" + "fmt" + + "github.com/mindersec/minder/internal/db" + entityMessage "github.com/mindersec/minder/internal/entities/handlers/message" + "github.com/mindersec/minder/internal/entities/properties" + ghprop "github.com/mindersec/minder/internal/providers/github/properties" + pb "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + "github.com/mindersec/minder/pkg/eventer/constants" +) + +type releaseEvent struct { + Action *string `json:"action,omitempty"` + Release *release `json:"release,omitempty"` + Repo *repo `json:"repository,omitempty"` +} + +func (r *releaseEvent) GetAction() string { + if r.Action != nil { + return *r.Action + } + return "" +} + +func (r *releaseEvent) GetRelease() *release { + return r.Release +} + +func (r *releaseEvent) GetRepo() *repo { + return r.Repo +} + +type release struct { + ID *int64 `json:"id,omitempty"` + TagName *string `json:"tag_name,omitempty"` + Target *string `json:"target_commitish,omitempty"` +} + +func (r *release) GetID() int64 { + if r.ID != nil { + return *r.ID + } + return 0 +} + +func (r *release) GetTagName() string { + if r.TagName != nil { + return *r.TagName + } + return "" +} + +func (r *release) GetTarget() string { + if r.Target != nil { + return *r.Target + } + return "" +} + +func processReleaseEvent( + ctx context.Context, + payload []byte, +) (*processingResult, error) { + var event *releaseEvent + if err := json.Unmarshal(payload, &event); err != nil { + return nil, fmt.Errorf("failed to unmarshal release event: %w", err) + } + + if event.GetAction() == "" { + return nil, errors.New("release event action not found") + } + + if event.GetRelease() == nil { + return nil, errors.New("release event release not found") + } + + if event.GetRepo() == nil { + return nil, errors.New("release event repository not found") + } + + if event.GetRelease().GetTagName() == "" { + return nil, errors.New("release event tag name not found") + } + + if event.GetRelease().GetTarget() == "" { + return nil, errors.New("release event target not found") + } + + return sendReleaseEvent(ctx, event) +} + +func sendReleaseEvent( + _ context.Context, + event *releaseEvent, +) (*processingResult, error) { + lookByProps, err := properties.NewProperties(map[string]any{ + properties.PropertyUpstreamID: properties.NumericalValueToUpstreamID(event.GetRelease().GetID()), + ghprop.ReleasePropertyOwner: event.GetRepo().GetOwner(), + ghprop.ReleasePropertyRepo: event.GetRepo().GetName(), + }) + if err != nil { + return nil, fmt.Errorf("error creating release properties: %w", err) + } + + originatorProps, err := properties.NewProperties(map[string]any{ + properties.PropertyUpstreamID: properties.NumericalValueToUpstreamID(event.GetRepo().GetID()), + }) + if err != nil { + return nil, fmt.Errorf("error creating repository properties for release origination: %w", err) + } + + switch event.GetAction() { + case "published": + return &processingResult{ + topic: constants.TopicQueueOriginatingEntityAdd, + wrapper: entityMessage.NewEntityRefreshAndDoMessage(). + WithEntity(pb.Entity_ENTITY_RELEASE, lookByProps). + WithProviderImplementsHint(string(db.ProviderTypeGithub)). + WithOriginator(pb.Entity_ENTITY_REPOSITORIES, originatorProps), + }, nil + case "unpublished", "deleted": + return &processingResult{ + topic: constants.TopicQueueOriginatingEntityDelete, + wrapper: entityMessage.NewEntityRefreshAndDoMessage(). + WithEntity(pb.Entity_ENTITY_RELEASE, lookByProps). + WithProviderImplementsHint(string(db.ProviderTypeGithub)). + WithOriginator(pb.Entity_ENTITY_REPOSITORIES, originatorProps), + }, nil + case "edited": + return &processingResult{ + topic: constants.TopicQueueRefreshEntityAndEvaluate, + wrapper: entityMessage.NewEntityRefreshAndDoMessage(). + WithEntity(pb.Entity_ENTITY_RELEASE, lookByProps). + WithProviderImplementsHint(string(db.ProviderTypeGithub)). + WithOriginator(pb.Entity_ENTITY_REPOSITORIES, originatorProps), + }, nil + } + return nil, nil +} diff --git a/internal/providers/github/webhook/hook.go b/internal/providers/github/webhook/hook.go index 14e3236ec2..a4d42d8f37 100644 --- a/internal/providers/github/webhook/hook.go +++ b/internal/providers/github/webhook/hook.go @@ -160,6 +160,9 @@ func HandleWebhookEvent( case "pull_request": wes.Accepted = true res, processingErr = processPullRequestEvent(ctx, rawWBPayload) + case "release": + wes.Accepted = true + res, processingErr = processReleaseEvent(ctx, rawWBPayload) case "ping": // For ping events, we do not set wes.Accepted // to true because they're not relevant diff --git a/internal/providers/gitlab/manager/webhook.go b/internal/providers/gitlab/manager/webhook.go index a56e6009fc..fd7b8be25d 100644 --- a/internal/providers/gitlab/manager/webhook.go +++ b/internal/providers/gitlab/manager/webhook.go @@ -13,7 +13,7 @@ import ( "github.com/google/uuid" "github.com/rs/zerolog" - gitlablib "github.com/xanzy/go-gitlab" + gitlablib "gitlab.com/gitlab-org/api/client-go" "github.com/mindersec/minder/internal/providers/gitlab/webhooksecret" ) diff --git a/internal/providers/gitlab/manager/webhook_handlers_merge_requests.go b/internal/providers/gitlab/manager/webhook_handlers_merge_requests.go index 13c38c8234..1929187fcf 100644 --- a/internal/providers/gitlab/manager/webhook_handlers_merge_requests.go +++ b/internal/providers/gitlab/manager/webhook_handlers_merge_requests.go @@ -10,7 +10,7 @@ import ( "github.com/ThreeDotsLabs/watermill/message" "github.com/google/uuid" "github.com/rs/zerolog" - gitlablib "github.com/xanzy/go-gitlab" + gitlablib "gitlab.com/gitlab-org/api/client-go" entmsg "github.com/mindersec/minder/internal/entities/handlers/message" "github.com/mindersec/minder/internal/entities/properties" diff --git a/internal/providers/gitlab/manager/webhook_handlers_releases.go b/internal/providers/gitlab/manager/webhook_handlers_releases.go index a1c19838d5..958358a22f 100644 --- a/internal/providers/gitlab/manager/webhook_handlers_releases.go +++ b/internal/providers/gitlab/manager/webhook_handlers_releases.go @@ -10,7 +10,7 @@ import ( "github.com/ThreeDotsLabs/watermill/message" "github.com/google/uuid" "github.com/rs/zerolog" - gitlablib "github.com/xanzy/go-gitlab" + gitlablib "gitlab.com/gitlab-org/api/client-go" entmsg "github.com/mindersec/minder/internal/entities/handlers/message" "github.com/mindersec/minder/internal/entities/properties" diff --git a/internal/providers/gitlab/manager/webhook_handlers_repos.go b/internal/providers/gitlab/manager/webhook_handlers_repos.go index 3e2f1b7ba8..e28ae43574 100644 --- a/internal/providers/gitlab/manager/webhook_handlers_repos.go +++ b/internal/providers/gitlab/manager/webhook_handlers_repos.go @@ -10,7 +10,7 @@ import ( "github.com/ThreeDotsLabs/watermill/message" "github.com/google/uuid" "github.com/rs/zerolog" - gitlablib "github.com/xanzy/go-gitlab" + gitlablib "gitlab.com/gitlab-org/api/client-go" entmsg "github.com/mindersec/minder/internal/entities/handlers/message" "github.com/mindersec/minder/internal/entities/properties" diff --git a/internal/providers/gitlab/properties.go b/internal/providers/gitlab/properties.go index 2b61b30ed7..815812865c 100644 --- a/internal/providers/gitlab/properties.go +++ b/internal/providers/gitlab/properties.go @@ -38,16 +38,8 @@ const ( PullRequestProjectID = "gitlab/project_id" // PullRequestNumber represents the gitlab merge request number PullRequestNumber = "gitlab/merge_request_number" - // PullRequestSourceBranch represents the gitlab source branch - PullRequestSourceBranch = "gitlab/source_branch" - // PullRequestTargetBranch represents the gitlab target branch - PullRequestTargetBranch = "gitlab/target_branch" // PullRequestAuthor represents the gitlab author PullRequestAuthor = "gitlab/author" - // PullRequestCommitSHA represents the gitlab commit SHA - PullRequestCommitSHA = "gitlab/commit_sha" - // PullRequestURL represents the gitlab merge request URL - PullRequestURL = "gitlab/merge_request_url" ) // Release Properties diff --git a/internal/providers/gitlab/properties_test.go b/internal/providers/gitlab/properties_test.go index 3745c1b271..6edac8ce5b 100644 --- a/internal/providers/gitlab/properties_test.go +++ b/internal/providers/gitlab/properties_test.go @@ -11,7 +11,7 @@ import ( "testing" "github.com/stretchr/testify/assert" - "github.com/xanzy/go-gitlab" + gitlab "gitlab.com/gitlab-org/api/client-go" "google.golang.org/protobuf/reflect/protoreflect" "github.com/mindersec/minder/internal/entities/properties" diff --git a/internal/providers/gitlab/pull_request_properties.go b/internal/providers/gitlab/pull_request_properties.go index a54cf97e1d..bfc801b3f3 100644 --- a/internal/providers/gitlab/pull_request_properties.go +++ b/internal/providers/gitlab/pull_request_properties.go @@ -11,10 +11,10 @@ import ( "net/url" "strconv" - "github.com/xanzy/go-gitlab" + gitlab "gitlab.com/gitlab-org/api/client-go" "github.com/mindersec/minder/internal/entities/properties" - minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + pbinternal "github.com/mindersec/minder/internal/proto" provifv1 "github.com/mindersec/minder/pkg/providers/v1" ) @@ -25,6 +25,7 @@ func FormatPullRequestUpstreamID(id int) string { return fmt.Sprintf("%d", id) } +//nolint:gocyclo // TODO: Refactor to reduce complexity func (c *gitlabClient) getPropertiesForPullRequest( ctx context.Context, getByProps *properties.Properties, ) (*properties.Properties, error) { @@ -87,7 +88,15 @@ func (c *gitlabClient) getPropertiesForPullRequest( return nil, fmt.Errorf("failed to get project: %w", err) } - outProps, err := gitlabMergeRequestToProperties(mr, proj) + targetproj := proj + if mr.SourceProjectID != 0 && mr.SourceProjectID != proj.ID { + targetproj, err = c.getGitLabProject(ctx, FormatRepositoryUpstreamID(mr.SourceProjectID)) + if err != nil { + return nil, fmt.Errorf("failed to get target project: %w", err) + } + } + + outProps, err := gitlabMergeRequestToProperties(mr, proj, targetproj) if err != nil { return nil, fmt.Errorf("failed to convert merge request to properties: %w", err) } @@ -95,7 +104,8 @@ func (c *gitlabClient) getPropertiesForPullRequest( return outProps, nil } -func gitlabMergeRequestToProperties(mr *gitlab.MergeRequest, proj *gitlab.Project) (*properties.Properties, error) { +func gitlabMergeRequestToProperties( + mr *gitlab.MergeRequest, proj *gitlab.Project, targetproj *gitlab.Project) (*properties.Properties, error) { ns, err := getGitlabProjectNamespace(proj) if err != nil { return nil, fmt.Errorf("failed to get namespace: %w", err) @@ -105,18 +115,20 @@ func gitlabMergeRequestToProperties(mr *gitlab.MergeRequest, proj *gitlab.Projec outProps, err := properties.NewProperties(map[string]any{ // Unique upstream ID for the merge request - properties.PropertyUpstreamID: FormatPullRequestUpstreamID(mr.ID), - properties.PropertyName: formatPullRequestName(ns, projName, FormatPullRequestUpstreamID(mr.IID)), - RepoPropertyNamespace: ns, - RepoPropertyProjectName: projName, + properties.PropertyUpstreamID: FormatPullRequestUpstreamID(mr.ID), + properties.PropertyName: formatPullRequestName(ns, projName, FormatPullRequestUpstreamID(mr.IID)), + properties.PullRequestCommitSHA: mr.SHA, + properties.PullRequestBaseCloneURL: proj.HTTPURLToRepo, + properties.PullRequestBaseDefaultBranch: mr.TargetBranch, + properties.PullRequestTargetCloneURL: targetproj.HTTPURLToRepo, + properties.PullRequestTargetBranch: mr.SourceBranch, + properties.PullRequestUpstreamURL: mr.WebURL, + RepoPropertyNamespace: ns, + RepoPropertyProjectName: projName, // internal ID of the merge request - PullRequestNumber: FormatPullRequestUpstreamID(mr.IID), - PullRequestProjectID: FormatRepositoryUpstreamID(proj.ID), - PullRequestSourceBranch: mr.SourceBranch, - PullRequestTargetBranch: mr.TargetBranch, - PullRequestCommitSHA: mr.SHA, - PullRequestAuthor: int64(mr.Author.ID), - PullRequestURL: mr.WebURL, + PullRequestNumber: FormatPullRequestUpstreamID(mr.IID), + PullRequestProjectID: FormatRepositoryUpstreamID(proj.ID), + PullRequestAuthor: int64(mr.Author.ID), }) if err != nil { return nil, fmt.Errorf("failed to create properties: %w", err) @@ -125,7 +137,7 @@ func gitlabMergeRequestToProperties(mr *gitlab.MergeRequest, proj *gitlab.Projec return outProps, nil } -func pullRequestV1FromProperties(prProps *properties.Properties) (*minderv1.PullRequest, error) { +func pullRequestV1FromProperties(prProps *properties.Properties) (*pbinternal.PullRequest, error) { _, err := prProps.GetProperty(properties.PropertyUpstreamID).AsString() if err != nil { return nil, fmt.Errorf("failed to get upstream ID: %w", err) @@ -146,12 +158,12 @@ func pullRequestV1FromProperties(prProps *properties.Properties) (*minderv1.Pull return nil, fmt.Errorf("failed to get project name: %w", err) } - commitSha, err := getStringProp(prProps, PullRequestCommitSHA) + commitSha, err := getStringProp(prProps, properties.PullRequestCommitSHA) if err != nil { return nil, fmt.Errorf("failed to get commit SHA: %w", err) } - mrURL, err := getStringProp(prProps, PullRequestURL) + mrURL, err := getStringProp(prProps, properties.PullRequestUpstreamURL) if err != nil { return nil, fmt.Errorf("failed to get merge request URL: %w", err) } @@ -161,20 +173,29 @@ func pullRequestV1FromProperties(prProps *properties.Properties) (*minderv1.Pull return nil, fmt.Errorf("failed to get author ID: %w", err) } + basecloneurl := prProps.GetProperty(properties.PullRequestBaseCloneURL).GetString() + targetcloneurl := prProps.GetProperty(properties.PullRequestTargetCloneURL).GetString() + basebranch := prProps.GetProperty(properties.PullRequestBaseDefaultBranch).GetString() + targetbranch := prProps.GetProperty(properties.PullRequestTargetBranch).GetString() + // parse UpstreamID to int64 id, err := strconv.ParseInt(iid, 10, 64) if err != nil { return nil, fmt.Errorf("failed to parse upstream ID: %w", err) } - pbPR := &minderv1.PullRequest{ - Number: id, - RepoOwner: ns, - RepoName: projName, - CommitSha: commitSha, - AuthorId: authorID, - Url: mrURL, - Properties: prProps.ToProtoStruct(), + pbPR := &pbinternal.PullRequest{ + Number: id, + RepoOwner: ns, + RepoName: projName, + CommitSha: commitSha, + AuthorId: authorID, + Url: mrURL, + BaseCloneUrl: basecloneurl, + TargetCloneUrl: targetcloneurl, + BaseRef: basebranch, + TargetRef: targetbranch, + Properties: prProps.ToProtoStruct(), } return pbPR, nil diff --git a/internal/providers/gitlab/registration.go b/internal/providers/gitlab/registration.go index 9af6974a80..63a378b324 100644 --- a/internal/providers/gitlab/registration.go +++ b/internal/providers/gitlab/registration.go @@ -14,7 +14,7 @@ import ( "github.com/google/uuid" "github.com/rs/zerolog" - "github.com/xanzy/go-gitlab" + gitlab "gitlab.com/gitlab-org/api/client-go" "github.com/mindersec/minder/internal/entities/properties" "github.com/mindersec/minder/internal/providers/gitlab/webhooksecret" diff --git a/internal/providers/gitlab/registration_test.go b/internal/providers/gitlab/registration_test.go index 794584441a..815e76e72d 100644 --- a/internal/providers/gitlab/registration_test.go +++ b/internal/providers/gitlab/registration_test.go @@ -15,7 +15,7 @@ import ( "github.com/google/uuid" "github.com/rs/zerolog" "github.com/stretchr/testify/assert" - "github.com/xanzy/go-gitlab" + gitlab "gitlab.com/gitlab-org/api/client-go" "golang.org/x/oauth2" "github.com/mindersec/minder/internal/entities/properties" diff --git a/internal/providers/gitlab/release_properties.go b/internal/providers/gitlab/release_properties.go index 5b94133011..fbfee3ec34 100644 --- a/internal/providers/gitlab/release_properties.go +++ b/internal/providers/gitlab/release_properties.go @@ -14,7 +14,7 @@ import ( "github.com/cenkalti/backoff/v4" "github.com/rs/zerolog" - gitlablib "github.com/xanzy/go-gitlab" + gitlablib "gitlab.com/gitlab-org/api/client-go" "golang.org/x/mod/semver" "github.com/mindersec/minder/internal/entities/properties" diff --git a/internal/providers/gitlab/repo_lister.go b/internal/providers/gitlab/repo_lister.go index 4255e6f428..c8f627e3d5 100644 --- a/internal/providers/gitlab/repo_lister.go +++ b/internal/providers/gitlab/repo_lister.go @@ -9,7 +9,7 @@ import ( "net/url" "github.com/rs/zerolog" - "github.com/xanzy/go-gitlab" + gitlab "gitlab.com/gitlab-org/api/client-go" minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" ) diff --git a/internal/providers/gitlab/repository_properties.go b/internal/providers/gitlab/repository_properties.go index ab6a907128..41bde6a342 100644 --- a/internal/providers/gitlab/repository_properties.go +++ b/internal/providers/gitlab/repository_properties.go @@ -11,7 +11,7 @@ import ( "net/url" "strconv" - "github.com/xanzy/go-gitlab" + gitlab "gitlab.com/gitlab-org/api/client-go" "github.com/mindersec/minder/internal/entities/properties" minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" diff --git a/internal/service/service.go b/internal/service/service.go index 106589a19a..06fce58ac4 100644 --- a/internal/service/service.go +++ b/internal/service/service.go @@ -18,6 +18,7 @@ import ( "github.com/mindersec/minder/internal/controlplane" "github.com/mindersec/minder/internal/controlplane/metrics" "github.com/mindersec/minder/internal/crypto" + datasourcessvc "github.com/mindersec/minder/internal/datasources/service" "github.com/mindersec/minder/internal/db" "github.com/mindersec/minder/internal/eea" "github.com/mindersec/minder/internal/email/awsses" @@ -73,13 +74,14 @@ func AllInOneServerService( meterFactory meters.MeterFactory, ) error { errg, ctx := errgroup.WithContext(ctx) + flags.OpenFeatureProviderFromFlags(ctx, cfg.Flags) + featureFlagClient := openfeature.NewClient(cfg.Flags.AppName) - evt, err := eventer.New(ctx, nil, &cfg.Events) + evt, err := eventer.New(ctx, featureFlagClient, &cfg.Events) if err != nil { return fmt.Errorf("unable to setup eventer: %w", err) } - flags.OpenFeatureProviderFromFlags(ctx, cfg.Flags) cryptoEngine, err := crypto.NewEngineFromConfig(cfg) if err != nil { return fmt.Errorf("failed to create crypto engine: %w", err) @@ -101,9 +103,8 @@ func AllInOneServerService( fallbackTokenClient := ghprov.NewFallbackTokenClient(cfg.Provider) ghClientFactory := clients.NewGitHubClientFactory(providerMetrics) providerStore := providers.NewProviderStore(store) - projectCreator := projects.NewProjectCreator(authzClient, marketplace, &cfg.DefaultProfiles) + projectCreator := projects.NewProjectCreator(authzClient, marketplace, &cfg.DefaultProfiles, &cfg.Features) propSvc := propService.NewPropertiesService(store) - featureFlagClient := openfeature.NewClient(cfg.Flags.AppName) // TODO: isolate GitHub-specific wiring. We'll need to isolate GitHub // webhook handling to make this viable. @@ -170,6 +171,7 @@ func AllInOneServerService( repos := repositories.NewRepositoryService(store, propSvc, evt, providerManager) projectDeleter := projects.NewProjectDeleter(authzClient, providerManager) sessionsService := session.NewProviderSessionService(providerManager, providerStore, store) + dataSourcesSvc := datasourcessvc.NewDataSourceService(store) s := controlplane.NewServer( store, @@ -187,6 +189,7 @@ func AllInOneServerService( profileSvc, historySvc, ruleSvc, + dataSourcesSvc, ghProviders, providerManager, providerAuthManager, diff --git a/internal/util/cli/providerconfig.go b/internal/util/cli/providerconfig.go index d8741495c5..16e803e592 100644 --- a/internal/util/cli/providerconfig.go +++ b/internal/util/cli/providerconfig.go @@ -97,7 +97,8 @@ func SetProviderConfig( Provider: &providerName, }, Patch: &minderv1.Provider{ - Config: cfg, + Config: cfg, + Version: "v1", }, } diff --git a/internal/util/cli/table/layouts/layouts.go b/internal/util/cli/table/layouts/layouts.go index 507c642a06..650fab37b5 100644 --- a/internal/util/cli/table/layouts/layouts.go +++ b/internal/util/cli/table/layouts/layouts.go @@ -34,6 +34,8 @@ const ( RoleList TableLayout = "role_list" // Default is the default table layout Default TableLayout = "" + // DataSourceList is the data source list table layout + DataSourceList TableLayout = "datasource_list" ) // Color is the type for table colors diff --git a/internal/util/cli/table/simple/simple.go b/internal/util/cli/table/simple/simple.go index 08f03d9a0c..28c1a1f477 100644 --- a/internal/util/cli/table/simple/simple.go +++ b/internal/util/cli/table/simple/simple.go @@ -43,6 +43,8 @@ func New(layout layouts.TableLayout, header []string) *Table { roleListLayout(table) case layouts.EvaluationHistory: evaluationHistoryLayout(table) + case layouts.DataSourceList: + dataSourceListLayout(table) case layouts.Default: table.SetHeader(header) defaultLayout(table) @@ -106,7 +108,7 @@ func profileStatusLayout(table *tablewriter.Table) { func ruleEvaluationsLayout(table *tablewriter.Table) { defaultLayout(table) table.SetHeader([]string{ - "Rule Name", "Rule Type", "Entity", "Status", "Remediation", "Entity Info"}) + "Rule Name", "Entity", "Status", "Remediation", "Entity Info"}) table.SetAutoMergeCellsByColumnIndex([]int{0, 1}) // This is needed for the rule definition and rule parameters table.SetAutoWrapText(true) @@ -154,3 +156,10 @@ func evaluationHistoryLayout(table *tablewriter.Table) { // This is needed for the rule definition and rule parameters table.SetAutoWrapText(true) } + +func dataSourceListLayout(table *tablewriter.Table) { + defaultLayout(table) + table.SetHeader([]string{"Project ID", "ID", "Name", "Description"}) + table.SetAutoMergeCellsByColumnIndex([]int{0, 1, 2, 3}) + table.SetAutoWrapText(true) +} diff --git a/internal/util/helpers.go b/internal/util/helpers.go index 8fdde4e9fa..e621ede603 100644 --- a/internal/util/helpers.go +++ b/internal/util/helpers.go @@ -117,7 +117,10 @@ func GetGrpcConnection( } } - credentialOpts := credentials.NewTLS(&tls.Config{MinVersion: tls.VersionTLS13}) + credentialOpts := credentials.NewTLS(&tls.Config{ + MinVersion: tls.VersionTLS13, + ServerName: grpc_host, + }) if allowInsecure { credentialOpts = insecure.NewCredentials() } diff --git a/internal/util/jsonyaml/jsonyamlutils.go b/internal/util/jsonyaml/jsonyamlutils.go index a39c93c45a..5bc6e70f6d 100644 --- a/internal/util/jsonyaml/jsonyamlutils.go +++ b/internal/util/jsonyaml/jsonyamlutils.go @@ -38,7 +38,9 @@ func TranscodeYAMLToJSON(r io.Reader, w io.Writer) error { // TranscodeJSONToYAML transcodes JSON to YAML func TranscodeJSONToYAML(r io.Reader, w io.Writer) error { - return transcode(json.NewDecoder(r), yaml.NewEncoder(w)) + enc := yaml.NewEncoder(w) + enc.SetIndent(2) + return transcode(json.NewDecoder(r), enc) } // ConvertYamlToJson converts yaml to json diff --git a/internal/util/jsonyaml/jsonyamlutils_test.go b/internal/util/jsonyaml/jsonyamlutils_test.go index 50e50a5cad..7371f98a8b 100644 --- a/internal/util/jsonyaml/jsonyamlutils_test.go +++ b/internal/util/jsonyaml/jsonyamlutils_test.go @@ -83,9 +83,9 @@ func TestConvertJSONToYAML(t *testing.T) { name: "complex yaml", jsonCase: "{\"bar\":[\"foo\",\"bar\",\"baz\"],\"foo\":\"bar\"}\n", wantW: `bar: - - foo - - bar - - baz + - foo + - bar + - baz foo: bar `, wantErr: false, diff --git a/internal/util/rand/random.go b/internal/util/rand/random.go index 2cfb5cb7cc..015146d498 100644 --- a/internal/util/rand/random.go +++ b/internal/util/rand/random.go @@ -22,9 +22,9 @@ func NewRand(seed int64) *rand.Rand { } // RandomInt returns a random integer between min and max. -func RandomInt(min, max int64, seed int64) int64 { +func RandomInt(minVal, maxVal int64, seed int64) int64 { r := NewRand(seed) - return min + r.Int63n(max-min+1) + return minVal + r.Int63n(maxVal-minVal+1) } // RandomString returns a random string of length n. diff --git a/internal/util/rand/random_test.go b/internal/util/rand/random_test.go index 1653ac45a2..5cb658709b 100644 --- a/internal/util/rand/random_test.go +++ b/internal/util/rand/random_test.go @@ -14,12 +14,12 @@ import ( func TestRandomInt(t *testing.T) { t.Parallel() - min := int64(1) - max := int64(10) + minVal := int64(1) + maxVal := int64(10) seed := int64(12345) - randomInt := rand.RandomInt(min, max, seed) - require.GreaterOrEqual(t, randomInt, min) - require.LessOrEqual(t, randomInt, max) + randomInt := rand.RandomInt(minVal, maxVal, seed) + require.GreaterOrEqual(t, randomInt, minVal) + require.LessOrEqual(t, randomInt, maxVal) } func TestRandomString(t *testing.T) { diff --git a/internal/util/schemaupdate/schemaupdate.go b/internal/util/schemaupdate/schemaupdate.go index 297142eda3..298fb3c77b 100644 --- a/internal/util/schemaupdate/schemaupdate.go +++ b/internal/util/schemaupdate/schemaupdate.go @@ -19,18 +19,26 @@ import ( // ValidateSchemaUpdate validates that the new json schema doesn't break // profiles using this rule type func ValidateSchemaUpdate(oldRuleSchema *structpb.Struct, newRuleSchema *structpb.Struct) error { - if len(newRuleSchema.GetFields()) == 0 { + oldSchemaMap := oldRuleSchema.AsMap() + newSchemaMap := newRuleSchema.AsMap() + + return ValidateSchemaUpdateMap(oldSchemaMap, newSchemaMap) +} + +// ValidateSchemaUpdateMap validates that the new json schema doesn't break +// profiles using this rule type +func ValidateSchemaUpdateMap(oldSchemaMap, newSchemaMap map[string]any) error { + if len(newSchemaMap) == 0 { // If the new schema is empty (including nil), we're good // The rule type has removed the schema and profiles // won't break return nil } - if schemaIsNilOrEmpty(oldRuleSchema) && !schemaIsNilOrEmpty(newRuleSchema) { + if schemaIsNilOrEmpty(oldSchemaMap) && !schemaIsNilOrEmpty(newSchemaMap) { // If old is nil and new is not, we need to verify that // the new definition is not introducing required fields - newrs := newRuleSchema.AsMap() - if _, ok := newrs["required"]; ok { + if _, ok := newSchemaMap["required"]; ok { return fmt.Errorf("cannot add required fields to rule schema") } @@ -39,9 +47,6 @@ func ValidateSchemaUpdate(oldRuleSchema *structpb.Struct, newRuleSchema *structp return nil } - oldSchemaMap := oldRuleSchema.AsMap() - newSchemaMap := newRuleSchema.AsMap() - oldTypeCast, err := getOrInferType(oldSchemaMap) if err != nil { return err @@ -97,29 +102,41 @@ func validateObjectSchemaUpdate(oldSchemaMap, newSchemaMap map[string]any) error } func validateProperties(oldSchemaMap, newSchemaMap map[string]any) error { - dst, err := deepcopy.Anything(newSchemaMap) - if err != nil { - return fmt.Errorf("failed to deepcopy old schema: %v", err) + oldProperties, hasOldProperties := oldSchemaMap["properties"] + newProperties, hasNewProperties := newSchemaMap["properties"] + + if !hasNewProperties || !hasOldProperties { + return fmt.Errorf("cannot remove properties from object type rule schema") } - castedDst := dst.(map[string]any) + oldPropertiesMap, ok := oldProperties.(map[string]any) + if !ok { + return fmt.Errorf("invalid old properties field") + } + newPropertiesMap, ok := newProperties.(map[string]any) + if !ok { + return fmt.Errorf("invalid new properties field") + } - err = mergo.Merge(&castedDst, &oldSchemaMap, mergo.WithOverride, mergo.WithSliceDeepCopy) + // copy new schema to avoid modifying the original + mergedSchema, err := copySchema(newPropertiesMap) if err != nil { - return fmt.Errorf("failed to merge old and new schema: %v", err) + return fmt.Errorf("failed to copy new schema: %v", err) } - // We need to ignore the description field when comparing the old and new schema to allow - // to update the ruletype text. We also need to ignore changing defaults as they are advisory - // for the UI at the moment - opts := []cmp.Option{ - cmp.FilterPath(isScalarDescription, cmp.Ignore()), - cmp.FilterPath(isDefaultValue, cmp.Ignore()), + // Merge the old schema into the new schema. + // The merged schema should equal the new schema if the old schema + // is a subset of the new schema + err = mergo.Merge(&mergedSchema, &oldPropertiesMap, mergo.WithOverride, mergo.WithSliceDeepCopy) + if err != nil { + return fmt.Errorf("failed to merge old and new schema: %v", err) } // The new schema should be a superset of the old schema // if it's not, we may break profiles using this rule type - if !cmp.Equal(newSchemaMap, castedDst, opts...) { + // The mergedSchema is the new schema with the old schema merged in + // so we can compare it to the new schema directly + if !schemasAreEqual(mergedSchema, newPropertiesMap) { return fmt.Errorf("cannot remove properties from rule schema") } @@ -204,12 +221,15 @@ func validateRequired(oldSchemaMap, newSchemaMap map[string]any) error { oldRequired, hasOldRequired := oldSchemaMap["required"] newRequired, hasNewRequired := newSchemaMap["required"] + // If we don't have required fields in either schema, we're good if !hasNewRequired && !hasOldRequired { // If we don't have required fields in either schema, we're good // profiles using this rule type won't break return nil } + // If the new schema doesn't have required fields, but the old schema does, + // we're good if !hasNewRequired && hasOldRequired { // If we don't have required fields in the new schema but do // in the old schema, we're good. @@ -217,6 +237,8 @@ func validateRequired(oldSchemaMap, newSchemaMap map[string]any) error { return nil } + // If the new schema has required fields, but the old schema doesn't, + // we may break profiles using this rule type if hasNewRequired && !hasOldRequired { // If we have required fields in the new schema but not the old // schema, we may break profiles using this rule type @@ -235,21 +257,26 @@ func validateRequired(oldSchemaMap, newSchemaMap map[string]any) error { // We need to make sure that the old required fields are // a superset of the new required fields - oldSet := sets.New(oldRequiredSlice...) - newSet := sets.New(newRequiredSlice...) - if !oldSet.IsSuperset(newSet) { + if !requiredIsSuperset(oldRequiredSlice, newRequiredSlice) { return fmt.Errorf("cannot add required fields to rule schema") } return nil } -func schemaIsNilOrEmpty(schema *structpb.Struct) bool { +func requiredIsSuperset(oldRequired, newRequired []interface{}) bool { + oldSet := sets.New(oldRequired...) + newSet := sets.New(newRequired...) + + return oldSet.IsSuperset(newSet) +} + +func schemaIsNilOrEmpty(schema map[string]any) bool { if schema == nil { return true } - return len(schema.AsMap()) == 0 + return len(schema) == 0 } func validateArraySchemaUpdate(oldSchemaMap, newSchemaMap map[string]any) error { @@ -288,3 +315,25 @@ func validateItems(oldSchemaMap, newSchemaMap map[string]any) error { return nil } +func copySchema(s map[string]any) (map[string]any, error) { + dst, err := deepcopy.Anything(s) + if err != nil { + return nil, fmt.Errorf("failed to deepcopy: %v", err) + } + + castedDst, ok := dst.(map[string]any) + if !ok { + return nil, fmt.Errorf("failed to cast schema to map") + } + return castedDst, nil +} + +func schemasAreEqual(a, b map[string]any) bool { + // We need to ignore the description field when comparing the old and new schema to allow + // to update the ruletype text. We also need to ignore changing defaults as they are advisory + // for the UI at the moment + return cmp.Equal(a, b, + cmp.FilterPath(isScalarDescription, cmp.Ignore()), + cmp.FilterPath(isDefaultValue, cmp.Ignore()), + ) +} diff --git a/internal/util/schemaupdate/schemaupdate_test.go b/internal/util/schemaupdate/schemaupdate_test.go index c5e4df76ab..78670eae8f 100644 --- a/internal/util/schemaupdate/schemaupdate_test.go +++ b/internal/util/schemaupdate/schemaupdate_test.go @@ -99,6 +99,28 @@ func TestValidateSchemaUpdate(t *testing.T) { }, wantErr: true, }, + { + name: "removing required fields is allowed", + args: args{ + oldRuleSchemaDef: `{ + "type": "object", + "properties": { + "foo": { + "type": "string" + } + }, + "required": ["foo"] + }`, + newRuleSchemaDef: `{ + "type": "object", + "properties": { + "foo": { + "type": "string" + } + } + }`, + }, + }, { name: "old schema should error if new schema deletes fields", args: args{ @@ -299,6 +321,23 @@ func TestValidateSchemaUpdate(t *testing.T) { }, wantErr: true, }, + { + name: "Removing the properties map is not allowed", + args: args{ + oldRuleSchemaDef: `{ + "type": "object", + "properties": { + "foo": { + "type": "string" + } + } + }`, + newRuleSchemaDef: `{ + "type": "object" + }`, + }, + wantErr: true, + }, } for _, tt := range tests { tt := tt diff --git a/internal/util/schemavalidate/validate.go b/internal/util/schemavalidate/validate.go new file mode 100644 index 0000000000..83a35ce265 --- /dev/null +++ b/internal/util/schemavalidate/validate.go @@ -0,0 +1,71 @@ +// SPDX-FileCopyrightText: Copyright 2023 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package schemavalidate provides utilities for validating JSON schemas. +package schemavalidate + +import ( + "fmt" + "strings" + + "github.com/santhosh-tekuri/jsonschema/v6" + "google.golang.org/protobuf/types/known/structpb" +) + +// CompileSchemaFromPB compiles a JSON schema from a protobuf Struct. +func CompileSchemaFromPB(schemaData *structpb.Struct) (*jsonschema.Schema, error) { + if schemaData == nil { + return nil, nil + } + + return CompileSchemaFromMap(schemaData.AsMap()) +} + +// CompileSchemaFromMap compiles a JSON schema from a map. +func CompileSchemaFromMap(schemaData map[string]any) (*jsonschema.Schema, error) { + compiler := jsonschema.NewCompiler() + if err := compiler.AddResource("schema.json", schemaData); err != nil { + return nil, fmt.Errorf("invalid schema: %w", err) + } + return compiler.Compile("schema.json") +} + +// ValidateAgainstSchema validates an object against a JSON schema. +func ValidateAgainstSchema(schema *jsonschema.Schema, obj map[string]any) error { + if err := schema.Validate(obj); err != nil { + if verror, ok := err.(*jsonschema.ValidationError); ok { + return buildValidationError(verror.Causes) + } + return fmt.Errorf("invalid json schema: %s", err) + } + return nil +} + +func buildValidationError(errs []*jsonschema.ValidationError) error { + problems := make([]string, 0, len(errs)) + for _, desc := range errs { + problems = append(problems, desc.Error()) + } + + return fmt.Errorf("invalid json schema: %s", strings.TrimSpace(strings.Join(problems, "\n"))) +} + +// ApplyDefaults recursively applies default values from the schema to the object. +func ApplyDefaults(schema *jsonschema.Schema, obj map[string]any) { + for key, def := range schema.Properties { + // If the key does not exist in obj, apply the default value from the schema if present + if _, exists := obj[key]; !exists && def.Default != nil { + obj[key] = *def.Default + } + + // If def has properties, apply defaults to the nested object + if def.Properties != nil { + o, ok := obj[key].(map[string]any) + if !ok { + // cannot apply defaults to non-object types + continue + } + ApplyDefaults(def, o) + } + } +} diff --git a/pkg/api/openapi/minder/v1/minder.swagger.json b/pkg/api/openapi/minder/v1/minder.swagger.json index a4c7b28569..31d3c652cc 100644 --- a/pkg/api/openapi/minder/v1/minder.swagger.json +++ b/pkg/api/openapi/minder/v1/minder.swagger.json @@ -23,6 +23,9 @@ { "name": "ProfileService" }, + { + "name": "DataSourceService" + }, { "name": "RuleTypeService" }, @@ -77,7 +80,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -121,7 +124,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -165,7 +168,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -178,6 +181,7 @@ }, { "name": "from", + "description": "from is the filter to apply to the list of artifacts.\nAn example is \"repository=org1/repo1,org2/repo2\"\nto filter by repository names. This is optional.", "in": "query", "required": false, "type": "string" @@ -215,7 +219,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -228,6 +232,7 @@ }, { "name": "from", + "description": "from is the filter to apply to the list of artifacts.\nAn example is \"repository=org1/repo1,org2/repo2\"\nto filter by repository names. This is optional.", "in": "query", "required": false, "type": "string" @@ -278,19 +283,14 @@ "parameters": [ { "name": "cli", + "description": "cli is true if the request is being made from a CLI.", "in": "query", "required": false, "type": "boolean" }, - { - "name": "port", - "in": "query", - "required": false, - "type": "integer", - "format": "int32" - }, { "name": "owner", + "description": "owner is the owner (e.g GitHub org) that the provider is associated with.\nThis is optional.", "in": "query", "required": false, "type": "string" @@ -304,7 +304,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -317,6 +317,7 @@ }, { "name": "redirectUrl", + "description": "redirect_url is the URL to redirect to after the authorization is complete.", "in": "query", "required": false, "type": "string" @@ -362,7 +363,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -377,7 +378,7 @@ "name": "enrollmentNonce", "description": "enrollment_nonce is the state parameter returned when enrolling the provider", "in": "query", - "required": false, + "required": true, "type": "string" } ], @@ -421,7 +422,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -473,7 +474,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -522,6 +523,238 @@ ] } }, + "/api/v1/data_source": { + "post": { + "operationId": "DataSourceService_CreateDataSource", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1CreateDataSourceResponse" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1CreateDataSourceRequest" + } + } + ], + "tags": [ + "DataSourceService" + ] + }, + "put": { + "operationId": "DataSourceService_UpdateDataSource", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1UpdateDataSourceResponse" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1UpdateDataSourceRequest" + } + } + ], + "tags": [ + "DataSourceService" + ] + } + }, + "/api/v1/data_source/name/{name}": { + "get": { + "operationId": "DataSourceService_GetDataSourceByName", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1GetDataSourceByNameResponse" + } + } + }, + "parameters": [ + { + "name": "name", + "in": "path", + "required": true, + "type": "string", + "pattern": ".+" + }, + { + "name": "context.projectId", + "description": "project is the project ID. If empty or unset, will select the user's default project\nif they only have one project.", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "context.provider", + "description": "name of the provider. Set to empty string when not applicable.", + "in": "query", + "required": false, + "type": "string" + } + ], + "tags": [ + "DataSourceService" + ] + }, + "delete": { + "operationId": "DataSourceService_DeleteDataSourceByName", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1DeleteDataSourceByNameResponse" + } + } + }, + "parameters": [ + { + "name": "name", + "in": "path", + "required": true, + "type": "string", + "pattern": ".+" + }, + { + "name": "context.projectId", + "description": "project is the project ID. If empty or unset, will select the user's default project\nif they only have one project.", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "context.provider", + "description": "name of the provider. Set to empty string when not applicable.", + "in": "query", + "required": false, + "type": "string" + } + ], + "tags": [ + "DataSourceService" + ] + } + }, + "/api/v1/data_source/{id}": { + "get": { + "operationId": "DataSourceService_GetDataSourceById", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1GetDataSourceByIdResponse" + } + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "context.projectId", + "description": "project is the project ID. If empty or unset, will select the user's default project\nif they only have one project.", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "context.provider", + "description": "name of the provider. Set to empty string when not applicable.", + "in": "query", + "required": false, + "type": "string" + } + ], + "tags": [ + "DataSourceService" + ] + }, + "delete": { + "operationId": "DataSourceService_DeleteDataSourceById", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1DeleteDataSourceByIdResponse" + } + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "context.projectId", + "description": "project is the project ID. If empty or unset, will select the user's default project\nif they only have one project.", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "context.provider", + "description": "name of the provider. Set to empty string when not applicable.", + "in": "query", + "required": false, + "type": "string" + } + ], + "tags": [ + "DataSourceService" + ] + } + }, + "/api/v1/data_sources": { + "get": { + "operationId": "DataSourceService_ListDataSources", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ListDataSourcesResponse" + } + } + }, + "parameters": [ + { + "name": "context.projectId", + "description": "project is the project ID. If empty or unset, will select the user's default project\nif they only have one project.", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "context.provider", + "description": "name of the provider. Set to empty string when not applicable.", + "in": "query", + "required": false, + "type": "string" + } + ], + "tags": [ + "DataSourceService" + ] + } + }, "/api/v1/health": { "get": { "operationId": "HealthService_CheckHealth", @@ -559,7 +792,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -652,18 +885,29 @@ "type": "string", "format": "date-time" }, + { + "name": "labelFilter", + "description": "Filter evaluation history to only those matching the specified labels.\n\nThe default is to return all user-created profiles; the string \"*\" can\nbe used to select all profiles, including system profiles. This syntax\nmay be expanded in the future.", + "in": "query", + "required": false, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi" + }, { "name": "cursor.cursor", - "description": "cursor is the index to start from within the collection being\nretrieved. It's an opaque payload specified and interpreted on\nan per-rpc basis.", + "description": "cursor is the index to start from within the collection being\nretrieved. It's an opaque payload specified and interpreted on\nan per-rpc basis. An empty string is used to indicate the first\nitem in the collection.", "in": "query", "required": false, "type": "string" }, { "name": "cursor.size", - "description": "size is the number of items to retrieve from the collection.", + "description": "size is the number of items to retrieve from the collection.\n0 uses a server-defined default.", "in": "query", - "required": false, + "required": true, "type": "integer", "format": "int64" } @@ -700,7 +944,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -742,45 +986,6 @@ ] } }, - "/api/v1/my/providers": { - "get": { - "summary": "GetUnclaimedProviders returns a list of known provider configurations\nthat this user could claim based on their identity. This is a read-only\noperation for use by clients which wish to present a menu of options.", - "operationId": "ProvidersService_GetUnclaimedProviders", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v1GetUnclaimedProvidersResponse" - } - } - }, - "parameters": [ - { - "name": "context.provider", - "description": "name of the provider", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "context.project", - "description": "ID of the project", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "context.retiredOrganization", - "in": "query", - "required": false, - "type": "string" - } - ], - "tags": [ - "ProvidersService" - ] - } - }, "/api/v1/permissions/assign": { "post": { "operationId": "PermissionsService_AssignRole", @@ -828,7 +1033,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -866,7 +1071,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -881,7 +1086,7 @@ "name": "roleAssignment.role", "description": "role is the role that is assigned.", "in": "query", - "required": false, + "required": true, "type": "string" }, { @@ -953,7 +1158,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -1075,7 +1280,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -1121,7 +1326,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -1136,7 +1341,7 @@ "name": "entity.type", "description": "entity is the entity to get status for. Incompatible with `all`", "in": "query", - "required": false, + "required": true, "type": "string", "enum": [ "ENTITY_UNSPECIFIED", @@ -1155,11 +1360,12 @@ "name": "entity.id", "description": "id is the ID of the entity to get status for. Incompatible with `all`", "in": "query", - "required": false, + "required": true, "type": "string" }, { "name": "all", + "description": "all is true if the status of all entities should be returned.\nIncompatible with `entity`. This is optional.", "in": "query", "required": false, "type": "boolean" @@ -1173,12 +1379,14 @@ }, { "name": "ruleType", + "description": "rule_type is the type of the rule to filter on.\nThis is optional.", "in": "query", "required": false, "type": "string" }, { "name": "ruleName", + "description": "rule_name is the name of the rule to filter on.\nThis is optional.", "in": "query", "required": false, "type": "string" @@ -1217,7 +1425,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -1260,7 +1468,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -1312,7 +1520,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -1350,7 +1558,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -1388,7 +1596,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -1447,7 +1655,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -1540,7 +1748,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -1597,7 +1805,7 @@ "parameters": [ { "name": "context.projectId", - "description": "project is the project ID", + "description": "project is the project ID. If empty or unset, will select the user's default project\nif they only have one project.", "in": "path", "required": true, "type": "string" @@ -1669,7 +1877,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -1707,7 +1915,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -1720,9 +1928,9 @@ }, { "name": "limit", - "description": "limit is the maximum number of providers to return.", + "description": "limit is the maximum number of providers to return.\n0 uses a server-defined default.", "in": "query", - "required": false, + "required": true, "type": "integer", "format": "int32" }, @@ -1758,7 +1966,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -1826,7 +2034,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -1871,7 +2079,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -1916,7 +2124,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -1953,6 +2161,7 @@ }, { "name": "limit", + "description": "limit is the maximum number of results to return.\nThis is optional.", "in": "query", "required": false, "type": "string", @@ -1967,7 +2176,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -1980,6 +2189,7 @@ }, { "name": "cursor", + "description": "cursor is the cursor to use for the next page of results.\nThis is optional.", "in": "query", "required": false, "type": "string" @@ -2010,6 +2220,7 @@ }, { "name": "limit", + "description": "limit is the maximum number of results to return.\nThis is optional.", "in": "query", "required": false, "type": "string", @@ -2024,7 +2235,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -2037,6 +2248,7 @@ }, { "name": "cursor", + "description": "cursor is the cursor to use for the next page of results.\nThis is optional.", "in": "query", "required": false, "type": "string" @@ -2074,7 +2286,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -2118,7 +2330,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -2162,7 +2374,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -2204,7 +2416,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -2255,7 +2467,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -2304,7 +2516,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -2355,7 +2567,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -2404,7 +2616,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -2500,7 +2712,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -2623,7 +2835,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -2668,7 +2880,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -2711,7 +2923,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -2749,7 +2961,7 @@ }, { "name": "context.project", - "description": "ID of the project", + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project.", "in": "query", "required": false, "type": "string" @@ -2873,6 +3085,17 @@ } }, "definitions": { + "AlertAlertTypePRComment": { + "type": "object", + "properties": { + "reviewMessage": { + "type": "string" + } + }, + "required": [ + "reviewMessage" + ] + }, "AlertAlertTypeSA": { "type": "object", "properties": { @@ -2881,6 +3104,20 @@ } } }, + "DefPath": { + "type": "object", + "properties": { + "fileName": { + "type": "string" + }, + "alternatives": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, "DefinitionAlert": { "type": "object", "properties": { @@ -2889,6 +3126,9 @@ }, "securityAdvisory": { "$ref": "#/definitions/AlertAlertTypeSA" + }, + "pullRequestComment": { + "$ref": "#/definitions/AlertAlertTypePRComment" } } }, @@ -2897,7 +3137,7 @@ "properties": { "type": { "type": "string", - "title": "type is the type of the data evaluation.\nRight now only `jq` is supported as a driver" + "description": "type is the type of the data evaluation." }, "jq": { "type": "array", @@ -2922,9 +3162,20 @@ "homoglyphs": { "$ref": "#/definitions/EvalHomoglyphs", "description": "homoglyphs is only used if the `homoglyphs` type is selected." + }, + "dataSources": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1DataSourceReference" + }, + "description": "Data sources that the rule refers to. These are used to\ninstantiate the relevant data sources for the rule and keep\ntrack of them as dependencies.\n\nNote that the data source must exist in the project hierarchy\nin order to be used in the rule." } }, - "description": "Eval defines the data evaluation definition.\nThis pertains to the way we traverse data from the upstream\nendpoint and how we compare it to the rule." + "description": "Eval defines the data evaluation definition.\nThis pertains to the way we traverse data from the upstream\nendpoint and how we compare it to the rule.", + "required": [ + "type" + ] }, "DefinitionIngest": { "type": "object", @@ -2943,18 +3194,25 @@ }, "artifact": { "$ref": "#/definitions/v1ArtifactType", - "description": "artifact is the artifact data ingestion." + "description": "artifact is the artifact data ingestion.\nartifact currently only applies to artifacts." }, "git": { "$ref": "#/definitions/v1GitType", - "description": "git is the git data ingestion." + "description": "git is the git data ingestion.\ngit currently only applies to repositories." }, "diff": { "$ref": "#/definitions/v1DiffType", - "description": "diff is the diff data ingestion." + "description": "diff is the diff data ingestion.\ndiff currently only applies to pull_requests." + }, + "deps": { + "$ref": "#/definitions/v1DepsType", + "description": "deps is the deps data ingestion.\ndeps currently only applies to repositories." } }, - "description": "Ingest defines how the data is ingested." + "description": "Ingest defines how the data is ingested.", + "required": [ + "type" + ] }, "DefinitionRemediate": { "type": "object", @@ -2973,6 +3231,24 @@ } } }, + "DepsTypePullRequestConfigs": { + "type": "object", + "properties": { + "filter": { + "type": "string", + "description": "filter is the filter to apply to the PRs. The default value is \"NEW_AND_UPDATED\"." + } + } + }, + "DepsTypeRepoConfigs": { + "type": "object", + "properties": { + "branch": { + "type": "string" + } + }, + "description": "branch is the branch of the git repository, when applied to repository entities.\nHas no meaning or effect on other entity types." + }, "DiffTypeEcosystem": { "type": "object", "properties": { @@ -3003,12 +3279,15 @@ }, "profile": { "$ref": "#/definitions/JQComparisonOperator", - "description": "Profile points to the profile itself." + "description": "Profile points to the profile itself.\nThis is mutually exclusive with the `constant` field." }, "constant": { - "title": "Constant points to a constant value" + "description": "Constant points to a constant value.\nThis is mutually exclusive with the `profile` field." } - } + }, + "required": [ + "ingested" + ] }, "EvalRego": { "type": "object", @@ -3025,7 +3304,10 @@ "type": "string", "description": "how are violations reported. This is only used if the\n`constraints` type is selected. The default is `text`\nwhich returns human-readable text. The other option is\n`json` which returns a JSON array containing the violations." } - } + }, + "required": [ + "def" + ] }, "EvalTrusty": { "type": "object", @@ -3046,7 +3328,10 @@ "def": { "type": "string" } - } + }, + "required": [ + "def" + ] }, "ListEvaluationResultsResponseEntityEvaluationResults": { "type": "object", @@ -3084,15 +3369,20 @@ "type": "object", "properties": { "accessToken": { - "type": "string" + "type": "string", + "description": "access_token is the token to store." }, "owner": { - "type": "string" + "type": "string", + "description": "owner is the owner (e.g GitHub org) that the provider is associated with.\nThis is optional." }, "context": { "$ref": "#/definitions/v1Context" } - } + }, + "required": [ + "accessToken" + ] }, "ProfileRule": { "type": "object", @@ -3183,11 +3473,11 @@ "properties": { "title": { "type": "string", - "title": "the title of the PR" + "description": "the title of the PR\nThis is not validated here as it will be validated by the repository provider, i.e. GitHub upon\ncreation of the PR." }, "body": { "type": "string", - "title": "the body of the PR" + "description": "the body of the PR\nThis is not validated here as it will be validated by the repository provider, i.e. GitHub upon\ncreation of the PR." }, "contents": { "type": "array", @@ -3198,7 +3488,11 @@ }, "method": { "type": "string", - "title": "the method to use to create the PR. For now, these are supported:\n-- minder.content - ensures that the content of the file is exactly as specified\n refer to the Content message for more details\n-- minder.actions.replace_tags_with_sha - finds any github actions within a workflow\n file and replaces the tag with the SHA" + "title": "the method to use to create the PR. For now, these are supported:\n-- minder.content - ensures that the content of the file is exactly as specified\n refer to the Content message for more details\n-- minder.actions.replace_tags_with_sha - finds any github actions within a workflow\n file and replaces the tag with the SHA\n-- minder.yq.evaluate - evaluates a yq expression on a file" + }, + "params": { + "type": "object", + "description": "params are unstructured parameters passed to the method. These are optional\nand evaluated by the method." }, "actionsReplaceTagsWithSha": { "$ref": "#/definitions/PullRequestRemediationActionsReplaceTagsWithSha", @@ -3211,21 +3505,22 @@ "type": "object", "properties": { "repository": { - "$ref": "#/definitions/v1UpstreamRepositoryRef" + "$ref": "#/definitions/v1UpstreamRepositoryRef", + "description": "repository is the repository to register. This is optional if entity\nis set." }, "context": { "$ref": "#/definitions/v1Context" }, "entity": { "$ref": "#/definitions/v1UpstreamEntityRef", - "description": "entity is the entity to register. This is the same as the repository\nfield, but uses the new UpstreamEntityRef message. This is what we'll\nmigrate to eventually." + "description": "entity is the entity to register. This is the same as the repository\nfield, but uses the new UpstreamEntityRef message. This is what we'll\nmigrate to eventually. This is optional if repository is set." } } }, - "RestTypeFallback": { + "RestDataSourceDefFallback": { "type": "object", "properties": { - "httpCode": { + "httpStatus": { "type": "integer", "format": "int32" }, @@ -3262,7 +3557,11 @@ "$ref": "#/definitions/DefinitionAlert" } }, - "description": "Definition defines the rule type. It encompases the schema and the data evaluation." + "description": "Definition defines the rule type. It encompases the schema and the data evaluation.", + "required": [ + "ingest", + "eval" + ] }, "protobufNullValue": { "type": "string", @@ -3279,7 +3578,8 @@ "type": "string" }, "owner": { - "type": "string" + "type": "string", + "description": "owner is the artifact owner. This is optional." }, "name": { "type": "string" @@ -3291,7 +3591,8 @@ "type": "string" }, "repository": { - "type": "string" + "type": "string", + "description": "repository is the repository the artifact originated from.\nThis is optional." }, "versions": { "type": "array", @@ -3307,7 +3608,14 @@ "context": { "$ref": "#/definitions/v1Context" } - } + }, + "required": [ + "artifactPk", + "name", + "type", + "visibility", + "createdAt" + ] }, "v1ArtifactType": { "type": "object", @@ -3333,7 +3641,8 @@ "type": "string", "format": "date-time" } - } + }, + "description": "ArtifactVersion is a version of an artifact.\nThis is currently not populated in any requests or responses." }, "v1AssignRoleRequest": { "type": "object", @@ -3346,18 +3655,21 @@ "$ref": "#/definitions/v1RoleAssignment", "description": "role_assignment is the role assignment to be created." } - } + }, + "required": [ + "roleAssignment" + ] }, "v1AssignRoleResponse": { "type": "object", "properties": { "roleAssignment": { "$ref": "#/definitions/v1RoleAssignment", - "description": "role_assignment is the role assignment that was created." + "description": "role_assignment is the role assignment that was created.\nThis is optional." }, "invitation": { "$ref": "#/definitions/v1Invitation", - "description": "invitation contains the details of the invitation for the\nassigned user to join the project if the user is not already\na member." + "description": "invitation contains the details of the invitation for the\nassigned user to join the project if the user is not already\na member. This is optional." } } }, @@ -3396,7 +3708,10 @@ "status": { "type": "string" } - } + }, + "required": [ + "status" + ] }, "v1Context": { "type": "object", @@ -3407,7 +3722,7 @@ }, "project": { "type": "string", - "title": "ID of the project" + "description": "ID of the project. If empty or unset, will select the user's default project\nif they only have one project." }, "retiredOrganization": { "type": "string" @@ -3420,7 +3735,7 @@ "properties": { "projectId": { "type": "string", - "title": "project is the project ID" + "description": "project is the project ID. If empty or unset, will select the user's default project\nif they only have one project." }, "provider": { "type": "string", @@ -3429,6 +3744,23 @@ }, "description": "ContextV2 defines the context in which a rule is evaluated." }, + "v1CreateDataSourceRequest": { + "type": "object", + "properties": { + "dataSource": { + "$ref": "#/definitions/v1DataSource" + } + }, + "title": "DataSource service" + }, + "v1CreateDataSourceResponse": { + "type": "object", + "properties": { + "dataSource": { + "$ref": "#/definitions/v1DataSource" + } + } + }, "v1CreateEntityReconciliationTaskRequest": { "type": "object", "properties": { @@ -3440,7 +3772,10 @@ "$ref": "#/definitions/v1Context", "description": "context is the context in which the entity reconciliation task is created." } - } + }, + "required": [ + "entity" + ] }, "v1CreateEntityReconciliationTaskResponse": { "type": "object" @@ -3452,7 +3787,10 @@ "$ref": "#/definitions/v1Profile" } }, - "title": "Profile service" + "title": "Profile service", + "required": [ + "profile" + ] }, "v1CreateProfileResponse": { "type": "object", @@ -3460,7 +3798,10 @@ "profile": { "$ref": "#/definitions/v1Profile" } - } + }, + "required": [ + "profile" + ] }, "v1CreateProjectRequest": { "type": "object", @@ -3473,7 +3814,10 @@ "type": "string", "description": "name is the name of the project to create." } - } + }, + "required": [ + "name" + ] }, "v1CreateProjectResponse": { "type": "object", @@ -3482,7 +3826,10 @@ "$ref": "#/definitions/v1Project", "description": "project is the project that was created." } - } + }, + "required": [ + "project" + ] }, "v1CreateProviderRequest": { "type": "object", @@ -3495,7 +3842,10 @@ "$ref": "#/definitions/v1Provider", "description": "provider is the provider to be created." } - } + }, + "required": [ + "provider" + ] }, "v1CreateProviderResponse": { "type": "object", @@ -3508,7 +3858,10 @@ "$ref": "#/definitions/v1AuthorizationParams", "description": "authorization provides additional authorization information needed\nto complete the initialization of the provider." } - } + }, + "required": [ + "provider" + ] }, "v1CreateRuleTypeRequest": { "type": "object", @@ -3518,7 +3871,10 @@ "description": "rule_type is the rule type to be created." } }, - "description": "CreateRuleTypeRequest is the request to create a rule type." + "description": "CreateRuleTypeRequest is the request to create a rule type.", + "required": [ + "ruleType" + ] }, "v1CreateRuleTypeResponse": { "type": "object", @@ -3528,7 +3884,10 @@ "description": "rule_type is the rule type that was created." } }, - "description": "CreateRuleTypeResponse is the response to create a rule type." + "description": "CreateRuleTypeResponse is the response to create a rule type.", + "required": [ + "ruleType" + ] }, "v1CreateUserRequest": { "type": "object", @@ -3563,22 +3922,32 @@ "context": { "$ref": "#/definitions/v1Context" } - } + }, + "required": [ + "id", + "projectId", + "projectName", + "identitySubject", + "createdAt" + ] }, "v1Cursor": { "type": "object", "properties": { "cursor": { "type": "string", - "description": "cursor is the index to start from within the collection being\nretrieved. It's an opaque payload specified and interpreted on\nan per-rpc basis." + "description": "cursor is the index to start from within the collection being\nretrieved. It's an opaque payload specified and interpreted on\nan per-rpc basis. An empty string is used to indicate the first\nitem in the collection." }, "size": { "type": "integer", "format": "int64", - "description": "size is the number of items to retrieve from the collection." + "description": "size is the number of items to retrieve from the collection.\n0 uses a server-defined default." } }, - "description": "Cursor message to be used in request messages. Its purpose is to\nallow clients to specify the subset of records to retrieve by means\nof index within a collection, along with the number of items to\nretrieve." + "description": "Cursor message to be used in request messages. Its purpose is to\nallow clients to specify the subset of records to retrieve by means\nof index within a collection, along with the number of items to\nretrieve.", + "required": [ + "size" + ] }, "v1CursorPage": { "type": "object", @@ -3590,14 +3959,79 @@ }, "next": { "$ref": "#/definitions/v1Cursor", - "description": "Cursor pointing to retrieve results logically placed after the\nones shipped with the message containing this struct." + "description": "Cursor pointing to retrieve results logically placed after the\nones shipped with the message containing this struct. This is optional." }, "prev": { "$ref": "#/definitions/v1Cursor", - "description": "Cursor pointing to retrieve results logically placed before the\nones shipped with the message containing this struct." + "description": "Cursor pointing to retrieve results logically placed before the\nones shipped with the message containing this struct. This is optional." + } + }, + "description": "CursorPage message used in response messages. Its purpose is to\nsend to clients links pointing to next and/or previous collection\nsubsets with respect to the one containing this struct." + }, + "v1DataSource": { + "type": "object", + "properties": { + "version": { + "type": "string", + "description": "version is the version of the data source API." + }, + "type": { + "type": "string", + "title": "type is the data source type" + }, + "context": { + "$ref": "#/definitions/v1ContextV2", + "description": "context is the context in which the data source is evaluated.\nNote that in this case we only need the project in the\ncontext, since data sources are not provider-specific." + }, + "name": { + "type": "string", + "description": "name is the name of the data source.\nNote that this is unique within a project hierarchy.\nNames must be lowercase and can only contain letters, numbers,\nhyphens, and underscores." + }, + "id": { + "type": "string", + "description": "id is the unique identifier of the data source.", + "readOnly": true + }, + "structured": { + "$ref": "#/definitions/v1StructDataSource", + "description": "structured is the structired data - data source." + }, + "rest": { + "$ref": "#/definitions/v1RestDataSource", + "description": "rest is the REST data source driver." + } + }, + "description": "DataSource is a Data source instance. Data sources represent\nexternal integrations that enrich the data in Minder, but do not\nhave explicit lifecycle objects (entities). Integrations which\ncreate entities are called Providers.", + "required": [ + "version", + "name" + ] + }, + "v1DataSourceReference": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "refer to a data source by name." + } + }, + "description": "DataSourceReference is a reference to a data source.\nNote that for a resource to refer to a data source the data source must\nbe available in the same project hierarchy." + }, + "v1DeleteDataSourceByIdResponse": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + } + }, + "v1DeleteDataSourceByNameResponse": { + "type": "object", + "properties": { + "name": { + "type": "string" } - }, - "description": "CursorPage message used in response messages. Its purpose is to\nsend to clients links pointing to next and/or previous collection\nsubsets with respect to the one containing this struct." + } }, "v1DeleteProfileResponse": { "type": "object" @@ -3609,7 +4043,10 @@ "type": "string", "description": "project_id is the id of the project that was deleted." } - } + }, + "required": [ + "projectId" + ] }, "v1DeleteProviderByIDResponse": { "type": "object", @@ -3618,7 +4055,10 @@ "type": "string", "title": "id is the id of the provider that was deleted" } - } + }, + "required": [ + "id" + ] }, "v1DeleteProviderResponse": { "type": "object", @@ -3627,7 +4067,10 @@ "type": "string", "title": "name is the name of the provider that was deleted" } - } + }, + "required": [ + "name" + ] }, "v1DeleteRepositoryByIdResponse": { "type": "object", @@ -3635,7 +4078,10 @@ "repositoryId": { "type": "string" } - } + }, + "required": [ + "repositoryId" + ] }, "v1DeleteRepositoryByNameResponse": { "type": "object", @@ -3643,7 +4089,10 @@ "name": { "type": "string" } - } + }, + "required": [ + "name" + ] }, "v1DeleteRuleTypeResponse": { "type": "object", @@ -3652,6 +4101,18 @@ "v1DeleteUserResponse": { "type": "object" }, + "v1DepsType": { + "type": "object", + "properties": { + "repo": { + "$ref": "#/definitions/DepsTypeRepoConfigs" + }, + "pr": { + "$ref": "#/definitions/DepsTypePullRequestConfigs" + } + }, + "description": "DepsType defines the \"deps\" ingester which can extract depndencies in protobom\nformat for rule evaluation." + }, "v1DiffType": { "type": "object", "properties": { @@ -3698,7 +4159,11 @@ "title": "id is the ID of the entity to get status for. Incompatible with `all`" } }, - "description": "EntiryTypeId is a message that carries an ID together with a type to uniquely identify an entity\nsuch as (repo, 1), (artifact, 2), ..." + "description": "EntiryTypeId is a message that carries an ID together with a type to uniquely identify an entity\nsuch as (repo, 1), (artifact, 2), ...", + "required": [ + "type", + "id" + ] }, "v1EvalResultAlert": { "type": "object", @@ -3740,11 +4205,11 @@ }, "alert": { "$ref": "#/definitions/v1EvaluationHistoryAlert", - "description": "alert contains details of the alerts for this evaluation." + "description": "alert contains details of the alerts for this evaluation.\nThis is optional." }, "remediation": { "$ref": "#/definitions/v1EvaluationHistoryRemediation", - "description": "remediation contains details of the remediation for this evaluation." + "description": "remediation contains details of the remediation for this evaluation.\nThis is optional." }, "evaluatedAt": { "type": "string", @@ -3755,7 +4220,15 @@ "type": "string", "description": "id is the unique identifier of the evaluation." } - } + }, + "description": "EvaluationHistory represents the history of an entity evaluation.\nThis is only used in responses.", + "required": [ + "entity", + "rule", + "status", + "evaluatedAt", + "id" + ] }, "v1EvaluationHistoryAlert": { "type": "object", @@ -3768,7 +4241,10 @@ "type": "string", "description": "details contains optional details about the alert.\nthe structure and contents are alert specific, and are subject to change." } - } + }, + "required": [ + "status" + ] }, "v1EvaluationHistoryEntity": { "type": "object", @@ -3785,7 +4261,12 @@ "type": "string", "description": "name is the entity name." } - } + }, + "required": [ + "id", + "type", + "name" + ] }, "v1EvaluationHistoryRemediation": { "type": "object", @@ -3798,7 +4279,10 @@ "type": "string", "description": "details contains optional details about the remediation.\nthe structure and contents are remediation specific, and are subject to change." } - } + }, + "required": [ + "status" + ] }, "v1EvaluationHistoryRule": { "type": "object", @@ -3819,7 +4303,13 @@ "$ref": "#/definitions/v1Severity", "description": "severity is the severity of the rule type." } - } + }, + "required": [ + "name", + "ruleType", + "profile", + "severity" + ] }, "v1EvaluationHistoryStatus": { "type": "object", @@ -3832,7 +4322,11 @@ "type": "string", "description": "details contains optional details about the evaluation.\nthe structure and contents are rule type specific, and are subject to change." } - } + }, + "required": [ + "status", + "details" + ] }, "v1GetArtifactByIdResponse": { "type": "object", @@ -3845,9 +4339,13 @@ "items": { "type": "object", "$ref": "#/definitions/v1ArtifactVersion" - } + }, + "description": "This is optional and currently always nil." } - } + }, + "required": [ + "artifact" + ] }, "v1GetArtifactByNameResponse": { "type": "object", @@ -3860,9 +4358,13 @@ "items": { "type": "object", "$ref": "#/definitions/v1ArtifactVersion" - } + }, + "description": "This is optional and currently always nil." } - } + }, + "required": [ + "artifact" + ] }, "v1GetAuthorizationURLResponse": { "type": "object", @@ -3873,6 +4375,26 @@ "state": { "type": "string" } + }, + "required": [ + "url", + "state" + ] + }, + "v1GetDataSourceByIdResponse": { + "type": "object", + "properties": { + "dataSource": { + "$ref": "#/definitions/v1DataSource" + } + } + }, + "v1GetDataSourceByNameResponse": { + "type": "object", + "properties": { + "dataSource": { + "$ref": "#/definitions/v1DataSource" + } } }, "v1GetEvaluationHistoryResponse": { @@ -3883,7 +4405,10 @@ "title": "The requested record" } }, - "description": "GetEvaluationHistoryResponse represents a response message for the\nGetEvaluationHistory RPC." + "description": "GetEvaluationHistoryResponse represents a response message for the\nGetEvaluationHistory RPC.", + "required": [ + "evaluation" + ] }, "v1GetInviteDetailsResponse": { "type": "object", @@ -3905,7 +4430,13 @@ "type": "boolean", "title": "expired is true if the invitation has expired" } - } + }, + "required": [ + "projectDisplay", + "sponsorDisplay", + "expiresAt", + "expired" + ] }, "v1GetProfileByIdResponse": { "type": "object", @@ -3913,7 +4444,10 @@ "profile": { "$ref": "#/definitions/v1Profile" } - } + }, + "required": [ + "profile" + ] }, "v1GetProfileByNameResponse": { "type": "object", @@ -3921,7 +4455,10 @@ "profile": { "$ref": "#/definitions/v1Profile" } - } + }, + "required": [ + "profile" + ] }, "v1GetProfileStatusByNameResponse": { "type": "object", @@ -3938,7 +4475,10 @@ }, "title": "rule_evaluation_status is the status of the rules" } - } + }, + "required": [ + "profileStatus" + ] }, "v1GetProfileStatusByProjectResponse": { "type": "object", @@ -3951,7 +4491,10 @@ }, "title": "profile_status is the status of the profile" } - } + }, + "required": [ + "profileStatus" + ] }, "v1GetProviderResponse": { "type": "object", @@ -3960,7 +4503,10 @@ "$ref": "#/definitions/v1Provider", "description": "provider is the provider that was retrieved." } - } + }, + "required": [ + "provider" + ] }, "v1GetRepositoryByIdResponse": { "type": "object", @@ -3968,7 +4514,10 @@ "repository": { "$ref": "#/definitions/v1Repository" } - } + }, + "required": [ + "repository" + ] }, "v1GetRepositoryByNameResponse": { "type": "object", @@ -3976,7 +4525,10 @@ "repository": { "$ref": "#/definitions/v1Repository" } - } + }, + "required": [ + "repository" + ] }, "v1GetRuleTypeByIdResponse": { "type": "object", @@ -3986,7 +4538,10 @@ "description": "rule_type is the rule type." } }, - "description": "GetRuleTypeByIdResponse is the response to get a rule type by id." + "description": "GetRuleTypeByIdResponse is the response to get a rule type by id.", + "required": [ + "ruleType" + ] }, "v1GetRuleTypeByNameResponse": { "type": "object", @@ -3996,20 +4551,10 @@ "description": "rule_type is the rule type." } }, - "description": "GetRuleTypeByNameResponse is the response to get a rule type by name." - }, - "v1GetUnclaimedProvidersResponse": { - "type": "object", - "properties": { - "providers": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1ProviderParameter" - }, - "description": "providers is a set of parameters which can be supplied to allow the user\nto assign existing unclaimed credentials to a new provider in the project\nvia CreateProvider()." - } - } + "description": "GetRuleTypeByNameResponse is the response to get a rule type by name.", + "required": [ + "ruleType" + ] }, "v1GetUserResponse": { "type": "object", @@ -4032,7 +4577,11 @@ "$ref": "#/definitions/v1ProjectRole" } } - } + }, + "required": [ + "user", + "projectRoles" + ] }, "v1GitHubAppParams": { "type": "object", @@ -4121,7 +4670,12 @@ "type": "boolean", "description": "emailSkipped is true if the email was not sent to the invitee." } - } + }, + "description": "Invitation is an invitation to join a project. This is only used in responses.", + "required": [ + "role", + "project" + ] }, "v1ListArtifactsResponse": { "type": "object", @@ -4133,7 +4687,10 @@ "$ref": "#/definitions/v1Artifact" } } - } + }, + "required": [ + "results" + ] }, "v1ListChildProjectsResponse": { "type": "object", @@ -4145,6 +4702,21 @@ "$ref": "#/definitions/v1Project" } } + }, + "required": [ + "projects" + ] + }, + "v1ListDataSourcesResponse": { + "type": "object", + "properties": { + "dataSources": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1DataSource" + } + } } }, "v1ListEvaluationHistoryResponse": { @@ -4163,7 +4735,10 @@ "description": "Metadata of the current page and pointers to next and/or\nprevious pages." } }, - "description": "ListEvaluationHistoryResponse represents a response message for the\nListEvaluationHistory RPC.\n\nIt ships a collection of records retrieved and pointers to get to\nthe next and/or previous pages of data." + "description": "ListEvaluationHistoryResponse represents a response message for the\nListEvaluationHistory RPC.\n\nIt ships a collection of records retrieved and pointers to get to\nthe next and/or previous pages of data.", + "required": [ + "data" + ] }, "v1ListEvaluationResultsResponse": { "type": "object", @@ -4176,7 +4751,10 @@ }, "description": "Each entity selected by the list request will have _single_ entry in entities which contains results of all evaluations for each profile." } - } + }, + "required": [ + "entities" + ] }, "v1ListInvitationsResponse": { "type": "object", @@ -4188,7 +4766,10 @@ "$ref": "#/definitions/v1Invitation" } } - } + }, + "required": [ + "invitations" + ] }, "v1ListProfilesResponse": { "type": "object", @@ -4200,7 +4781,10 @@ "$ref": "#/definitions/v1Profile" } } - } + }, + "required": [ + "profiles" + ] }, "v1ListProjectsResponse": { "type": "object", @@ -4212,7 +4796,10 @@ "$ref": "#/definitions/v1Project" } } - } + }, + "required": [ + "projects" + ] }, "v1ListProviderClassesResponse": { "type": "object", @@ -4224,7 +4811,10 @@ }, "description": "provider_classes is the list of provider classes." } - } + }, + "required": [ + "providerClasses" + ] }, "v1ListProvidersResponse": { "type": "object", @@ -4240,7 +4830,10 @@ "type": "string", "title": "cursor is the cursor to use for the next page of results, empty if at the end" } - } + }, + "required": [ + "providers" + ] }, "v1ListRemoteRepositoriesFromProviderResponse": { "type": "object", @@ -4260,7 +4853,11 @@ }, "description": "entities is the same list as the repositories, but it\nuses the new UpstreamEntityRef message. This is what\nwe'll migrate to eventually." } - } + }, + "required": [ + "results", + "entities" + ] }, "v1ListRepositoriesResponse": { "type": "object", @@ -4276,7 +4873,10 @@ "type": "string", "title": "cursor is the cursor to use for the next page of results, empty if at the end" } - } + }, + "required": [ + "results" + ] }, "v1ListRoleAssignmentsResponse": { "type": "object", @@ -4297,7 +4897,11 @@ }, "description": "invitations contains outstanding role invitations which have not yet\nbeen accepted by a user." } - } + }, + "required": [ + "roleAssignments", + "invitations" + ] }, "v1ListRolesResponse": { "type": "object", @@ -4309,7 +4913,10 @@ "$ref": "#/definitions/v1Role" } } - } + }, + "required": [ + "roles" + ] }, "v1ListRuleTypesResponse": { "type": "object", @@ -4323,7 +4930,10 @@ "description": "rule_types is the list of rule types." } }, - "description": "ListRuleTypesResponse is the response to list rule types." + "description": "ListRuleTypesResponse is the response to list rule types.", + "required": [ + "ruleTypes" + ] }, "v1PatchProfileResponse": { "type": "object", @@ -4331,7 +4941,10 @@ "profile": { "$ref": "#/definitions/v1Profile" } - } + }, + "required": [ + "profile" + ] }, "v1PatchProjectResponse": { "type": "object", @@ -4340,7 +4953,10 @@ "$ref": "#/definitions/v1Project", "description": "project is the project that was updated." } - } + }, + "required": [ + "project" + ] }, "v1PatchProviderResponse": { "type": "object", @@ -4348,7 +4964,10 @@ "provider": { "$ref": "#/definitions/v1Provider" } - } + }, + "required": [ + "provider" + ] }, "v1Profile": { "type": "object", @@ -4457,18 +5076,18 @@ "description": "display_name is the display name of the profile." } }, - "description": "Profile defines a profile that is user defined." + "description": "Profile defines a profile that is user defined.\nAll fields are optional because we want to allow partial updates." }, "v1ProfileStatus": { "type": "object", "properties": { "profileId": { "type": "string", - "title": "profile_id is the id of the profile" + "description": "profile_id is the id of the profile. One of profile_id or profile_name must be set." }, "profileName": { "type": "string", - "title": "profile_name is the name of the profile" + "description": "profile_name is the name of the profile. One of profile_id or profile_name must be set." }, "profileStatus": { "type": "string", @@ -4484,7 +5103,10 @@ "title": "profile_display_name is the display name of the profile" } }, - "title": "get the overall profile status" + "title": "get the overall profile status as output", + "required": [ + "profileStatus" + ] }, "v1Project": { "type": "object", @@ -4496,7 +5118,8 @@ "type": "string" }, "description": { - "type": "string" + "type": "string", + "description": "description is a human-readable description of the project.\nThis is optional." }, "createdAt": { "type": "string", @@ -4508,10 +5131,16 @@ }, "displayName": { "type": "string", - "description": "display_name allows for a human-readable name to be used.\ndisplay_names are short *non-unique* strings to provide\na user-friendly name for presentation in lists, etc." + "description": "display_name allows for a human-readable name to be used.\ndisplay_names are short *non-unique* strings to provide\na user-friendly name for presentation in lists, etc.\nThis is optional." } }, - "title": "Project API Objects" + "description": "Project API Objects. This is only used in responses.", + "required": [ + "projectId", + "name", + "createdAt", + "updatedAt" + ] }, "v1ProjectPatch": { "type": "object", @@ -4536,7 +5165,11 @@ "$ref": "#/definitions/v1Project" } }, - "title": "ProjectRole has the project along with the role the user has in the project" + "title": "ProjectRole has the project along with the role the user has in the project", + "required": [ + "role", + "project" + ] }, "v1Provider": { "type": "object", @@ -4555,7 +5188,7 @@ }, "version": { "type": "string", - "description": "version is the version of the provider." + "description": "version is the version of the provider.\nif unset, \"v1\" is assumed." }, "implements": { "type": "array", @@ -4582,8 +5215,13 @@ "credentialsState": { "type": "string", "description": "credentials_state is the state of the credentials for the provider.\nThis is an output-only field. It may be: \"set\", \"unset\", \"not_applicable\"." + }, + "id": { + "type": "string", + "description": "id is the unique identifier of the provider." } - } + }, + "description": "Provider represents a provider that is used to interact with external systems.\nAll fields are optional because we want to allow partial updates." }, "v1ProviderParameter": { "type": "object", @@ -4614,9 +5252,13 @@ "$ref": "#/definitions/v1Context" }, "entity": { - "type": "string" + "type": "string", + "title": "entity is the entity type" } - } + }, + "required": [ + "entity" + ] }, "v1ReconcileEntityRegistrationResponse": { "type": "object" @@ -4630,7 +5272,10 @@ "status": { "$ref": "#/definitions/v1RegisterRepoResultStatus" } - } + }, + "required": [ + "status" + ] }, "v1RegisterRepoResultStatus": { "type": "object", @@ -4650,14 +5295,15 @@ "type": "string" }, "repository": { - "$ref": "#/definitions/v1UpstreamRepositoryRef" + "$ref": "#/definitions/v1UpstreamRepositoryRef", + "description": "repository is the repository to register. This is optional if entity\nis set." }, "context": { "$ref": "#/definitions/v1Context" }, "entity": { "$ref": "#/definitions/v1UpstreamEntityRef", - "description": "entity is the entity to register. This is the same as the repository\nfield, but uses the new UpstreamEntityRef message. This is what we'll\nmigrate to eventually." + "description": "entity is the entity to register. This is the same as the repository\nfield, but uses the new UpstreamEntityRef message. This is what we'll\nmigrate to eventually. This is optional if repository is set." } } }, @@ -4667,7 +5313,10 @@ "result": { "$ref": "#/definitions/v1RegisterRepoResult" } - } + }, + "required": [ + "result" + ] }, "v1RegistrableUpstreamEntityRef": { "type": "object", @@ -4679,7 +5328,10 @@ "type": "boolean", "description": "True if the entity is already registered in Minder." } - } + }, + "required": [ + "entity" + ] }, "v1RemoveRoleResponse": { "type": "object", @@ -4699,7 +5351,7 @@ "properties": { "id": { "type": "string", - "title": "This is optional when returning remote repositories" + "description": "id is the unique identifier of the repository within Minder.\nIt is always populated, but the optional keyword is used for\nbackwards compatibility." }, "context": { "$ref": "#/definitions/v1Context" @@ -4760,7 +5412,15 @@ "type": "object", "description": "properties is a map of properties of the entity." } - } + }, + "description": "Repository API objects. This is only used in responses.", + "required": [ + "id", + "owner", + "name", + "isPrivate", + "isFork" + ] }, "v1ResolveInvitationResponse": { "type": "object", @@ -4785,14 +5445,91 @@ "type": "string", "description": "project_display is the display name of the project to which the user\nis invited." } - } + }, + "required": [ + "role", + "project", + "isAccepted" + ] + }, + "v1RestDataSource": { + "type": "object", + "properties": { + "def": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/v1RestDataSourceDef" + }, + "description": "defs is the list of definitions for the REST API." + } + }, + "description": "RestDataSource is the REST data source driver." + }, + "v1RestDataSourceDef": { + "type": "object", + "properties": { + "endpoint": { + "type": "string", + "description": "endpoint is the URL of the REST API. Note that endpoints are\ntemplates that can be parameterized with variables. Parametrization\nis done using RFC 6570." + }, + "method": { + "type": "string", + "description": "method is the HTTP method to use for the request.\nIf left unset, it will default to \"GET\"." + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "headers is a map of headers to send with the request." + }, + "bodyobj": { + "type": "object", + "description": "body is the body of the request." + }, + "bodystr": { + "type": "string", + "description": "bodystr is the body of the request as a string." + }, + "bodyFromField": { + "type": "string", + "description": "body_from_field is the field in the input to use as the body.\nIf the value is an string, it will be used as the body, as is.\nIf the value is an object, it will be serialized as JSON.\nIf the value is not found in the input, the request will fail." + }, + "parse": { + "type": "string", + "description": "parse is the parse configuration for the response.\nThis allows us to serialize the response into a structured format,\nor not.\nIf left unset, the response will be treated as a string.\nIf set to \"json\", the response will be parsed as JSON." + }, + "fallback": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/RestDataSourceDefFallback" + }, + "description": "fallback is the fallback configuration for the response in case\nof an unexpected status code." + }, + "expectedStatus": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + }, + "description": "expected_status is the expected status code for the response.\nThis may be repeated to allow for multiple expected status codes.\nIf left unset, it will default to 200." + }, + "inputSchema": { + "type": "object", + "description": "input_schema is the schema for the input to the REST API." + } + }, + "required": [ + "endpoint" + ] }, "v1RestType": { "type": "object", "properties": { "endpoint": { "type": "string", - "description": "endpoint is the endpoint to fetch data from.\nThis can be a URL or the path on the API.bool\nThis is a required field and must be set.\nThis is also evaluated via a template which allows\nus dynamically fill in the values." + "description": "endpoint is the endpoint to fetch data from.\nThis can be a URL or path on the API.\nThis is a required field and must be set.\nThis is also evaluated via a template which allows\nus dynamically fill in the values." }, "method": { "type": "string", @@ -4807,7 +5544,7 @@ }, "body": { "type": "string", - "description": "body is the body to be sent to the endpoint." + "description": "body is the body to be sent to the endpoint.\nThis is expected to be a valid JSON string." }, "parse": { "type": "string", @@ -4817,12 +5554,28 @@ "type": "array", "items": { "type": "object", - "$ref": "#/definitions/RestTypeFallback" + "$ref": "#/definitions/v1RestTypeFallback" }, "description": "fallback provides a body that the ingester would return in case\nthe REST call returns a non-200 status code." } }, - "description": "RestType defines the rest data evaluation.\nThis is used to fetch data from a REST endpoint." + "description": "RestType defines the rest data evaluation.\nThis is used to fetch data from a REST endpoint.", + "required": [ + "endpoint" + ] + }, + "v1RestTypeFallback": { + "type": "object", + "properties": { + "httpCode": { + "type": "integer", + "format": "int32" + }, + "body": { + "type": "string", + "description": "This is expected to be a valid JSON string." + } + } }, "v1Role": { "type": "object", @@ -4839,7 +5592,12 @@ "type": "string", "description": "description is the description of the role." } - } + }, + "required": [ + "name", + "displayName", + "description" + ] }, "v1RoleAssignment": { "type": "object", @@ -4872,7 +5630,10 @@ "type": "string", "description": "last_name is the last name of the subject." } - } + }, + "required": [ + "role" + ] }, "v1RuleEvaluationStatus": { "type": "object", @@ -4944,7 +5705,7 @@ }, "severity": { "$ref": "#/definitions/v1Severity", - "title": "severity is the severity of the rule" + "description": "severity is the severity of the rule. This may be empty." }, "ruleEvaluationId": { "type": "string", @@ -4963,7 +5724,14 @@ "title": "release_phase is the phase of the release" } }, - "title": "get the status of the rules for a given profile" + "title": "get the status of the rules for a given profile", + "required": [ + "ruleId", + "entity", + "status", + "ruleTypeName", + "releasePhase" + ] }, "v1RuleType": { "type": "object", @@ -5002,11 +5770,11 @@ }, "description": { "type": "string", - "description": "description is the description of the rule type." + "description": "description is the description of the rule type.\nThis is expected to be a valid markdown formatted string." }, "guidance": { "type": "string", - "description": "guidance are instructions we give the user in case a rule fails." + "description": "guidance are instructions we give the user in case a rule fails.\nThis is expected to be a valid markdown formatted string." }, "severity": { "$ref": "#/definitions/v1Severity", @@ -5017,7 +5785,13 @@ "description": "release_phase is the release phase of the rule type, i.e. alpha, beta, ga, deprecated." } }, - "description": "RuleType defines rules that may or may not be user defined.\nThe version is assumed from the folder's version." + "description": "RuleType defines rules that may or may not be user defined.\nThe version is assumed from the folder's version.", + "required": [ + "name", + "def", + "description", + "guidance" + ] }, "v1RuleTypeReleasePhase": { "type": "string", @@ -5062,26 +5836,75 @@ "type": "string" }, "accessToken": { - "type": "string" + "type": "string", + "description": "access_token is the token to store." }, "owner": { - "type": "string" + "type": "string", + "description": "owner is the owner (e.g GitHub org) that the provider is associated with.\nThis is optional." }, "context": { "$ref": "#/definitions/v1Context" } - } + }, + "required": [ + "accessToken" + ] }, "v1StoreProviderTokenResponse": { "type": "object" }, + "v1StructDataSource": { + "type": "object", + "properties": { + "def": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/v1StructDataSourceDef" + }, + "description": "defs is the list of definitions for the structured data API." + } + }, + "description": "StructDataSource is the structured data source driver." + }, + "v1StructDataSourceDef": { + "type": "object", + "properties": { + "path": { + "$ref": "#/definitions/DefPath", + "description": "Path is the path specification for the structured data source." + } + }, + "required": [ + "path" + ] + }, + "v1UpdateDataSourceRequest": { + "type": "object", + "properties": { + "dataSource": { + "$ref": "#/definitions/v1DataSource" + } + } + }, + "v1UpdateDataSourceResponse": { + "type": "object", + "properties": { + "dataSource": { + "$ref": "#/definitions/v1DataSource" + } + } + }, "v1UpdateProfileRequest": { "type": "object", "properties": { "profile": { "$ref": "#/definitions/v1Profile" } - } + }, + "required": [ + "profile" + ] }, "v1UpdateProfileResponse": { "type": "object", @@ -5089,7 +5912,10 @@ "profile": { "$ref": "#/definitions/v1Profile" } - } + }, + "required": [ + "profile" + ] }, "v1UpdateProjectRequest": { "type": "object", @@ -5100,11 +5926,11 @@ }, "displayName": { "type": "string", - "description": "display_name is the display name of the project to update." + "description": "display_name is the display name of the project to update.\nThis is optional." }, "description": { "type": "string", - "description": "description is the description of the project to update." + "description": "description is the description of the project to update.\nThis is optional." } } }, @@ -5115,7 +5941,10 @@ "$ref": "#/definitions/v1Project", "description": "project is the project that was updated." } - } + }, + "required": [ + "project" + ] }, "v1UpdateRoleRequest": { "type": "object", @@ -5139,7 +5968,10 @@ "type": "string", "title": "email is the email address of the subject used for updating invitations" } - } + }, + "required": [ + "roles" + ] }, "v1UpdateRoleResponse": { "type": "object", @@ -5170,7 +6002,10 @@ "description": "rule_type is the rule type to be updated." } }, - "description": "UpdateRuleTypeRequest is the request to update a rule type." + "description": "UpdateRuleTypeRequest is the request to update a rule type.", + "required": [ + "ruleType" + ] }, "v1UpdateRuleTypeResponse": { "type": "object", @@ -5180,7 +6015,10 @@ "description": "rule_type is the rule type that was updated." } }, - "description": "UpdateRuleTypeResponse is the response to update a rule type." + "description": "UpdateRuleTypeResponse is the response to update a rule type.", + "required": [ + "ruleType" + ] }, "v1UpstreamEntityRef": { "type": "object", @@ -5204,7 +6042,8 @@ "type": "object", "properties": { "owner": { - "type": "string" + "type": "string", + "description": "owner is the owner (e.g GitHub org) that the provider is associated with.\nThis is optional." }, "name": { "type": "string" @@ -5221,7 +6060,10 @@ "type": "boolean", "description": "True if the repository is already registered in Minder.\nThis is only set on output, and is ignored on input." } - } + }, + "required": [ + "name" + ] }, "v1UserRecord": { "type": "object", @@ -5242,19 +6084,30 @@ "format": "date-time" } }, - "title": "user record to be returned" + "title": "user record to be returned", + "required": [ + "id", + "identitySubject", + "createdAt", + "updatedAt" + ] }, "v1VerifyProviderCredentialResponse": { "type": "object", "properties": { "created": { - "type": "boolean" + "type": "boolean", + "description": "created is true if the provider was created." }, "providerName": { - "type": "string" + "type": "string", + "description": "provider_name is the name of the provider that was created.\nThis is populated if creation was successful." } }, - "title": "VerifyProviderCredentialRequest responds with a boolean indicating if the provider has been created and the provider\nname, if it has been created" + "title": "VerifyProviderCredentialRequest responds with a boolean indicating if the provider has been created and the provider\nname, if it has been created", + "required": [ + "created" + ] }, "v1VerifyProviderTokenFromResponse": { "type": "object", @@ -5262,7 +6115,10 @@ "status": { "type": "string" } - } + }, + "required": [ + "status" + ] } } } diff --git a/pkg/api/protobuf/go/minder/v1/api.go b/pkg/api/protobuf/go/minder/v1/api.go index 9a73a5ce3b..702176b8d7 100644 --- a/pkg/api/protobuf/go/minder/v1/api.go +++ b/pkg/api/protobuf/go/minder/v1/api.go @@ -10,6 +10,7 @@ import ( "fmt" "io" + "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/reflect/protoreflect" "github.com/mindersec/minder/internal/util/jsonyaml" @@ -51,16 +52,14 @@ const ( ArtifactResource ResourceType = "artifact" // ProjectResource is a project resource ProjectResource ResourceType = "project" + // DataSourceResource is a data source resource + DataSourceResource ResourceType = "data-source" ) // ResourceTypeIsValid checks if the resource type is valid func ResourceTypeIsValid(rt ResourceType) bool { - switch rt { - case RuleTypeResource, ProfileResource, EntityInstanceResource, RepositoryResource, ArtifactResource, - ProjectResource: - return true - } - return false + _, ok := resourceMatchers[rt] + return ok } var ( @@ -70,6 +69,7 @@ var ( EntityInstanceResource: &EntityInstance{}, RepositoryResource: &Repository{}, ArtifactResource: &Artifact{}, + DataSourceResource: &DataSource{}, } ) @@ -114,6 +114,33 @@ func ParseResource(r io.Reader, rm ResourceMeta) error { return nil } +// ParseResourceProto is a generic parser for Minder resources, similar to ParseResource. +// However, this function will decode the resource using the protojson package, which allows +// for more control over the decoding process and more complex cases such as one-of fields. +func ParseResourceProto(r io.Reader, rm ResourceMeta) error { + // We transcode to JSON so we can decode it straight to the protobuf structure + w := &bytes.Buffer{} + + if err := jsonyaml.TranscodeYAMLToJSON(r, w); err != nil { + return fmt.Errorf("error converting yaml to json: %w", err) + } + + if err := protojson.Unmarshal(w.Bytes(), rm); err != nil { + return errors.Join(ErrNotAResource, fmt.Errorf("error decoding resource: %w", err)) + } + + if err := Validate(rm); err != nil { + return fmt.Errorf("error validating resource meta: %w", err) + } + + // Attempt to match resource type before trying to decode + if !ResourceMatches(ResourceType(rm.GetType()), rm) { + return fmt.Errorf("resource type does not match: %w", ErrResourceTypeMismatch) + } + + return nil +} + // Validate is a utility function which allows for the validation of a struct. func Validate(r ResourceMeta) error { if r == nil { diff --git a/pkg/api/protobuf/go/minder/v1/api_test.go b/pkg/api/protobuf/go/minder/v1/api_test.go new file mode 100644 index 0000000000..5b77b7614a --- /dev/null +++ b/pkg/api/protobuf/go/minder/v1/api_test.go @@ -0,0 +1,61 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package v1 + +import ( + "fmt" + "io" + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestParseResourceProto(t *testing.T) { + t.Parallel() + + type args struct { + r io.Reader + rm *DataSource + } + tests := []struct { + name string + args args + wantErr assert.ErrorAssertionFunc + }{ + { + name: "test data source parsing", + args: args{ + r: strings.NewReader(` +version: v1 +type: "data-source" +name: "foo" +rest: + def: + foo: + input_schema: + properties: + foo: + type: "string" + description: "foo" + required: + - foo + endpoint: "http://example.com" + method: "GET" + headers: + Content-Type: "application/json" +`), + rm: &DataSource{}, + }, + wantErr: assert.NoError, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + tt.wantErr(t, ParseResourceProto(tt.args.r, tt.args.rm), fmt.Sprintf("ParseResourceProto(%v, %v)", tt.args.r, tt.args.rm)) + t.Logf("Resource: %+v", tt.args.rm) + }) + } +} diff --git a/pkg/api/protobuf/go/minder/v1/datasources.go b/pkg/api/protobuf/go/minder/v1/datasources.go new file mode 100644 index 0000000000..b494427fde --- /dev/null +++ b/pkg/api/protobuf/go/minder/v1/datasources.go @@ -0,0 +1,33 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package v1 + +import v1datasources "github.com/mindersec/minder/pkg/datasources/v1" + +// GetContext returns the v2 context from the CreateDataSourceRequest data source. +func (r *CreateDataSourceRequest) GetContext() *ContextV2 { + return r.DataSource.GetContext() +} + +// GetContext returns the v2 context embedded in the UpdateDataSourceRequest +// data source. +func (r *UpdateDataSourceRequest) GetContext() *ContextV2 { + return r.DataSource.GetContext() +} + +// GetDriverType returns the string representation of the driver type of the data source. +func (ds *DataSource) GetDriverType() string { + if ds == nil { + return "" + } + + switch ds.GetDriver().(type) { + case *DataSource_Rest: + return v1datasources.DataSourceDriverRest + case *DataSource_Structured: + return v1datasources.DataSourceDriverStruct + default: + return "unknown" + } +} diff --git a/pkg/api/protobuf/go/minder/v1/minder.pb.go b/pkg/api/protobuf/go/minder/v1/minder.pb.go index 796372e513..ecb8728a48 100644 --- a/pkg/api/protobuf/go/minder/v1/minder.pb.go +++ b/pkg/api/protobuf/go/minder/v1/minder.pb.go @@ -3,13 +3,14 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.1 // protoc (unknown) // source: minder/v1/minder.proto package v1 import ( + _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" @@ -118,6 +119,10 @@ const ( Relation_RELATION_ENTITY_RECONCILIATION_TASK_CREATE Relation = 35 Relation_RELATION_ENTITY_RECONCILE Relation = 36 Relation_RELATION_ROLE_ASSIGNMENT_UPDATE Relation = 37 + Relation_RELATION_DATA_SOURCE_GET Relation = 38 + Relation_RELATION_DATA_SOURCE_CREATE Relation = 39 + Relation_RELATION_DATA_SOURCE_UPDATE Relation = 40 + Relation_RELATION_DATA_SOURCE_DELETE Relation = 41 ) // Enum value maps for Relation. @@ -161,6 +166,10 @@ var ( 35: "RELATION_ENTITY_RECONCILIATION_TASK_CREATE", 36: "RELATION_ENTITY_RECONCILE", 37: "RELATION_ROLE_ASSIGNMENT_UPDATE", + 38: "RELATION_DATA_SOURCE_GET", + 39: "RELATION_DATA_SOURCE_CREATE", + 40: "RELATION_DATA_SOURCE_UPDATE", + 41: "RELATION_DATA_SOURCE_DELETE", } Relation_value = map[string]int32{ "RELATION_UNSPECIFIED": 0, @@ -201,6 +210,10 @@ var ( "RELATION_ENTITY_RECONCILIATION_TASK_CREATE": 35, "RELATION_ENTITY_RECONCILE": 36, "RELATION_ROLE_ASSIGNMENT_UPDATE": 37, + "RELATION_DATA_SOURCE_GET": 38, + "RELATION_DATA_SOURCE_CREATE": 39, + "RELATION_DATA_SOURCE_UPDATE": 40, + "RELATION_DATA_SOURCE_DELETE": 41, } ) @@ -702,17 +715,16 @@ func (x Severity_Value) Number() protoreflect.EnumNumber { // Deprecated: Use Severity_Value.Descriptor instead. func (Severity_Value) EnumDescriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{110, 0} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{123, 0} } type RpcOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - NoLog bool `protobuf:"varint,2,opt,name=no_log,json=noLog,proto3" json:"no_log,omitempty"` - TargetResource TargetResource `protobuf:"varint,6,opt,name=target_resource,json=targetResource,proto3,enum=minder.v1.TargetResource" json:"target_resource,omitempty"` - Relation Relation `protobuf:"varint,7,opt,name=relation,proto3,enum=minder.v1.Relation" json:"relation,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + NoLog bool `protobuf:"varint,2,opt,name=no_log,json=noLog,proto3" json:"no_log,omitempty"` + TargetResource TargetResource `protobuf:"varint,6,opt,name=target_resource,json=targetResource,proto3,enum=minder.v1.TargetResource" json:"target_resource,omitempty"` + Relation Relation `protobuf:"varint,7,opt,name=relation,proto3,enum=minder.v1.Relation" json:"relation,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *RpcOptions) Reset() { @@ -771,16 +783,17 @@ func (x *RpcOptions) GetRelation() Relation { // of index within a collection, along with the number of items to // retrieve. type Cursor struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // cursor is the index to start from within the collection being // retrieved. It's an opaque payload specified and interpreted on - // an per-rpc basis. + // an per-rpc basis. An empty string is used to indicate the first + // item in the collection. Cursor string `protobuf:"bytes,1,opt,name=cursor,proto3" json:"cursor,omitempty"` // size is the number of items to retrieve from the collection. - Size uint32 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"` + // 0 uses a server-defined default. + Size uint32 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Cursor) Reset() { @@ -831,18 +844,17 @@ func (x *Cursor) GetSize() uint32 { // send to clients links pointing to next and/or previous collection // subsets with respect to the one containing this struct. type CursorPage struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Total number of records matching the request. This is optional. TotalRecords uint32 `protobuf:"varint,1,opt,name=total_records,json=totalRecords,proto3" json:"total_records,omitempty"` // Cursor pointing to retrieve results logically placed after the - // ones shipped with the message containing this struct. + // ones shipped with the message containing this struct. This is optional. Next *Cursor `protobuf:"bytes,2,opt,name=next,proto3" json:"next,omitempty"` // Cursor pointing to retrieve results logically placed before the - // ones shipped with the message containing this struct. - Prev *Cursor `protobuf:"bytes,3,opt,name=prev,proto3" json:"prev,omitempty"` + // ones shipped with the message containing this struct. This is optional. + Prev *Cursor `protobuf:"bytes,3,opt,name=prev,proto3" json:"prev,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CursorPage) Reset() { @@ -897,13 +909,16 @@ func (x *CursorPage) GetPrev() *Cursor { } type ListArtifactsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` + // Deprecated: Marked as deprecated in minder/v1/minder.proto. Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` Context *Context `protobuf:"bytes,3,opt,name=context,proto3" json:"context,omitempty"` - From string `protobuf:"bytes,4,opt,name=from,proto3" json:"from,omitempty"` + // from is the filter to apply to the list of artifacts. + // An example is "repository=org1/repo1,org2/repo2" + // to filter by repository names. This is optional. + From string `protobuf:"bytes,4,opt,name=from,proto3" json:"from,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListArtifactsRequest) Reset() { @@ -936,6 +951,7 @@ func (*ListArtifactsRequest) Descriptor() ([]byte, []int) { return file_minder_v1_minder_proto_rawDescGZIP(), []int{3} } +// Deprecated: Marked as deprecated in minder/v1/minder.proto. func (x *ListArtifactsRequest) GetProvider() string { if x != nil { return x.Provider @@ -958,11 +974,10 @@ func (x *ListArtifactsRequest) GetFrom() string { } type ListArtifactsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Results []*Artifact `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` unknownFields protoimpl.UnknownFields - - Results []*Artifact `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListArtifactsResponse) Reset() { @@ -1003,19 +1018,21 @@ func (x *ListArtifactsResponse) GetResults() []*Artifact { } type Artifact struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` ArtifactPk string `protobuf:"bytes,1,opt,name=artifact_pk,json=artifactPk,proto3" json:"artifact_pk,omitempty"` - Owner string `protobuf:"bytes,2,opt,name=owner,proto3" json:"owner,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - Type string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"` - Visibility string `protobuf:"bytes,5,opt,name=visibility,proto3" json:"visibility,omitempty"` - Repository string `protobuf:"bytes,6,opt,name=repository,proto3" json:"repository,omitempty"` - Versions []*ArtifactVersion `protobuf:"bytes,7,rep,name=versions,proto3" json:"versions,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - Context *Context `protobuf:"bytes,9,opt,name=context,proto3" json:"context,omitempty"` + // owner is the artifact owner. This is optional. + Owner string `protobuf:"bytes,2,opt,name=owner,proto3" json:"owner,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"` + Visibility string `protobuf:"bytes,5,opt,name=visibility,proto3" json:"visibility,omitempty"` + // repository is the repository the artifact originated from. + // This is optional. + Repository string `protobuf:"bytes,6,opt,name=repository,proto3" json:"repository,omitempty"` + Versions []*ArtifactVersion `protobuf:"bytes,7,rep,name=versions,proto3" json:"versions,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + Context *Context `protobuf:"bytes,9,opt,name=context,proto3" json:"context,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Artifact) Reset() { @@ -1111,15 +1128,16 @@ func (x *Artifact) GetContext() *Context { return nil } +// ArtifactVersion is a version of an artifact. +// This is currently not populated in any requests or responses. type ArtifactVersion struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + VersionId int64 `protobuf:"varint,1,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + Tags []string `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty"` + Sha string `protobuf:"bytes,3,opt,name=sha,proto3" json:"sha,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` unknownFields protoimpl.UnknownFields - - VersionId int64 `protobuf:"varint,1,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` - Tags []string `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty"` - Sha string `protobuf:"bytes,3,opt,name=sha,proto3" json:"sha,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ArtifactVersion) Reset() { @@ -1181,12 +1199,11 @@ func (x *ArtifactVersion) GetCreatedAt() *timestamppb.Timestamp { } type GetArtifactByIdRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Context *Context `protobuf:"bytes,7,opt,name=context,proto3" json:"context,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Context *Context `protobuf:"bytes,7,opt,name=context,proto3" json:"context,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetArtifactByIdRequest) Reset() { @@ -1234,12 +1251,12 @@ func (x *GetArtifactByIdRequest) GetContext() *Context { } type GetArtifactByIdResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Artifact *Artifact `protobuf:"bytes,1,opt,name=artifact,proto3" json:"artifact,omitempty"` + // This is optional and currently always nil. + Versions []*ArtifactVersion `protobuf:"bytes,2,rep,name=versions,proto3" json:"versions,omitempty"` unknownFields protoimpl.UnknownFields - - Artifact *Artifact `protobuf:"bytes,1,opt,name=artifact,proto3" json:"artifact,omitempty"` - Versions []*ArtifactVersion `protobuf:"bytes,2,rep,name=versions,proto3" json:"versions,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetArtifactByIdResponse) Reset() { @@ -1287,12 +1304,11 @@ func (x *GetArtifactByIdResponse) GetVersions() []*ArtifactVersion { } type GetArtifactByNameRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Context *Context `protobuf:"bytes,4,opt,name=context,proto3" json:"context,omitempty"` unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Context *Context `protobuf:"bytes,4,opt,name=context,proto3" json:"context,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetArtifactByNameRequest) Reset() { @@ -1340,12 +1356,12 @@ func (x *GetArtifactByNameRequest) GetContext() *Context { } type GetArtifactByNameResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Artifact *Artifact `protobuf:"bytes,1,opt,name=artifact,proto3" json:"artifact,omitempty"` + // This is optional and currently always nil. + Versions []*ArtifactVersion `protobuf:"bytes,2,rep,name=versions,proto3" json:"versions,omitempty"` unknownFields protoimpl.UnknownFields - - Artifact *Artifact `protobuf:"bytes,1,opt,name=artifact,proto3" json:"artifact,omitempty"` - Versions []*ArtifactVersion `protobuf:"bytes,2,rep,name=versions,proto3" json:"versions,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetArtifactByNameResponse) Reset() { @@ -1392,158 +1408,16 @@ func (x *GetArtifactByNameResponse) GetVersions() []*ArtifactVersion { return nil } -type PullRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"` // The full URL to the PR - CommitSha string `protobuf:"bytes,2,opt,name=commit_sha,json=commitSha,proto3" json:"commit_sha,omitempty"` // Commit SHA of the PR HEAD. Will be useful to submit a review - Number int64 `protobuf:"varint,3,opt,name=number,proto3" json:"number,omitempty"` // The sequential PR number (not the DB PK!) - RepoOwner string `protobuf:"bytes,4,opt,name=repo_owner,json=repoOwner,proto3" json:"repo_owner,omitempty"` // The owner of the repo, will be used to submit a review - RepoName string `protobuf:"bytes,5,opt,name=repo_name,json=repoName,proto3" json:"repo_name,omitempty"` // The name of the repo, will be used to submit a review - AuthorId int64 `protobuf:"varint,6,opt,name=author_id,json=authorId,proto3" json:"author_id,omitempty"` // The author of the PR, will be used to check if we can request changes - Action string `protobuf:"bytes,7,opt,name=action,proto3" json:"action,omitempty"` // The action that triggered the webhook - Context *Context `protobuf:"bytes,8,opt,name=context,proto3" json:"context,omitempty"` - // properties is a map of properties of the entity. - Properties *structpb.Struct `protobuf:"bytes,9,opt,name=properties,proto3" json:"properties,omitempty"` - BaseCloneUrl string `protobuf:"bytes,10,opt,name=base_clone_url,json=baseCloneUrl,proto3" json:"base_clone_url,omitempty"` // URL used to clone the base repository - TargetCloneUrl string `protobuf:"bytes,11,opt,name=target_clone_url,json=targetCloneUrl,proto3" json:"target_clone_url,omitempty"` // URL used to clone the target repository - BaseRef string `protobuf:"bytes,12,opt,name=base_ref,json=baseRef,proto3" json:"base_ref,omitempty"` // The base ref of the PR - TargetRef string `protobuf:"bytes,13,opt,name=target_ref,json=targetRef,proto3" json:"target_ref,omitempty"` // The target ref of the PR -} - -func (x *PullRequest) Reset() { - *x = PullRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *PullRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PullRequest) ProtoMessage() {} - -func (x *PullRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[11] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PullRequest.ProtoReflect.Descriptor instead. -func (*PullRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{11} -} - -func (x *PullRequest) GetUrl() string { - if x != nil { - return x.Url - } - return "" -} - -func (x *PullRequest) GetCommitSha() string { - if x != nil { - return x.CommitSha - } - return "" -} - -func (x *PullRequest) GetNumber() int64 { - if x != nil { - return x.Number - } - return 0 -} - -func (x *PullRequest) GetRepoOwner() string { - if x != nil { - return x.RepoOwner - } - return "" -} - -func (x *PullRequest) GetRepoName() string { - if x != nil { - return x.RepoName - } - return "" -} - -func (x *PullRequest) GetAuthorId() int64 { - if x != nil { - return x.AuthorId - } - return 0 -} - -func (x *PullRequest) GetAction() string { - if x != nil { - return x.Action - } - return "" -} - -func (x *PullRequest) GetContext() *Context { - if x != nil { - return x.Context - } - return nil -} - -func (x *PullRequest) GetProperties() *structpb.Struct { - if x != nil { - return x.Properties - } - return nil -} - -func (x *PullRequest) GetBaseCloneUrl() string { - if x != nil { - return x.BaseCloneUrl - } - return "" -} - -func (x *PullRequest) GetTargetCloneUrl() string { - if x != nil { - return x.TargetCloneUrl - } - return "" -} - -func (x *PullRequest) GetBaseRef() string { - if x != nil { - return x.BaseRef - } - return "" -} - -func (x *PullRequest) GetTargetRef() string { - if x != nil { - return x.TargetRef - } - return "" -} - // Stubs for the SDLC entities type Release struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Release) Reset() { *x = Release{} - mi := &file_minder_v1_minder_proto_msgTypes[12] + mi := &file_minder_v1_minder_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1555,7 +1429,7 @@ func (x *Release) String() string { func (*Release) ProtoMessage() {} func (x *Release) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[12] + mi := &file_minder_v1_minder_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1568,18 +1442,18 @@ func (x *Release) ProtoReflect() protoreflect.Message { // Deprecated: Use Release.ProtoReflect.Descriptor instead. func (*Release) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{12} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{11} } type PipelineRun struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PipelineRun) Reset() { *x = PipelineRun{} - mi := &file_minder_v1_minder_proto_msgTypes[13] + mi := &file_minder_v1_minder_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1591,7 +1465,7 @@ func (x *PipelineRun) String() string { func (*PipelineRun) ProtoMessage() {} func (x *PipelineRun) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[13] + mi := &file_minder_v1_minder_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1604,18 +1478,18 @@ func (x *PipelineRun) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineRun.ProtoReflect.Descriptor instead. func (*PipelineRun) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{13} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{12} } type TaskRun struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *TaskRun) Reset() { *x = TaskRun{} - mi := &file_minder_v1_minder_proto_msgTypes[14] + mi := &file_minder_v1_minder_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1627,7 +1501,7 @@ func (x *TaskRun) String() string { func (*TaskRun) ProtoMessage() {} func (x *TaskRun) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[14] + mi := &file_minder_v1_minder_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1640,18 +1514,18 @@ func (x *TaskRun) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskRun.ProtoReflect.Descriptor instead. func (*TaskRun) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{14} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{13} } type Build struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Build) Reset() { *x = Build{} - mi := &file_minder_v1_minder_proto_msgTypes[15] + mi := &file_minder_v1_minder_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1663,7 +1537,7 @@ func (x *Build) String() string { func (*Build) ProtoMessage() {} func (x *Build) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[15] + mi := &file_minder_v1_minder_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1676,21 +1550,20 @@ func (x *Build) ProtoReflect() protoreflect.Message { // Deprecated: Use Build.ProtoReflect.Descriptor instead. func (*Build) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{15} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{14} } type GetInviteDetailsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Invite nonce/code to retrieve details for - Code string `protobuf:"bytes,2,opt,name=code,proto3" json:"code,omitempty"` + Code string `protobuf:"bytes,2,opt,name=code,proto3" json:"code,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetInviteDetailsRequest) Reset() { *x = GetInviteDetailsRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[16] + mi := &file_minder_v1_minder_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1702,7 +1575,7 @@ func (x *GetInviteDetailsRequest) String() string { func (*GetInviteDetailsRequest) ProtoMessage() {} func (x *GetInviteDetailsRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[16] + mi := &file_minder_v1_minder_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1715,7 +1588,7 @@ func (x *GetInviteDetailsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetInviteDetailsRequest.ProtoReflect.Descriptor instead. func (*GetInviteDetailsRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{16} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{15} } func (x *GetInviteDetailsRequest) GetCode() string { @@ -1726,10 +1599,7 @@ func (x *GetInviteDetailsRequest) GetCode() string { } type GetInviteDetailsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Project associated with the invite ProjectDisplay string `protobuf:"bytes,1,opt,name=project_display,json=projectDisplay,proto3" json:"project_display,omitempty"` // Sponsor of the invite @@ -1737,12 +1607,14 @@ type GetInviteDetailsResponse struct { // expires_at is the time at which the invitation expires. ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"` // expired is true if the invitation has expired - Expired bool `protobuf:"varint,4,opt,name=expired,proto3" json:"expired,omitempty"` + Expired bool `protobuf:"varint,4,opt,name=expired,proto3" json:"expired,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetInviteDetailsResponse) Reset() { *x = GetInviteDetailsResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[17] + mi := &file_minder_v1_minder_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1754,7 +1626,7 @@ func (x *GetInviteDetailsResponse) String() string { func (*GetInviteDetailsResponse) ProtoMessage() {} func (x *GetInviteDetailsResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[17] + mi := &file_minder_v1_minder_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1767,7 +1639,7 @@ func (x *GetInviteDetailsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetInviteDetailsResponse.ProtoReflect.Descriptor instead. func (*GetInviteDetailsResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{17} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{16} } func (x *GetInviteDetailsResponse) GetProjectDisplay() string { @@ -1799,14 +1671,14 @@ func (x *GetInviteDetailsResponse) GetExpired() bool { } type CheckHealthRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CheckHealthRequest) Reset() { *x = CheckHealthRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[18] + mi := &file_minder_v1_minder_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1818,7 +1690,7 @@ func (x *CheckHealthRequest) String() string { func (*CheckHealthRequest) ProtoMessage() {} func (x *CheckHealthRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[18] + mi := &file_minder_v1_minder_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1831,20 +1703,19 @@ func (x *CheckHealthRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckHealthRequest.ProtoReflect.Descriptor instead. func (*CheckHealthRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{18} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{17} } type CheckHealthResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` unknownFields protoimpl.UnknownFields - - Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CheckHealthResponse) Reset() { *x = CheckHealthResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[19] + mi := &file_minder_v1_minder_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1856,7 +1727,7 @@ func (x *CheckHealthResponse) String() string { func (*CheckHealthResponse) ProtoMessage() {} func (x *CheckHealthResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[19] + mi := &file_minder_v1_minder_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1869,7 +1740,7 @@ func (x *CheckHealthResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckHealthResponse.ProtoReflect.Descriptor instead. func (*CheckHealthResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{19} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{18} } func (x *CheckHealthResponse) GetStatus() string { @@ -1880,23 +1751,25 @@ func (x *CheckHealthResponse) GetStatus() string { } type GetAuthorizationURLRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Cli bool `protobuf:"varint,3,opt,name=cli,proto3" json:"cli,omitempty"` - Port int32 `protobuf:"varint,4,opt,name=port,proto3" json:"port,omitempty"` - Owner *string `protobuf:"bytes,5,opt,name=owner,proto3,oneof" json:"owner,omitempty"` - Context *Context `protobuf:"bytes,6,opt,name=context,proto3" json:"context,omitempty"` - RedirectUrl *string `protobuf:"bytes,7,opt,name=redirect_url,json=redirectUrl,proto3,oneof" json:"redirect_url,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + // cli is true if the request is being made from a CLI. + Cli bool `protobuf:"varint,3,opt,name=cli,proto3" json:"cli,omitempty"` + // owner is the owner (e.g GitHub org) that the provider is associated with. + // This is optional. + Owner *string `protobuf:"bytes,5,opt,name=owner,proto3,oneof" json:"owner,omitempty"` + Context *Context `protobuf:"bytes,6,opt,name=context,proto3" json:"context,omitempty"` + // redirect_url is the URL to redirect to after the authorization is complete. + RedirectUrl *string `protobuf:"bytes,7,opt,name=redirect_url,json=redirectUrl,proto3,oneof" json:"redirect_url,omitempty"` // config is a JSON object that can be used to pass additional configuration Config *structpb.Struct `protobuf:"bytes,8,opt,name=config,proto3" json:"config,omitempty"` ProviderClass string `protobuf:"bytes,9,opt,name=provider_class,json=providerClass,proto3" json:"provider_class,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetAuthorizationURLRequest) Reset() { *x = GetAuthorizationURLRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[20] + mi := &file_minder_v1_minder_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1908,7 +1781,7 @@ func (x *GetAuthorizationURLRequest) String() string { func (*GetAuthorizationURLRequest) ProtoMessage() {} func (x *GetAuthorizationURLRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[20] + mi := &file_minder_v1_minder_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1921,7 +1794,7 @@ func (x *GetAuthorizationURLRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAuthorizationURLRequest.ProtoReflect.Descriptor instead. func (*GetAuthorizationURLRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{20} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{19} } func (x *GetAuthorizationURLRequest) GetCli() bool { @@ -1931,13 +1804,6 @@ func (x *GetAuthorizationURLRequest) GetCli() bool { return false } -func (x *GetAuthorizationURLRequest) GetPort() int32 { - if x != nil { - return x.Port - } - return 0 -} - func (x *GetAuthorizationURLRequest) GetOwner() string { if x != nil && x.Owner != nil { return *x.Owner @@ -1974,17 +1840,16 @@ func (x *GetAuthorizationURLRequest) GetProviderClass() string { } type GetAuthorizationURLResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` unknownFields protoimpl.UnknownFields - - Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetAuthorizationURLResponse) Reset() { *x = GetAuthorizationURLResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[21] + mi := &file_minder_v1_minder_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1996,7 +1861,7 @@ func (x *GetAuthorizationURLResponse) String() string { func (*GetAuthorizationURLResponse) ProtoMessage() {} func (x *GetAuthorizationURLResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[21] + mi := &file_minder_v1_minder_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2009,7 +1874,7 @@ func (x *GetAuthorizationURLResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAuthorizationURLResponse.ProtoReflect.Descriptor instead. func (*GetAuthorizationURLResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{21} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{20} } func (x *GetAuthorizationURLResponse) GetUrl() string { @@ -2027,20 +1892,22 @@ func (x *GetAuthorizationURLResponse) GetState() string { } type StoreProviderTokenRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Deprecated: Marked as deprecated in minder/v1/minder.proto. - Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` - AccessToken string `protobuf:"bytes,3,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"` - Owner *string `protobuf:"bytes,4,opt,name=owner,proto3,oneof" json:"owner,omitempty"` - Context *Context `protobuf:"bytes,5,opt,name=context,proto3" json:"context,omitempty"` + Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` + // access_token is the token to store. + AccessToken string `protobuf:"bytes,3,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"` + // owner is the owner (e.g GitHub org) that the provider is associated with. + // This is optional. + Owner *string `protobuf:"bytes,4,opt,name=owner,proto3,oneof" json:"owner,omitempty"` + Context *Context `protobuf:"bytes,5,opt,name=context,proto3" json:"context,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StoreProviderTokenRequest) Reset() { *x = StoreProviderTokenRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[22] + mi := &file_minder_v1_minder_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2052,7 +1919,7 @@ func (x *StoreProviderTokenRequest) String() string { func (*StoreProviderTokenRequest) ProtoMessage() {} func (x *StoreProviderTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[22] + mi := &file_minder_v1_minder_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2065,7 +1932,7 @@ func (x *StoreProviderTokenRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StoreProviderTokenRequest.ProtoReflect.Descriptor instead. func (*StoreProviderTokenRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{22} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{21} } // Deprecated: Marked as deprecated in minder/v1/minder.proto. @@ -2098,14 +1965,14 @@ func (x *StoreProviderTokenRequest) GetContext() *Context { } type StoreProviderTokenResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StoreProviderTokenResponse) Reset() { *x = StoreProviderTokenResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[23] + mi := &file_minder_v1_minder_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2117,7 +1984,7 @@ func (x *StoreProviderTokenResponse) String() string { func (*StoreProviderTokenResponse) ProtoMessage() {} func (x *StoreProviderTokenResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[23] + mi := &file_minder_v1_minder_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2130,29 +1997,31 @@ func (x *StoreProviderTokenResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StoreProviderTokenResponse.ProtoReflect.Descriptor instead. func (*StoreProviderTokenResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{23} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{22} } -// Project API Objects +// Project API Objects. This is only used in responses. type Project struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + // description is a human-readable description of the project. + // This is optional. Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` CreatedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` // display_name allows for a human-readable name to be used. // display_names are short *non-unique* strings to provide // a user-friendly name for presentation in lists, etc. - DisplayName string `protobuf:"bytes,5,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // This is optional. + DisplayName string `protobuf:"bytes,5,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Project) Reset() { *x = Project{} - mi := &file_minder_v1_minder_proto_msgTypes[24] + mi := &file_minder_v1_minder_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2164,7 +2033,7 @@ func (x *Project) String() string { func (*Project) ProtoMessage() {} func (x *Project) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[24] + mi := &file_minder_v1_minder_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2177,7 +2046,7 @@ func (x *Project) ProtoReflect() protoreflect.Message { // Deprecated: Use Project.ProtoReflect.Descriptor instead. func (*Project) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{24} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{23} } func (x *Project) GetProjectId() string { @@ -2223,18 +2092,17 @@ func (x *Project) GetDisplayName() string { } type ListRemoteRepositoriesFromProviderRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Deprecated: Marked as deprecated in minder/v1/minder.proto. - Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` - Context *Context `protobuf:"bytes,3,opt,name=context,proto3" json:"context,omitempty"` + Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` + Context *Context `protobuf:"bytes,3,opt,name=context,proto3" json:"context,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListRemoteRepositoriesFromProviderRequest) Reset() { *x = ListRemoteRepositoriesFromProviderRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[25] + mi := &file_minder_v1_minder_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2246,7 +2114,7 @@ func (x *ListRemoteRepositoriesFromProviderRequest) String() string { func (*ListRemoteRepositoriesFromProviderRequest) ProtoMessage() {} func (x *ListRemoteRepositoriesFromProviderRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[25] + mi := &file_minder_v1_minder_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2259,7 +2127,7 @@ func (x *ListRemoteRepositoriesFromProviderRequest) ProtoReflect() protoreflect. // Deprecated: Use ListRemoteRepositoriesFromProviderRequest.ProtoReflect.Descriptor instead. func (*ListRemoteRepositoriesFromProviderRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{25} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{24} } // Deprecated: Marked as deprecated in minder/v1/minder.proto. @@ -2278,20 +2146,19 @@ func (x *ListRemoteRepositoriesFromProviderRequest) GetContext() *Context { } type ListRemoteRepositoriesFromProviderResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Results []*UpstreamRepositoryRef `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` // entities is the same list as the repositories, but it // uses the new UpstreamEntityRef message. This is what // we'll migrate to eventually. - Entities []*RegistrableUpstreamEntityRef `protobuf:"bytes,2,rep,name=entities,proto3" json:"entities,omitempty"` + Entities []*RegistrableUpstreamEntityRef `protobuf:"bytes,2,rep,name=entities,proto3" json:"entities,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListRemoteRepositoriesFromProviderResponse) Reset() { *x = ListRemoteRepositoriesFromProviderResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[26] + mi := &file_minder_v1_minder_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2303,7 +2170,7 @@ func (x *ListRemoteRepositoriesFromProviderResponse) String() string { func (*ListRemoteRepositoriesFromProviderResponse) ProtoMessage() {} func (x *ListRemoteRepositoriesFromProviderResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[26] + mi := &file_minder_v1_minder_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2316,7 +2183,7 @@ func (x *ListRemoteRepositoriesFromProviderResponse) ProtoReflect() protoreflect // Deprecated: Use ListRemoteRepositoriesFromProviderResponse.ProtoReflect.Descriptor instead. func (*ListRemoteRepositoriesFromProviderResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{26} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{25} } func (x *ListRemoteRepositoriesFromProviderResponse) GetResults() []*UpstreamRepositoryRef { @@ -2334,18 +2201,17 @@ func (x *ListRemoteRepositoriesFromProviderResponse) GetEntities() []*Registrabl } type RegistrableUpstreamEntityRef struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Entity *UpstreamEntityRef `protobuf:"bytes,1,opt,name=entity,proto3" json:"entity,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Entity *UpstreamEntityRef `protobuf:"bytes,1,opt,name=entity,proto3" json:"entity,omitempty"` // True if the entity is already registered in Minder. - Registered bool `protobuf:"varint,2,opt,name=registered,proto3" json:"registered,omitempty"` + Registered bool `protobuf:"varint,2,opt,name=registered,proto3" json:"registered,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *RegistrableUpstreamEntityRef) Reset() { *x = RegistrableUpstreamEntityRef{} - mi := &file_minder_v1_minder_proto_msgTypes[27] + mi := &file_minder_v1_minder_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2357,7 +2223,7 @@ func (x *RegistrableUpstreamEntityRef) String() string { func (*RegistrableUpstreamEntityRef) ProtoMessage() {} func (x *RegistrableUpstreamEntityRef) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[27] + mi := &file_minder_v1_minder_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2370,7 +2236,7 @@ func (x *RegistrableUpstreamEntityRef) ProtoReflect() protoreflect.Message { // Deprecated: Use RegistrableUpstreamEntityRef.ProtoReflect.Descriptor instead. func (*RegistrableUpstreamEntityRef) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{27} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{26} } func (x *RegistrableUpstreamEntityRef) GetEntity() *UpstreamEntityRef { @@ -2388,10 +2254,9 @@ func (x *RegistrableUpstreamEntityRef) GetRegistered() bool { } type UpstreamRepositoryRef struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` + // owner is the owner (e.g GitHub org) that the provider is associated with. + // This is optional. Owner string `protobuf:"bytes,1,opt,name=owner,proto3" json:"owner,omitempty"` Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // The upstream identity of the repository, as an integer. @@ -2400,12 +2265,14 @@ type UpstreamRepositoryRef struct { Context *Context `protobuf:"bytes,4,opt,name=context,proto3" json:"context,omitempty"` // True if the repository is already registered in Minder. // This is only set on output, and is ignored on input. - Registered bool `protobuf:"varint,5,opt,name=registered,proto3" json:"registered,omitempty"` + Registered bool `protobuf:"varint,5,opt,name=registered,proto3" json:"registered,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UpstreamRepositoryRef) Reset() { *x = UpstreamRepositoryRef{} - mi := &file_minder_v1_minder_proto_msgTypes[28] + mi := &file_minder_v1_minder_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2417,7 +2284,7 @@ func (x *UpstreamRepositoryRef) String() string { func (*UpstreamRepositoryRef) ProtoMessage() {} func (x *UpstreamRepositoryRef) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[28] + mi := &file_minder_v1_minder_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2430,7 +2297,7 @@ func (x *UpstreamRepositoryRef) ProtoReflect() protoreflect.Message { // Deprecated: Use UpstreamRepositoryRef.ProtoReflect.Descriptor instead. func (*UpstreamRepositoryRef) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{28} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{27} } func (x *UpstreamRepositoryRef) GetOwner() string { @@ -2468,12 +2335,13 @@ func (x *UpstreamRepositoryRef) GetRegistered() bool { return false } +// Repository API objects. This is only used in responses. type Repository struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id *string `protobuf:"bytes,1,opt,name=id,proto3,oneof" json:"id,omitempty"` // This is optional when returning remote repositories + state protoimpl.MessageState `protogen:"open.v1"` + // id is the unique identifier of the repository within Minder. + // It is always populated, but the optional keyword is used for + // backwards compatibility. + Id *string `protobuf:"bytes,1,opt,name=id,proto3,oneof" json:"id,omitempty"` Context *Context `protobuf:"bytes,2,opt,name=context,proto3,oneof" json:"context,omitempty"` Owner string `protobuf:"bytes,3,opt,name=owner,proto3" json:"owner,omitempty"` Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` @@ -2492,12 +2360,14 @@ type Repository struct { DefaultBranch string `protobuf:"bytes,18,opt,name=default_branch,json=defaultBranch,proto3" json:"default_branch,omitempty"` License string `protobuf:"bytes,19,opt,name=license,proto3" json:"license,omitempty"` // properties is a map of properties of the entity. - Properties *structpb.Struct `protobuf:"bytes,20,opt,name=properties,proto3" json:"properties,omitempty"` + Properties *structpb.Struct `protobuf:"bytes,20,opt,name=properties,proto3" json:"properties,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Repository) Reset() { *x = Repository{} - mi := &file_minder_v1_minder_proto_msgTypes[29] + mi := &file_minder_v1_minder_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2509,7 +2379,7 @@ func (x *Repository) String() string { func (*Repository) ProtoMessage() {} func (x *Repository) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[29] + mi := &file_minder_v1_minder_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2522,7 +2392,7 @@ func (x *Repository) ProtoReflect() protoreflect.Message { // Deprecated: Use Repository.ProtoReflect.Descriptor instead. func (*Repository) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{29} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{28} } func (x *Repository) GetId() string { @@ -2659,23 +2529,24 @@ func (x *Repository) GetProperties() *structpb.Struct { } type RegisterRepositoryRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Deprecated: Marked as deprecated in minder/v1/minder.proto. - Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` + Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` + // repository is the repository to register. This is optional if entity + // is set. Repository *UpstreamRepositoryRef `protobuf:"bytes,3,opt,name=repository,proto3" json:"repository,omitempty"` Context *Context `protobuf:"bytes,4,opt,name=context,proto3" json:"context,omitempty"` // entity is the entity to register. This is the same as the repository // field, but uses the new UpstreamEntityRef message. This is what we'll - // migrate to eventually. - Entity *UpstreamEntityRef `protobuf:"bytes,5,opt,name=entity,proto3" json:"entity,omitempty"` + // migrate to eventually. This is optional if repository is set. + Entity *UpstreamEntityRef `protobuf:"bytes,5,opt,name=entity,proto3" json:"entity,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *RegisterRepositoryRequest) Reset() { *x = RegisterRepositoryRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[30] + mi := &file_minder_v1_minder_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2687,7 +2558,7 @@ func (x *RegisterRepositoryRequest) String() string { func (*RegisterRepositoryRequest) ProtoMessage() {} func (x *RegisterRepositoryRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[30] + mi := &file_minder_v1_minder_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2700,7 +2571,7 @@ func (x *RegisterRepositoryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RegisterRepositoryRequest.ProtoReflect.Descriptor instead. func (*RegisterRepositoryRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{30} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{29} } // Deprecated: Marked as deprecated in minder/v1/minder.proto. @@ -2733,17 +2604,16 @@ func (x *RegisterRepositoryRequest) GetEntity() *UpstreamEntityRef { } type RegisterRepoResult struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Repository *Repository `protobuf:"bytes,1,opt,name=repository,proto3" json:"repository,omitempty"` + Status *RegisterRepoResult_Status `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` unknownFields protoimpl.UnknownFields - - Repository *Repository `protobuf:"bytes,1,opt,name=repository,proto3" json:"repository,omitempty"` - Status *RegisterRepoResult_Status `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + sizeCache protoimpl.SizeCache } func (x *RegisterRepoResult) Reset() { *x = RegisterRepoResult{} - mi := &file_minder_v1_minder_proto_msgTypes[31] + mi := &file_minder_v1_minder_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2755,7 +2625,7 @@ func (x *RegisterRepoResult) String() string { func (*RegisterRepoResult) ProtoMessage() {} func (x *RegisterRepoResult) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[31] + mi := &file_minder_v1_minder_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2768,7 +2638,7 @@ func (x *RegisterRepoResult) ProtoReflect() protoreflect.Message { // Deprecated: Use RegisterRepoResult.ProtoReflect.Descriptor instead. func (*RegisterRepoResult) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{31} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{30} } func (x *RegisterRepoResult) GetRepository() *Repository { @@ -2786,16 +2656,15 @@ func (x *RegisterRepoResult) GetStatus() *RegisterRepoResult_Status { } type RegisterRepositoryResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Result *RegisterRepoResult `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"` unknownFields protoimpl.UnknownFields - - Result *RegisterRepoResult `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"` + sizeCache protoimpl.SizeCache } func (x *RegisterRepositoryResponse) Reset() { *x = RegisterRepositoryResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[32] + mi := &file_minder_v1_minder_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2807,7 +2676,7 @@ func (x *RegisterRepositoryResponse) String() string { func (*RegisterRepositoryResponse) ProtoMessage() {} func (x *RegisterRepositoryResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[32] + mi := &file_minder_v1_minder_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2820,7 +2689,7 @@ func (x *RegisterRepositoryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RegisterRepositoryResponse.ProtoReflect.Descriptor instead. func (*RegisterRepositoryResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{32} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{31} } func (x *RegisterRepositoryResponse) GetResult() *RegisterRepoResult { @@ -2831,17 +2700,16 @@ func (x *RegisterRepositoryResponse) GetResult() *RegisterRepoResult { } type GetRepositoryByIdRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + RepositoryId string `protobuf:"bytes,1,opt,name=repository_id,json=repositoryId,proto3" json:"repository_id,omitempty"` + Context *Context `protobuf:"bytes,2,opt,name=context,proto3" json:"context,omitempty"` unknownFields protoimpl.UnknownFields - - RepositoryId string `protobuf:"bytes,1,opt,name=repository_id,json=repositoryId,proto3" json:"repository_id,omitempty"` - Context *Context `protobuf:"bytes,2,opt,name=context,proto3" json:"context,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetRepositoryByIdRequest) Reset() { *x = GetRepositoryByIdRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[33] + mi := &file_minder_v1_minder_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2853,7 +2721,7 @@ func (x *GetRepositoryByIdRequest) String() string { func (*GetRepositoryByIdRequest) ProtoMessage() {} func (x *GetRepositoryByIdRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[33] + mi := &file_minder_v1_minder_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2866,7 +2734,7 @@ func (x *GetRepositoryByIdRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRepositoryByIdRequest.ProtoReflect.Descriptor instead. func (*GetRepositoryByIdRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{33} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{32} } func (x *GetRepositoryByIdRequest) GetRepositoryId() string { @@ -2884,16 +2752,15 @@ func (x *GetRepositoryByIdRequest) GetContext() *Context { } type GetRepositoryByIdResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Repository *Repository `protobuf:"bytes,1,opt,name=repository,proto3" json:"repository,omitempty"` unknownFields protoimpl.UnknownFields - - Repository *Repository `protobuf:"bytes,1,opt,name=repository,proto3" json:"repository,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetRepositoryByIdResponse) Reset() { *x = GetRepositoryByIdResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[34] + mi := &file_minder_v1_minder_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2905,7 +2772,7 @@ func (x *GetRepositoryByIdResponse) String() string { func (*GetRepositoryByIdResponse) ProtoMessage() {} func (x *GetRepositoryByIdResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[34] + mi := &file_minder_v1_minder_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2918,7 +2785,7 @@ func (x *GetRepositoryByIdResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRepositoryByIdResponse.ProtoReflect.Descriptor instead. func (*GetRepositoryByIdResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{34} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{33} } func (x *GetRepositoryByIdResponse) GetRepository() *Repository { @@ -2929,17 +2796,16 @@ func (x *GetRepositoryByIdResponse) GetRepository() *Repository { } type DeleteRepositoryByIdRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + RepositoryId string `protobuf:"bytes,1,opt,name=repository_id,json=repositoryId,proto3" json:"repository_id,omitempty"` + Context *Context `protobuf:"bytes,2,opt,name=context,proto3" json:"context,omitempty"` unknownFields protoimpl.UnknownFields - - RepositoryId string `protobuf:"bytes,1,opt,name=repository_id,json=repositoryId,proto3" json:"repository_id,omitempty"` - Context *Context `protobuf:"bytes,2,opt,name=context,proto3" json:"context,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteRepositoryByIdRequest) Reset() { *x = DeleteRepositoryByIdRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[35] + mi := &file_minder_v1_minder_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2951,7 +2817,7 @@ func (x *DeleteRepositoryByIdRequest) String() string { func (*DeleteRepositoryByIdRequest) ProtoMessage() {} func (x *DeleteRepositoryByIdRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[35] + mi := &file_minder_v1_minder_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2964,7 +2830,7 @@ func (x *DeleteRepositoryByIdRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteRepositoryByIdRequest.ProtoReflect.Descriptor instead. func (*DeleteRepositoryByIdRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{35} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{34} } func (x *DeleteRepositoryByIdRequest) GetRepositoryId() string { @@ -2982,16 +2848,15 @@ func (x *DeleteRepositoryByIdRequest) GetContext() *Context { } type DeleteRepositoryByIdResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + RepositoryId string `protobuf:"bytes,1,opt,name=repository_id,json=repositoryId,proto3" json:"repository_id,omitempty"` unknownFields protoimpl.UnknownFields - - RepositoryId string `protobuf:"bytes,1,opt,name=repository_id,json=repositoryId,proto3" json:"repository_id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteRepositoryByIdResponse) Reset() { *x = DeleteRepositoryByIdResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[36] + mi := &file_minder_v1_minder_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3003,7 +2868,7 @@ func (x *DeleteRepositoryByIdResponse) String() string { func (*DeleteRepositoryByIdResponse) ProtoMessage() {} func (x *DeleteRepositoryByIdResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[36] + mi := &file_minder_v1_minder_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3016,7 +2881,7 @@ func (x *DeleteRepositoryByIdResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteRepositoryByIdResponse.ProtoReflect.Descriptor instead. func (*DeleteRepositoryByIdResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{36} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{35} } func (x *DeleteRepositoryByIdResponse) GetRepositoryId() string { @@ -3027,19 +2892,18 @@ func (x *DeleteRepositoryByIdResponse) GetRepositoryId() string { } type GetRepositoryByNameRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Deprecated: Marked as deprecated in minder/v1/minder.proto. - Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - Context *Context `protobuf:"bytes,4,opt,name=context,proto3" json:"context,omitempty"` + Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Context *Context `protobuf:"bytes,4,opt,name=context,proto3" json:"context,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetRepositoryByNameRequest) Reset() { *x = GetRepositoryByNameRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[37] + mi := &file_minder_v1_minder_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3051,7 +2915,7 @@ func (x *GetRepositoryByNameRequest) String() string { func (*GetRepositoryByNameRequest) ProtoMessage() {} func (x *GetRepositoryByNameRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[37] + mi := &file_minder_v1_minder_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3064,7 +2928,7 @@ func (x *GetRepositoryByNameRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRepositoryByNameRequest.ProtoReflect.Descriptor instead. func (*GetRepositoryByNameRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{37} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{36} } // Deprecated: Marked as deprecated in minder/v1/minder.proto. @@ -3090,16 +2954,15 @@ func (x *GetRepositoryByNameRequest) GetContext() *Context { } type GetRepositoryByNameResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Repository *Repository `protobuf:"bytes,1,opt,name=repository,proto3" json:"repository,omitempty"` unknownFields protoimpl.UnknownFields - - Repository *Repository `protobuf:"bytes,1,opt,name=repository,proto3" json:"repository,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetRepositoryByNameResponse) Reset() { *x = GetRepositoryByNameResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[38] + mi := &file_minder_v1_minder_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3111,7 +2974,7 @@ func (x *GetRepositoryByNameResponse) String() string { func (*GetRepositoryByNameResponse) ProtoMessage() {} func (x *GetRepositoryByNameResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[38] + mi := &file_minder_v1_minder_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3124,7 +2987,7 @@ func (x *GetRepositoryByNameResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRepositoryByNameResponse.ProtoReflect.Descriptor instead. func (*GetRepositoryByNameResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{38} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{37} } func (x *GetRepositoryByNameResponse) GetRepository() *Repository { @@ -3135,19 +2998,18 @@ func (x *GetRepositoryByNameResponse) GetRepository() *Repository { } type DeleteRepositoryByNameRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Deprecated: Marked as deprecated in minder/v1/minder.proto. - Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - Context *Context `protobuf:"bytes,4,opt,name=context,proto3" json:"context,omitempty"` + Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Context *Context `protobuf:"bytes,4,opt,name=context,proto3" json:"context,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteRepositoryByNameRequest) Reset() { *x = DeleteRepositoryByNameRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[39] + mi := &file_minder_v1_minder_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3159,7 +3021,7 @@ func (x *DeleteRepositoryByNameRequest) String() string { func (*DeleteRepositoryByNameRequest) ProtoMessage() {} func (x *DeleteRepositoryByNameRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[39] + mi := &file_minder_v1_minder_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3172,7 +3034,7 @@ func (x *DeleteRepositoryByNameRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteRepositoryByNameRequest.ProtoReflect.Descriptor instead. func (*DeleteRepositoryByNameRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{39} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{38} } // Deprecated: Marked as deprecated in minder/v1/minder.proto. @@ -3198,16 +3060,15 @@ func (x *DeleteRepositoryByNameRequest) GetContext() *Context { } type DeleteRepositoryByNameResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteRepositoryByNameResponse) Reset() { *x = DeleteRepositoryByNameResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[40] + mi := &file_minder_v1_minder_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3219,7 +3080,7 @@ func (x *DeleteRepositoryByNameResponse) String() string { func (*DeleteRepositoryByNameResponse) ProtoMessage() {} func (x *DeleteRepositoryByNameResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[40] + mi := &file_minder_v1_minder_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3232,7 +3093,7 @@ func (x *DeleteRepositoryByNameResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteRepositoryByNameResponse.ProtoReflect.Descriptor instead. func (*DeleteRepositoryByNameResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{40} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{39} } func (x *DeleteRepositoryByNameResponse) GetName() string { @@ -3243,20 +3104,23 @@ func (x *DeleteRepositoryByNameResponse) GetName() string { } type ListRepositoriesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Deprecated: Marked as deprecated in minder/v1/minder.proto. - Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` - Limit int64 `protobuf:"varint,3,opt,name=limit,proto3" json:"limit,omitempty"` - Context *Context `protobuf:"bytes,5,opt,name=context,proto3" json:"context,omitempty"` - Cursor string `protobuf:"bytes,6,opt,name=cursor,proto3" json:"cursor,omitempty"` + Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` + // limit is the maximum number of results to return. + // This is optional. + Limit int64 `protobuf:"varint,3,opt,name=limit,proto3" json:"limit,omitempty"` + Context *Context `protobuf:"bytes,5,opt,name=context,proto3" json:"context,omitempty"` + // cursor is the cursor to use for the next page of results. + // This is optional. + Cursor string `protobuf:"bytes,6,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListRepositoriesRequest) Reset() { *x = ListRepositoriesRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[41] + mi := &file_minder_v1_minder_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3268,7 +3132,7 @@ func (x *ListRepositoriesRequest) String() string { func (*ListRepositoriesRequest) ProtoMessage() {} func (x *ListRepositoriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[41] + mi := &file_minder_v1_minder_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3281,7 +3145,7 @@ func (x *ListRepositoriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRepositoriesRequest.ProtoReflect.Descriptor instead. func (*ListRepositoriesRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{41} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{40} } // Deprecated: Marked as deprecated in minder/v1/minder.proto. @@ -3314,18 +3178,17 @@ func (x *ListRepositoriesRequest) GetCursor() string { } type ListRepositoriesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Results []*Repository `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Results []*Repository `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` // cursor is the cursor to use for the next page of results, empty if at the end - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListRepositoriesResponse) Reset() { *x = ListRepositoriesResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[42] + mi := &file_minder_v1_minder_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3337,7 +3200,7 @@ func (x *ListRepositoriesResponse) String() string { func (*ListRepositoriesResponse) ProtoMessage() {} func (x *ListRepositoriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[42] + mi := &file_minder_v1_minder_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3350,7 +3213,7 @@ func (x *ListRepositoriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRepositoriesResponse.ProtoReflect.Descriptor instead. func (*ListRepositoriesResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{42} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{41} } func (x *ListRepositoriesResponse) GetResults() []*Repository { @@ -3368,17 +3231,17 @@ func (x *ListRepositoriesResponse) GetCursor() string { } type ReconcileEntityRegistrationRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + // entity is the entity type + Entity string `protobuf:"bytes,2,opt,name=entity,proto3" json:"entity,omitempty"` unknownFields protoimpl.UnknownFields - - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - Entity string `protobuf:"bytes,2,opt,name=entity,proto3" json:"entity,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ReconcileEntityRegistrationRequest) Reset() { *x = ReconcileEntityRegistrationRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[43] + mi := &file_minder_v1_minder_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3390,7 +3253,7 @@ func (x *ReconcileEntityRegistrationRequest) String() string { func (*ReconcileEntityRegistrationRequest) ProtoMessage() {} func (x *ReconcileEntityRegistrationRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[43] + mi := &file_minder_v1_minder_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3403,7 +3266,7 @@ func (x *ReconcileEntityRegistrationRequest) ProtoReflect() protoreflect.Message // Deprecated: Use ReconcileEntityRegistrationRequest.ProtoReflect.Descriptor instead. func (*ReconcileEntityRegistrationRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{43} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{42} } func (x *ReconcileEntityRegistrationRequest) GetContext() *Context { @@ -3421,14 +3284,14 @@ func (x *ReconcileEntityRegistrationRequest) GetEntity() string { } type ReconcileEntityRegistrationResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ReconcileEntityRegistrationResponse) Reset() { *x = ReconcileEntityRegistrationResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[44] + mi := &file_minder_v1_minder_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3440,7 +3303,7 @@ func (x *ReconcileEntityRegistrationResponse) String() string { func (*ReconcileEntityRegistrationResponse) ProtoMessage() {} func (x *ReconcileEntityRegistrationResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[44] + mi := &file_minder_v1_minder_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3453,23 +3316,22 @@ func (x *ReconcileEntityRegistrationResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use ReconcileEntityRegistrationResponse.ProtoReflect.Descriptor instead. func (*ReconcileEntityRegistrationResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{44} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{43} } type VerifyProviderTokenFromRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Deprecated: Marked as deprecated in minder/v1/minder.proto. - Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` - Timestamp *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Context *Context `protobuf:"bytes,4,opt,name=context,proto3" json:"context,omitempty"` + Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` + Timestamp *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Context *Context `protobuf:"bytes,4,opt,name=context,proto3" json:"context,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *VerifyProviderTokenFromRequest) Reset() { *x = VerifyProviderTokenFromRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[45] + mi := &file_minder_v1_minder_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3481,7 +3343,7 @@ func (x *VerifyProviderTokenFromRequest) String() string { func (*VerifyProviderTokenFromRequest) ProtoMessage() {} func (x *VerifyProviderTokenFromRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[45] + mi := &file_minder_v1_minder_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3494,7 +3356,7 @@ func (x *VerifyProviderTokenFromRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifyProviderTokenFromRequest.ProtoReflect.Descriptor instead. func (*VerifyProviderTokenFromRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{45} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{44} } // Deprecated: Marked as deprecated in minder/v1/minder.proto. @@ -3520,16 +3382,15 @@ func (x *VerifyProviderTokenFromRequest) GetContext() *Context { } type VerifyProviderTokenFromResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` unknownFields protoimpl.UnknownFields - - Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + sizeCache protoimpl.SizeCache } func (x *VerifyProviderTokenFromResponse) Reset() { *x = VerifyProviderTokenFromResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[46] + mi := &file_minder_v1_minder_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3541,7 +3402,7 @@ func (x *VerifyProviderTokenFromResponse) String() string { func (*VerifyProviderTokenFromResponse) ProtoMessage() {} func (x *VerifyProviderTokenFromResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[46] + mi := &file_minder_v1_minder_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3554,7 +3415,7 @@ func (x *VerifyProviderTokenFromResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifyProviderTokenFromResponse.ProtoReflect.Descriptor instead. func (*VerifyProviderTokenFromResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{46} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{45} } func (x *VerifyProviderTokenFromResponse) GetStatus() string { @@ -3566,18 +3427,17 @@ func (x *VerifyProviderTokenFromResponse) GetStatus() string { // VerifyProviderCredentialRequest contains the enrollment nonce (aka state) that was used when enrolling the provider type VerifyProviderCredentialRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` // enrollment_nonce is the state parameter returned when enrolling the provider EnrollmentNonce string `protobuf:"bytes,2,opt,name=enrollment_nonce,json=enrollmentNonce,proto3" json:"enrollment_nonce,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *VerifyProviderCredentialRequest) Reset() { *x = VerifyProviderCredentialRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[47] + mi := &file_minder_v1_minder_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3589,7 +3449,7 @@ func (x *VerifyProviderCredentialRequest) String() string { func (*VerifyProviderCredentialRequest) ProtoMessage() {} func (x *VerifyProviderCredentialRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[47] + mi := &file_minder_v1_minder_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3602,7 +3462,7 @@ func (x *VerifyProviderCredentialRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifyProviderCredentialRequest.ProtoReflect.Descriptor instead. func (*VerifyProviderCredentialRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{47} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{46} } func (x *VerifyProviderCredentialRequest) GetContext() *Context { @@ -3622,17 +3482,19 @@ func (x *VerifyProviderCredentialRequest) GetEnrollmentNonce() string { // VerifyProviderCredentialRequest responds with a boolean indicating if the provider has been created and the provider // name, if it has been created type VerifyProviderCredentialResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + // created is true if the provider was created. + Created bool `protobuf:"varint,1,opt,name=created,proto3" json:"created,omitempty"` + // provider_name is the name of the provider that was created. + // This is populated if creation was successful. + ProviderName string `protobuf:"bytes,2,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` unknownFields protoimpl.UnknownFields - - Created bool `protobuf:"varint,1,opt,name=created,proto3" json:"created,omitempty"` - ProviderName string `protobuf:"bytes,2,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` + sizeCache protoimpl.SizeCache } func (x *VerifyProviderCredentialResponse) Reset() { *x = VerifyProviderCredentialResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[48] + mi := &file_minder_v1_minder_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3644,7 +3506,7 @@ func (x *VerifyProviderCredentialResponse) String() string { func (*VerifyProviderCredentialResponse) ProtoMessage() {} func (x *VerifyProviderCredentialResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[48] + mi := &file_minder_v1_minder_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3657,7 +3519,7 @@ func (x *VerifyProviderCredentialResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifyProviderCredentialResponse.ProtoReflect.Descriptor instead. func (*VerifyProviderCredentialResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{48} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{47} } func (x *VerifyProviderCredentialResponse) GetCreated() bool { @@ -3674,69 +3536,16 @@ func (x *VerifyProviderCredentialResponse) GetProviderName() string { return "" } -type BranchProtection struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Branch string `protobuf:"bytes,1,opt,name=branch,proto3" json:"branch,omitempty"` - IsProtected bool `protobuf:"varint,2,opt,name=is_protected,json=isProtected,proto3" json:"is_protected,omitempty"` // Add other relevant fields -} - -func (x *BranchProtection) Reset() { - *x = BranchProtection{} - mi := &file_minder_v1_minder_proto_msgTypes[49] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *BranchProtection) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BranchProtection) ProtoMessage() {} - -func (x *BranchProtection) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[49] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BranchProtection.ProtoReflect.Descriptor instead. -func (*BranchProtection) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{49} -} - -func (x *BranchProtection) GetBranch() string { - if x != nil { - return x.Branch - } - return "" -} - -func (x *BranchProtection) GetIsProtected() bool { - if x != nil { - return x.IsProtected - } - return false -} - // User service type CreateUserRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CreateUserRequest) Reset() { *x = CreateUserRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[50] + mi := &file_minder_v1_minder_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3748,7 +3557,7 @@ func (x *CreateUserRequest) String() string { func (*CreateUserRequest) ProtoMessage() {} func (x *CreateUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[50] + mi := &file_minder_v1_minder_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3761,15 +3570,12 @@ func (x *CreateUserRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateUserRequest.ProtoReflect.Descriptor instead. func (*CreateUserRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{50} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{48} } type CreateUserResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` // Deprecated: Marked as deprecated in minder/v1/minder.proto. OrganizationId string `protobuf:"bytes,2,opt,name=organization_id,json=organizationId,proto3" json:"organization_id,omitempty"` // Deprecated: Marked as deprecated in minder/v1/minder.proto. @@ -3778,12 +3584,15 @@ type CreateUserResponse struct { ProjectName string `protobuf:"bytes,5,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` IdentitySubject string `protobuf:"bytes,6,opt,name=identity_subject,json=identitySubject,proto3" json:"identity_subject,omitempty"` CreatedAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - Context *Context `protobuf:"bytes,8,opt,name=context,proto3" json:"context,omitempty"` + // Deprecated: Marked as deprecated in minder/v1/minder.proto. + Context *Context `protobuf:"bytes,8,opt,name=context,proto3" json:"context,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CreateUserResponse) Reset() { *x = CreateUserResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[51] + mi := &file_minder_v1_minder_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3795,7 +3604,7 @@ func (x *CreateUserResponse) String() string { func (*CreateUserResponse) ProtoMessage() {} func (x *CreateUserResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[51] + mi := &file_minder_v1_minder_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3808,7 +3617,7 @@ func (x *CreateUserResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateUserResponse.ProtoReflect.Descriptor instead. func (*CreateUserResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{51} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{49} } func (x *CreateUserResponse) GetId() int32 { @@ -3862,6 +3671,7 @@ func (x *CreateUserResponse) GetCreatedAt() *timestamppb.Timestamp { return nil } +// Deprecated: Marked as deprecated in minder/v1/minder.proto. func (x *CreateUserResponse) GetContext() *Context { if x != nil { return x.Context @@ -3870,14 +3680,14 @@ func (x *CreateUserResponse) GetContext() *Context { } type DeleteUserRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteUserRequest) Reset() { *x = DeleteUserRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[52] + mi := &file_minder_v1_minder_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3889,7 +3699,7 @@ func (x *DeleteUserRequest) String() string { func (*DeleteUserRequest) ProtoMessage() {} func (x *DeleteUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[52] + mi := &file_minder_v1_minder_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3902,18 +3712,18 @@ func (x *DeleteUserRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteUserRequest.ProtoReflect.Descriptor instead. func (*DeleteUserRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{52} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{50} } type DeleteUserResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteUserResponse) Reset() { *x = DeleteUserResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[53] + mi := &file_minder_v1_minder_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3925,7 +3735,7 @@ func (x *DeleteUserResponse) String() string { func (*DeleteUserResponse) ProtoMessage() {} func (x *DeleteUserResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[53] + mi := &file_minder_v1_minder_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3938,24 +3748,23 @@ func (x *DeleteUserResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteUserResponse.ProtoReflect.Descriptor instead. func (*DeleteUserResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{53} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{51} } // user record to be returned type UserRecord struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` IdentitySubject string `protobuf:"bytes,3,opt,name=identity_subject,json=identitySubject,proto3" json:"identity_subject,omitempty"` CreatedAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UserRecord) Reset() { *x = UserRecord{} - mi := &file_minder_v1_minder_proto_msgTypes[54] + mi := &file_minder_v1_minder_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3967,7 +3776,7 @@ func (x *UserRecord) String() string { func (*UserRecord) ProtoMessage() {} func (x *UserRecord) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[54] + mi := &file_minder_v1_minder_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3980,7 +3789,7 @@ func (x *UserRecord) ProtoReflect() protoreflect.Message { // Deprecated: Use UserRecord.ProtoReflect.Descriptor instead. func (*UserRecord) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{54} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{52} } func (x *UserRecord) GetId() int32 { @@ -4013,17 +3822,16 @@ func (x *UserRecord) GetUpdatedAt() *timestamppb.Timestamp { // ProjectRole has the project along with the role the user has in the project type ProjectRole struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Role *Role `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` + Project *Project `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"` unknownFields protoimpl.UnknownFields - - Role *Role `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` - Project *Project `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ProjectRole) Reset() { *x = ProjectRole{} - mi := &file_minder_v1_minder_proto_msgTypes[55] + mi := &file_minder_v1_minder_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4035,7 +3843,7 @@ func (x *ProjectRole) String() string { func (*ProjectRole) ProtoMessage() {} func (x *ProjectRole) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[55] + mi := &file_minder_v1_minder_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4048,7 +3856,7 @@ func (x *ProjectRole) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectRole.ProtoReflect.Descriptor instead. func (*ProjectRole) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{55} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{53} } func (x *ProjectRole) GetRole() *Role { @@ -4067,14 +3875,14 @@ func (x *ProjectRole) GetProject() *Project { // get user type GetUserRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetUserRequest) Reset() { *x = GetUserRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[56] + mi := &file_minder_v1_minder_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4086,7 +3894,7 @@ func (x *GetUserRequest) String() string { func (*GetUserRequest) ProtoMessage() {} func (x *GetUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[56] + mi := &file_minder_v1_minder_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4099,25 +3907,24 @@ func (x *GetUserRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUserRequest.ProtoReflect.Descriptor instead. func (*GetUserRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{56} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{54} } type GetUserResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - User *UserRecord `protobuf:"bytes,1,opt,name=user,proto3,oneof" json:"user,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + User *UserRecord `protobuf:"bytes,1,opt,name=user,proto3,oneof" json:"user,omitempty"` // This will be deprecated in favor of the project_roles field // // Deprecated: Marked as deprecated in minder/v1/minder.proto. - Projects []*Project `protobuf:"bytes,2,rep,name=projects,proto3" json:"projects,omitempty"` - ProjectRoles []*ProjectRole `protobuf:"bytes,3,rep,name=project_roles,json=projectRoles,proto3" json:"project_roles,omitempty"` + Projects []*Project `protobuf:"bytes,2,rep,name=projects,proto3" json:"projects,omitempty"` + ProjectRoles []*ProjectRole `protobuf:"bytes,3,rep,name=project_roles,json=projectRoles,proto3" json:"project_roles,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetUserResponse) Reset() { *x = GetUserResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[57] + mi := &file_minder_v1_minder_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4129,7 +3936,7 @@ func (x *GetUserResponse) String() string { func (*GetUserResponse) ProtoMessage() {} func (x *GetUserResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[57] + mi := &file_minder_v1_minder_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4142,7 +3949,7 @@ func (x *GetUserResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUserResponse.ProtoReflect.Descriptor instead. func (*GetUserResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{57} + return file_minder_v1_minder_proto_rawDescGZIP(), []int{55} } func (x *GetUserResponse) GetUser() *UserRecord { @@ -4167,30 +3974,29 @@ func (x *GetUserResponse) GetProjectRoles() []*ProjectRole { return nil } -// Profile service -type CreateProfileRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// DataSource service +type CreateDataSourceRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + DataSource *DataSource `protobuf:"bytes,1,opt,name=data_source,json=dataSource,proto3" json:"data_source,omitempty"` unknownFields protoimpl.UnknownFields - - Profile *Profile `protobuf:"bytes,1,opt,name=profile,proto3" json:"profile,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *CreateProfileRequest) Reset() { - *x = CreateProfileRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[58] +func (x *CreateDataSourceRequest) Reset() { + *x = CreateDataSourceRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *CreateProfileRequest) String() string { +func (x *CreateDataSourceRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateProfileRequest) ProtoMessage() {} +func (*CreateDataSourceRequest) ProtoMessage() {} -func (x *CreateProfileRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[58] +func (x *CreateDataSourceRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4201,41 +4007,40 @@ func (x *CreateProfileRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateProfileRequest.ProtoReflect.Descriptor instead. -func (*CreateProfileRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{58} +// Deprecated: Use CreateDataSourceRequest.ProtoReflect.Descriptor instead. +func (*CreateDataSourceRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{56} } -func (x *CreateProfileRequest) GetProfile() *Profile { +func (x *CreateDataSourceRequest) GetDataSource() *DataSource { if x != nil { - return x.Profile + return x.DataSource } return nil } -type CreateProfileResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type CreateDataSourceResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + DataSource *DataSource `protobuf:"bytes,1,opt,name=data_source,json=dataSource,proto3" json:"data_source,omitempty"` unknownFields protoimpl.UnknownFields - - Profile *Profile `protobuf:"bytes,1,opt,name=profile,proto3" json:"profile,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *CreateProfileResponse) Reset() { - *x = CreateProfileResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[59] +func (x *CreateDataSourceResponse) Reset() { + *x = CreateDataSourceResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *CreateProfileResponse) String() string { +func (x *CreateDataSourceResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateProfileResponse) ProtoMessage() {} +func (*CreateDataSourceResponse) ProtoMessage() {} -func (x *CreateProfileResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[59] +func (x *CreateDataSourceResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4246,41 +4051,41 @@ func (x *CreateProfileResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateProfileResponse.ProtoReflect.Descriptor instead. -func (*CreateProfileResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{59} +// Deprecated: Use CreateDataSourceResponse.ProtoReflect.Descriptor instead. +func (*CreateDataSourceResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{57} } -func (x *CreateProfileResponse) GetProfile() *Profile { +func (x *CreateDataSourceResponse) GetDataSource() *DataSource { if x != nil { - return x.Profile + return x.DataSource } return nil } -type UpdateProfileRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type GetDataSourceByIdRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Context *ContextV2 `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields - - Profile *Profile `protobuf:"bytes,1,opt,name=profile,proto3" json:"profile,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *UpdateProfileRequest) Reset() { - *x = UpdateProfileRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[60] +func (x *GetDataSourceByIdRequest) Reset() { + *x = GetDataSourceByIdRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *UpdateProfileRequest) String() string { +func (x *GetDataSourceByIdRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateProfileRequest) ProtoMessage() {} +func (*GetDataSourceByIdRequest) ProtoMessage() {} -func (x *UpdateProfileRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[60] +func (x *GetDataSourceByIdRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4291,41 +4096,47 @@ func (x *UpdateProfileRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateProfileRequest.ProtoReflect.Descriptor instead. -func (*UpdateProfileRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{60} +// Deprecated: Use GetDataSourceByIdRequest.ProtoReflect.Descriptor instead. +func (*GetDataSourceByIdRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{58} } -func (x *UpdateProfileRequest) GetProfile() *Profile { +func (x *GetDataSourceByIdRequest) GetContext() *ContextV2 { if x != nil { - return x.Profile + return x.Context } return nil } -type UpdateProfileResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *GetDataSourceByIdRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} - Profile *Profile `protobuf:"bytes,1,opt,name=profile,proto3" json:"profile,omitempty"` +type GetDataSourceByIdResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + DataSource *DataSource `protobuf:"bytes,1,opt,name=data_source,json=dataSource,proto3" json:"data_source,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *UpdateProfileResponse) Reset() { - *x = UpdateProfileResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[61] +func (x *GetDataSourceByIdResponse) Reset() { + *x = GetDataSourceByIdResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *UpdateProfileResponse) String() string { +func (x *GetDataSourceByIdResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateProfileResponse) ProtoMessage() {} +func (*GetDataSourceByIdResponse) ProtoMessage() {} -func (x *UpdateProfileResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[61] +func (x *GetDataSourceByIdResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4336,52 +4147,42 @@ func (x *UpdateProfileResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateProfileResponse.ProtoReflect.Descriptor instead. -func (*UpdateProfileResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{61} +// Deprecated: Use GetDataSourceByIdResponse.ProtoReflect.Descriptor instead. +func (*GetDataSourceByIdResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{59} } -func (x *UpdateProfileResponse) GetProfile() *Profile { +func (x *GetDataSourceByIdResponse) GetDataSource() *DataSource { if x != nil { - return x.Profile + return x.DataSource } return nil } -type PatchProfileRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// GetDataSourceByNameRequest is the request message for the GetDataSourceByName RPC. +type GetDataSourceByNameRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Context *ContextV2 `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` unknownFields protoimpl.UnknownFields - - // The context in which the patch is applied. Provided explicitly - // so that the patch itself can be minimal and contain only - // the attribute to set, e.g. remediate=true - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // The id of the profile to patch. Same explanation about explicitness - // as for the context - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` - // The patch to apply to the profile - Patch *Profile `protobuf:"bytes,3,opt,name=patch,proto3" json:"patch,omitempty"` - // needed to enable PATCH, see https://grpc-ecosystem.github.io/grpc-gateway/docs/mapping/patch_feature/ - // is not exposed to the API user - UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *PatchProfileRequest) Reset() { - *x = PatchProfileRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[62] +func (x *GetDataSourceByNameRequest) Reset() { + *x = GetDataSourceByNameRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *PatchProfileRequest) String() string { +func (x *GetDataSourceByNameRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PatchProfileRequest) ProtoMessage() {} +func (*GetDataSourceByNameRequest) ProtoMessage() {} -func (x *PatchProfileRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[62] +func (x *GetDataSourceByNameRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4392,62 +4193,47 @@ func (x *PatchProfileRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PatchProfileRequest.ProtoReflect.Descriptor instead. -func (*PatchProfileRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{62} +// Deprecated: Use GetDataSourceByNameRequest.ProtoReflect.Descriptor instead. +func (*GetDataSourceByNameRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{60} } -func (x *PatchProfileRequest) GetContext() *Context { +func (x *GetDataSourceByNameRequest) GetContext() *ContextV2 { if x != nil { return x.Context } return nil } -func (x *PatchProfileRequest) GetId() string { +func (x *GetDataSourceByNameRequest) GetName() string { if x != nil { - return x.Id + return x.Name } return "" } -func (x *PatchProfileRequest) GetPatch() *Profile { - if x != nil { - return x.Patch - } - return nil -} - -func (x *PatchProfileRequest) GetUpdateMask() *fieldmaskpb.FieldMask { - if x != nil { - return x.UpdateMask - } - return nil -} - -type PatchProfileResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type GetDataSourceByNameResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + DataSource *DataSource `protobuf:"bytes,1,opt,name=data_source,json=dataSource,proto3" json:"data_source,omitempty"` unknownFields protoimpl.UnknownFields - - Profile *Profile `protobuf:"bytes,1,opt,name=profile,proto3" json:"profile,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *PatchProfileResponse) Reset() { - *x = PatchProfileResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[63] +func (x *GetDataSourceByNameResponse) Reset() { + *x = GetDataSourceByNameResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *PatchProfileResponse) String() string { +func (x *GetDataSourceByNameResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PatchProfileResponse) ProtoMessage() {} +func (*GetDataSourceByNameResponse) ProtoMessage() {} -func (x *PatchProfileResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[63] +func (x *GetDataSourceByNameResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4458,44 +4244,40 @@ func (x *PatchProfileResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PatchProfileResponse.ProtoReflect.Descriptor instead. -func (*PatchProfileResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{63} +// Deprecated: Use GetDataSourceByNameResponse.ProtoReflect.Descriptor instead. +func (*GetDataSourceByNameResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{61} } -func (x *PatchProfileResponse) GetProfile() *Profile { +func (x *GetDataSourceByNameResponse) GetDataSource() *DataSource { if x != nil { - return x.Profile + return x.DataSource } return nil } -type DeleteProfileRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type ListDataSourcesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Context *ContextV2 `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` unknownFields protoimpl.UnknownFields - - // context is the context in which the rule type is evaluated. - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // id is the id of the profile to delete - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *DeleteProfileRequest) Reset() { - *x = DeleteProfileRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[64] +func (x *ListDataSourcesRequest) Reset() { + *x = ListDataSourcesRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *DeleteProfileRequest) String() string { +func (x *ListDataSourcesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteProfileRequest) ProtoMessage() {} +func (*ListDataSourcesRequest) ProtoMessage() {} -func (x *DeleteProfileRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[64] +func (x *ListDataSourcesRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4506,46 +4288,40 @@ func (x *DeleteProfileRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteProfileRequest.ProtoReflect.Descriptor instead. -func (*DeleteProfileRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{64} +// Deprecated: Use ListDataSourcesRequest.ProtoReflect.Descriptor instead. +func (*ListDataSourcesRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{62} } -func (x *DeleteProfileRequest) GetContext() *Context { +func (x *ListDataSourcesRequest) GetContext() *ContextV2 { if x != nil { return x.Context } return nil } -func (x *DeleteProfileRequest) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -type DeleteProfileResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type ListDataSourcesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + DataSources []*DataSource `protobuf:"bytes,1,rep,name=data_sources,json=dataSources,proto3" json:"data_sources,omitempty"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *DeleteProfileResponse) Reset() { - *x = DeleteProfileResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[65] +func (x *ListDataSourcesResponse) Reset() { + *x = ListDataSourcesResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *DeleteProfileResponse) String() string { +func (x *ListDataSourcesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteProfileResponse) ProtoMessage() {} +func (*ListDataSourcesResponse) ProtoMessage() {} -func (x *DeleteProfileResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[65] +func (x *ListDataSourcesResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4556,42 +4332,40 @@ func (x *DeleteProfileResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteProfileResponse.ProtoReflect.Descriptor instead. -func (*DeleteProfileResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{65} +// Deprecated: Use ListDataSourcesResponse.ProtoReflect.Descriptor instead. +func (*ListDataSourcesResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{63} } -// list profiles -type ListProfilesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *ListDataSourcesResponse) GetDataSources() []*DataSource { + if x != nil { + return x.DataSources + } + return nil +} - // context is the context which contains the profiles - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // Filter profiles to only those matching the specified labels. - // - // The default is to return all user-created profiles; the string "*" can - // be used to select all profiles, including system profiles. This syntax - // may be expanded in the future. - LabelFilter string `protobuf:"bytes,2,opt,name=label_filter,json=labelFilter,proto3" json:"label_filter,omitempty"` +type UpdateDataSourceRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + DataSource *DataSource `protobuf:"bytes,1,opt,name=data_source,json=dataSource,proto3" json:"data_source,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *ListProfilesRequest) Reset() { - *x = ListProfilesRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[66] +func (x *UpdateDataSourceRequest) Reset() { + *x = UpdateDataSourceRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListProfilesRequest) String() string { +func (x *UpdateDataSourceRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListProfilesRequest) ProtoMessage() {} +func (*UpdateDataSourceRequest) ProtoMessage() {} -func (x *ListProfilesRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[66] +func (x *UpdateDataSourceRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4602,48 +4376,40 @@ func (x *ListProfilesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListProfilesRequest.ProtoReflect.Descriptor instead. -func (*ListProfilesRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{66} +// Deprecated: Use UpdateDataSourceRequest.ProtoReflect.Descriptor instead. +func (*UpdateDataSourceRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{64} } -func (x *ListProfilesRequest) GetContext() *Context { +func (x *UpdateDataSourceRequest) GetDataSource() *DataSource { if x != nil { - return x.Context + return x.DataSource } return nil } -func (x *ListProfilesRequest) GetLabelFilter() string { - if x != nil { - return x.LabelFilter - } - return "" -} - -type ListProfilesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type UpdateDataSourceResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + DataSource *DataSource `protobuf:"bytes,1,opt,name=data_source,json=dataSource,proto3" json:"data_source,omitempty"` unknownFields protoimpl.UnknownFields - - Profiles []*Profile `protobuf:"bytes,1,rep,name=profiles,proto3" json:"profiles,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *ListProfilesResponse) Reset() { - *x = ListProfilesResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[67] +func (x *UpdateDataSourceResponse) Reset() { + *x = UpdateDataSourceResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListProfilesResponse) String() string { +func (x *UpdateDataSourceResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListProfilesResponse) ProtoMessage() {} +func (*UpdateDataSourceResponse) ProtoMessage() {} -func (x *ListProfilesResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[67] +func (x *UpdateDataSourceResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4654,45 +4420,41 @@ func (x *ListProfilesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListProfilesResponse.ProtoReflect.Descriptor instead. -func (*ListProfilesResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{67} +// Deprecated: Use UpdateDataSourceResponse.ProtoReflect.Descriptor instead. +func (*UpdateDataSourceResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{65} } -func (x *ListProfilesResponse) GetProfiles() []*Profile { +func (x *UpdateDataSourceResponse) GetDataSource() *DataSource { if x != nil { - return x.Profiles + return x.DataSource } return nil } -// get profile by id -type GetProfileByIdRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type DeleteDataSourceByIdRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Context *ContextV2 `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields - - // context is the context which contains the profiles - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // id is the id of the profile to get - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *GetProfileByIdRequest) Reset() { - *x = GetProfileByIdRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[68] +func (x *DeleteDataSourceByIdRequest) Reset() { + *x = DeleteDataSourceByIdRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GetProfileByIdRequest) String() string { +func (x *DeleteDataSourceByIdRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetProfileByIdRequest) ProtoMessage() {} +func (*DeleteDataSourceByIdRequest) ProtoMessage() {} -func (x *GetProfileByIdRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[68] +func (x *DeleteDataSourceByIdRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4703,48 +4465,47 @@ func (x *GetProfileByIdRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetProfileByIdRequest.ProtoReflect.Descriptor instead. -func (*GetProfileByIdRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{68} +// Deprecated: Use DeleteDataSourceByIdRequest.ProtoReflect.Descriptor instead. +func (*DeleteDataSourceByIdRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{66} } -func (x *GetProfileByIdRequest) GetContext() *Context { +func (x *DeleteDataSourceByIdRequest) GetContext() *ContextV2 { if x != nil { return x.Context } return nil } -func (x *GetProfileByIdRequest) GetId() string { +func (x *DeleteDataSourceByIdRequest) GetId() string { if x != nil { return x.Id } return "" } -type GetProfileByIdResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type DeleteDataSourceByIdResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields - - Profile *Profile `protobuf:"bytes,1,opt,name=profile,proto3" json:"profile,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *GetProfileByIdResponse) Reset() { - *x = GetProfileByIdResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[69] +func (x *DeleteDataSourceByIdResponse) Reset() { + *x = DeleteDataSourceByIdResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GetProfileByIdResponse) String() string { +func (x *DeleteDataSourceByIdResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetProfileByIdResponse) ProtoMessage() {} +func (*DeleteDataSourceByIdResponse) ProtoMessage() {} -func (x *GetProfileByIdResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[69] +func (x *DeleteDataSourceByIdResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[67] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4755,45 +4516,41 @@ func (x *GetProfileByIdResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetProfileByIdResponse.ProtoReflect.Descriptor instead. -func (*GetProfileByIdResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{69} +// Deprecated: Use DeleteDataSourceByIdResponse.ProtoReflect.Descriptor instead. +func (*DeleteDataSourceByIdResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{67} } -func (x *GetProfileByIdResponse) GetProfile() *Profile { +func (x *DeleteDataSourceByIdResponse) GetId() string { if x != nil { - return x.Profile + return x.Id } - return nil + return "" } -// get profile by name -type GetProfileByNameRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type DeleteDataSourceByNameRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Context *ContextV2 `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` unknownFields protoimpl.UnknownFields - - // context is the context in which the rule type is evaluated. - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // name is the name of the profile to get - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *GetProfileByNameRequest) Reset() { - *x = GetProfileByNameRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[70] +func (x *DeleteDataSourceByNameRequest) Reset() { + *x = DeleteDataSourceByNameRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GetProfileByNameRequest) String() string { +func (x *DeleteDataSourceByNameRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetProfileByNameRequest) ProtoMessage() {} +func (*DeleteDataSourceByNameRequest) ProtoMessage() {} -func (x *GetProfileByNameRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[70] +func (x *DeleteDataSourceByNameRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[68] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4804,48 +4561,47 @@ func (x *GetProfileByNameRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetProfileByNameRequest.ProtoReflect.Descriptor instead. -func (*GetProfileByNameRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{70} +// Deprecated: Use DeleteDataSourceByNameRequest.ProtoReflect.Descriptor instead. +func (*DeleteDataSourceByNameRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{68} } -func (x *GetProfileByNameRequest) GetContext() *Context { +func (x *DeleteDataSourceByNameRequest) GetContext() *ContextV2 { if x != nil { return x.Context } return nil } -func (x *GetProfileByNameRequest) GetName() string { +func (x *DeleteDataSourceByNameRequest) GetName() string { if x != nil { return x.Name } return "" } -type GetProfileByNameResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type DeleteDataSourceByNameResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` unknownFields protoimpl.UnknownFields - - Profile *Profile `protobuf:"bytes,1,opt,name=profile,proto3" json:"profile,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *GetProfileByNameResponse) Reset() { - *x = GetProfileByNameResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[71] +func (x *DeleteDataSourceByNameResponse) Reset() { + *x = DeleteDataSourceByNameResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GetProfileByNameResponse) String() string { +func (x *DeleteDataSourceByNameResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetProfileByNameResponse) ProtoMessage() {} +func (*DeleteDataSourceByNameResponse) ProtoMessage() {} -func (x *GetProfileByNameResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[71] +func (x *DeleteDataSourceByNameResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[69] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4856,51 +4612,41 @@ func (x *GetProfileByNameResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetProfileByNameResponse.ProtoReflect.Descriptor instead. -func (*GetProfileByNameResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{71} +// Deprecated: Use DeleteDataSourceByNameResponse.ProtoReflect.Descriptor instead. +func (*DeleteDataSourceByNameResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{69} } -func (x *GetProfileByNameResponse) GetProfile() *Profile { +func (x *DeleteDataSourceByNameResponse) GetName() string { if x != nil { - return x.Profile + return x.Name } - return nil + return "" } -// get the overall profile status -type ProfileStatus struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// Profile service +type CreateProfileRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Profile *Profile `protobuf:"bytes,1,opt,name=profile,proto3" json:"profile,omitempty"` unknownFields protoimpl.UnknownFields - - // profile_id is the id of the profile - ProfileId string `protobuf:"bytes,1,opt,name=profile_id,json=profileId,proto3" json:"profile_id,omitempty"` - // profile_name is the name of the profile - ProfileName string `protobuf:"bytes,2,opt,name=profile_name,json=profileName,proto3" json:"profile_name,omitempty"` - // profile_status is the status of the profile - ProfileStatus string `protobuf:"bytes,3,opt,name=profile_status,json=profileStatus,proto3" json:"profile_status,omitempty"` - // last_updated is the last time the profile was updated - LastUpdated *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=last_updated,json=lastUpdated,proto3" json:"last_updated,omitempty"` - // profile_display_name is the display name of the profile - ProfileDisplayName string `protobuf:"bytes,5,opt,name=profile_display_name,json=profileDisplayName,proto3" json:"profile_display_name,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *ProfileStatus) Reset() { - *x = ProfileStatus{} - mi := &file_minder_v1_minder_proto_msgTypes[72] +func (x *CreateProfileRequest) Reset() { + *x = CreateProfileRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ProfileStatus) String() string { +func (x *CreateProfileRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ProfileStatus) ProtoMessage() {} +func (*CreateProfileRequest) ProtoMessage() {} -func (x *ProfileStatus) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[72] +func (x *CreateProfileRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[70] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4911,77 +4657,84 @@ func (x *ProfileStatus) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ProfileStatus.ProtoReflect.Descriptor instead. -func (*ProfileStatus) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{72} +// Deprecated: Use CreateProfileRequest.ProtoReflect.Descriptor instead. +func (*CreateProfileRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{70} } -func (x *ProfileStatus) GetProfileId() string { +func (x *CreateProfileRequest) GetProfile() *Profile { if x != nil { - return x.ProfileId + return x.Profile } - return "" + return nil } -func (x *ProfileStatus) GetProfileName() string { - if x != nil { - return x.ProfileName - } - return "" +type CreateProfileResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Profile *Profile `protobuf:"bytes,1,opt,name=profile,proto3" json:"profile,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *ProfileStatus) GetProfileStatus() string { - if x != nil { - return x.ProfileStatus - } - return "" +func (x *CreateProfileResponse) Reset() { + *x = CreateProfileResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[71] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *ProfileStatus) GetLastUpdated() *timestamppb.Timestamp { +func (x *CreateProfileResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateProfileResponse) ProtoMessage() {} + +func (x *CreateProfileResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[71] if x != nil { - return x.LastUpdated + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *ProfileStatus) GetProfileDisplayName() string { +// Deprecated: Use CreateProfileResponse.ProtoReflect.Descriptor instead. +func (*CreateProfileResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{71} +} + +func (x *CreateProfileResponse) GetProfile() *Profile { if x != nil { - return x.ProfileDisplayName + return x.Profile } - return "" + return nil } -// EvalResultAlert holds the alert details for a given rule evaluation -type EvalResultAlert struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type UpdateProfileRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Profile *Profile `protobuf:"bytes,1,opt,name=profile,proto3" json:"profile,omitempty"` unknownFields protoimpl.UnknownFields - - // status is the status of the alert - Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` - // last_updated is the last time the alert was performed or attempted - LastUpdated *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=last_updated,json=lastUpdated,proto3" json:"last_updated,omitempty"` - // details is the description of the alert attempt if any - Details string `protobuf:"bytes,3,opt,name=details,proto3" json:"details,omitempty"` - // url is the URL to the alert - Url string `protobuf:"bytes,4,opt,name=url,proto3" json:"url,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *EvalResultAlert) Reset() { - *x = EvalResultAlert{} - mi := &file_minder_v1_minder_proto_msgTypes[73] +func (x *UpdateProfileRequest) Reset() { + *x = UpdateProfileRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *EvalResultAlert) String() string { +func (x *UpdateProfileRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EvalResultAlert) ProtoMessage() {} +func (*UpdateProfileRequest) ProtoMessage() {} -func (x *EvalResultAlert) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[73] +func (x *UpdateProfileRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[72] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4992,103 +4745,94 @@ func (x *EvalResultAlert) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use EvalResultAlert.ProtoReflect.Descriptor instead. -func (*EvalResultAlert) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{73} +// Deprecated: Use UpdateProfileRequest.ProtoReflect.Descriptor instead. +func (*UpdateProfileRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{72} } -func (x *EvalResultAlert) GetStatus() string { +func (x *UpdateProfileRequest) GetProfile() *Profile { if x != nil { - return x.Status + return x.Profile } - return "" + return nil } -func (x *EvalResultAlert) GetLastUpdated() *timestamppb.Timestamp { - if x != nil { - return x.LastUpdated - } - return nil +type UpdateProfileResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Profile *Profile `protobuf:"bytes,1,opt,name=profile,proto3" json:"profile,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *EvalResultAlert) GetDetails() string { +func (x *UpdateProfileResponse) Reset() { + *x = UpdateProfileResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[73] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateProfileResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateProfileResponse) ProtoMessage() {} + +func (x *UpdateProfileResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[73] if x != nil { - return x.Details + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *EvalResultAlert) GetUrl() string { +// Deprecated: Use UpdateProfileResponse.ProtoReflect.Descriptor instead. +func (*UpdateProfileResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{73} +} + +func (x *UpdateProfileResponse) GetProfile() *Profile { if x != nil { - return x.Url + return x.Profile } - return "" + return nil } -// get the status of the rules for a given profile -type RuleEvaluationStatus struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type PatchProfileRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The context in which the patch is applied. Provided explicitly + // so that the patch itself can be minimal and contain only + // the attribute to set, e.g. remediate=true + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + // The id of the profile to patch. Same explanation about explicitness + // as for the context + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + // The patch to apply to the profile + Patch *Profile `protobuf:"bytes,3,opt,name=patch,proto3" json:"patch,omitempty"` + // needed to enable PATCH, see https://grpc-ecosystem.github.io/grpc-gateway/docs/mapping/patch_feature/ + // is not exposed to the API user + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` unknownFields protoimpl.UnknownFields - - // profile_id is the id of the profile - ProfileId string `protobuf:"bytes,1,opt,name=profile_id,json=profileId,proto3" json:"profile_id,omitempty"` - // rule_id is the id of the rule - RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` - // rule_name is the type of the rule. Deprecated in favor of rule_type_name - // - // Deprecated: Marked as deprecated in minder/v1/minder.proto. - RuleName string `protobuf:"bytes,3,opt,name=rule_name,json=ruleName,proto3" json:"rule_name,omitempty"` - // entity is the entity that was evaluated - Entity string `protobuf:"bytes,4,opt,name=entity,proto3" json:"entity,omitempty"` - // status is the status of the evaluation - Status string `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` - // last_updated is the last time the profile was updated - LastUpdated *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=last_updated,json=lastUpdated,proto3" json:"last_updated,omitempty"` - // entity_info is the information about the entity - EntityInfo map[string]string `protobuf:"bytes,7,rep,name=entity_info,json=entityInfo,proto3" json:"entity_info,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // details is the description of the evaluation if any - Details string `protobuf:"bytes,8,opt,name=details,proto3" json:"details,omitempty"` - // guidance is the guidance for the evaluation if any - Guidance string `protobuf:"bytes,9,opt,name=guidance,proto3" json:"guidance,omitempty"` - // remediation_status is the status of the remediation - RemediationStatus string `protobuf:"bytes,10,opt,name=remediation_status,json=remediationStatus,proto3" json:"remediation_status,omitempty"` - // remediation_last_updated is the last time the remediation was performed or attempted - RemediationLastUpdated *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=remediation_last_updated,json=remediationLastUpdated,proto3,oneof" json:"remediation_last_updated,omitempty"` - // remediation_details is the description of the remediation attempt if any - RemediationDetails string `protobuf:"bytes,12,opt,name=remediation_details,json=remediationDetails,proto3" json:"remediation_details,omitempty"` - // rule_type_name is the name of the rule - RuleTypeName string `protobuf:"bytes,13,opt,name=rule_type_name,json=ruleTypeName,proto3" json:"rule_type_name,omitempty"` - // rule_description_name is the name to describe the rule - RuleDescriptionName string `protobuf:"bytes,14,opt,name=rule_description_name,json=ruleDescriptionName,proto3" json:"rule_description_name,omitempty"` - // alert holds the alert details if the rule generated an alert in an external system - Alert *EvalResultAlert `protobuf:"bytes,15,opt,name=alert,proto3" json:"alert,omitempty"` - // severity is the severity of the rule - Severity *Severity `protobuf:"bytes,16,opt,name=severity,proto3" json:"severity,omitempty"` - // rule_evaluation_id is the id of the rule evaluation - RuleEvaluationId string `protobuf:"bytes,17,opt,name=rule_evaluation_id,json=ruleEvaluationId,proto3" json:"rule_evaluation_id,omitempty"` - // remediation_url is a url to get more data about a remediation, for PRs is the link to the PR - RemediationUrl string `protobuf:"bytes,18,opt,name=remediation_url,json=remediationUrl,proto3" json:"remediation_url,omitempty"` - // rule_display_name captures the display name of the rule - RuleDisplayName string `protobuf:"bytes,19,opt,name=rule_display_name,json=ruleDisplayName,proto3" json:"rule_display_name,omitempty"` - // release_phase is the phase of the release - ReleasePhase RuleTypeReleasePhase `protobuf:"varint,20,opt,name=release_phase,json=releasePhase,proto3,enum=minder.v1.RuleTypeReleasePhase" json:"release_phase,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *RuleEvaluationStatus) Reset() { - *x = RuleEvaluationStatus{} +func (x *PatchProfileRequest) Reset() { + *x = PatchProfileRequest{} mi := &file_minder_v1_minder_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RuleEvaluationStatus) String() string { +func (x *PatchProfileRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RuleEvaluationStatus) ProtoMessage() {} +func (*PatchProfileRequest) ProtoMessage() {} -func (x *RuleEvaluationStatus) ProtoReflect() protoreflect.Message { +func (x *PatchProfileRequest) ProtoReflect() protoreflect.Message { mi := &file_minder_v1_minder_proto_msgTypes[74] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -5100,180 +4844,158 @@ func (x *RuleEvaluationStatus) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RuleEvaluationStatus.ProtoReflect.Descriptor instead. -func (*RuleEvaluationStatus) Descriptor() ([]byte, []int) { +// Deprecated: Use PatchProfileRequest.ProtoReflect.Descriptor instead. +func (*PatchProfileRequest) Descriptor() ([]byte, []int) { return file_minder_v1_minder_proto_rawDescGZIP(), []int{74} } -func (x *RuleEvaluationStatus) GetProfileId() string { +func (x *PatchProfileRequest) GetContext() *Context { if x != nil { - return x.ProfileId + return x.Context } - return "" + return nil } -func (x *RuleEvaluationStatus) GetRuleId() string { +func (x *PatchProfileRequest) GetId() string { if x != nil { - return x.RuleId + return x.Id } return "" } -// Deprecated: Marked as deprecated in minder/v1/minder.proto. -func (x *RuleEvaluationStatus) GetRuleName() string { +func (x *PatchProfileRequest) GetPatch() *Profile { if x != nil { - return x.RuleName + return x.Patch } - return "" + return nil } -func (x *RuleEvaluationStatus) GetEntity() string { +func (x *PatchProfileRequest) GetUpdateMask() *fieldmaskpb.FieldMask { if x != nil { - return x.Entity + return x.UpdateMask } - return "" + return nil } -func (x *RuleEvaluationStatus) GetStatus() string { - if x != nil { - return x.Status - } - return "" +type PatchProfileResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Profile *Profile `protobuf:"bytes,1,opt,name=profile,proto3" json:"profile,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *RuleEvaluationStatus) GetLastUpdated() *timestamppb.Timestamp { - if x != nil { - return x.LastUpdated - } - return nil +func (x *PatchProfileResponse) Reset() { + *x = PatchProfileResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[75] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *RuleEvaluationStatus) GetEntityInfo() map[string]string { - if x != nil { - return x.EntityInfo - } - return nil +func (x *PatchProfileResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *RuleEvaluationStatus) GetDetails() string { - if x != nil { - return x.Details - } - return "" -} +func (*PatchProfileResponse) ProtoMessage() {} -func (x *RuleEvaluationStatus) GetGuidance() string { +func (x *PatchProfileResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[75] if x != nil { - return x.Guidance + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *RuleEvaluationStatus) GetRemediationStatus() string { - if x != nil { - return x.RemediationStatus - } - return "" +// Deprecated: Use PatchProfileResponse.ProtoReflect.Descriptor instead. +func (*PatchProfileResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{75} } -func (x *RuleEvaluationStatus) GetRemediationLastUpdated() *timestamppb.Timestamp { +func (x *PatchProfileResponse) GetProfile() *Profile { if x != nil { - return x.RemediationLastUpdated + return x.Profile } return nil } -func (x *RuleEvaluationStatus) GetRemediationDetails() string { - if x != nil { - return x.RemediationDetails - } - return "" +type DeleteProfileRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the rule type is evaluated. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + // id is the id of the profile to delete + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *RuleEvaluationStatus) GetRuleTypeName() string { - if x != nil { - return x.RuleTypeName - } - return "" +func (x *DeleteProfileRequest) Reset() { + *x = DeleteProfileRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[76] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *RuleEvaluationStatus) GetRuleDescriptionName() string { - if x != nil { - return x.RuleDescriptionName - } - return "" +func (x *DeleteProfileRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *RuleEvaluationStatus) GetAlert() *EvalResultAlert { - if x != nil { - return x.Alert - } - return nil -} +func (*DeleteProfileRequest) ProtoMessage() {} -func (x *RuleEvaluationStatus) GetSeverity() *Severity { +func (x *DeleteProfileRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[76] if x != nil { - return x.Severity + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *RuleEvaluationStatus) GetRuleEvaluationId() string { - if x != nil { - return x.RuleEvaluationId - } - return "" +// Deprecated: Use DeleteProfileRequest.ProtoReflect.Descriptor instead. +func (*DeleteProfileRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{76} } -func (x *RuleEvaluationStatus) GetRemediationUrl() string { +func (x *DeleteProfileRequest) GetContext() *Context { if x != nil { - return x.RemediationUrl + return x.Context } - return "" + return nil } -func (x *RuleEvaluationStatus) GetRuleDisplayName() string { +func (x *DeleteProfileRequest) GetId() string { if x != nil { - return x.RuleDisplayName + return x.Id } return "" } -func (x *RuleEvaluationStatus) GetReleasePhase() RuleTypeReleasePhase { - if x != nil { - return x.ReleasePhase - } - return RuleTypeReleasePhase_RULE_TYPE_RELEASE_PHASE_UNSPECIFIED -} - -// EntiryTypeId is a message that carries an ID together with a type to uniquely identify an entity -// such as (repo, 1), (artifact, 2), ... -type EntityTypedId struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type DeleteProfileResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields - - // entity is the entity to get status for. Incompatible with `all` - Type Entity `protobuf:"varint,1,opt,name=type,proto3,enum=minder.v1.Entity" json:"type,omitempty"` - // id is the ID of the entity to get status for. Incompatible with `all` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *EntityTypedId) Reset() { - *x = EntityTypedId{} - mi := &file_minder_v1_minder_proto_msgTypes[75] +func (x *DeleteProfileResponse) Reset() { + *x = DeleteProfileResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *EntityTypedId) String() string { +func (x *DeleteProfileResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EntityTypedId) ProtoMessage() {} +func (*DeleteProfileResponse) ProtoMessage() {} -func (x *EntityTypedId) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[75] +func (x *DeleteProfileResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[77] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5284,59 +5006,41 @@ func (x *EntityTypedId) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use EntityTypedId.ProtoReflect.Descriptor instead. -func (*EntityTypedId) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{75} -} - -func (x *EntityTypedId) GetType() Entity { - if x != nil { - return x.Type - } - return Entity_ENTITY_UNSPECIFIED -} - -func (x *EntityTypedId) GetId() string { - if x != nil { - return x.Id - } - return "" +// Deprecated: Use DeleteProfileResponse.ProtoReflect.Descriptor instead. +func (*DeleteProfileResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{77} } -type GetProfileStatusByNameRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // context is the context in which the rule type is evaluated. +// list profiles +type ListProfilesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context which contains the profiles Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // name is the name of the profile to get - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Entity *EntityTypedId `protobuf:"bytes,3,opt,name=entity,proto3" json:"entity,omitempty"` - All bool `protobuf:"varint,4,opt,name=all,proto3" json:"all,omitempty"` - // rule is the type of the rule. Deprecated in favor of rule_type + // Filter profiles to only those matching the specified labels. // - // Deprecated: Marked as deprecated in minder/v1/minder.proto. - Rule string `protobuf:"bytes,5,opt,name=rule,proto3" json:"rule,omitempty"` - RuleType string `protobuf:"bytes,6,opt,name=rule_type,json=ruleType,proto3" json:"rule_type,omitempty"` - RuleName string `protobuf:"bytes,7,opt,name=rule_name,json=ruleName,proto3" json:"rule_name,omitempty"` + // The default is to return all user-created profiles; the string "*" can + // be used to select all profiles, including system profiles. This syntax + // may be expanded in the future. + LabelFilter string `protobuf:"bytes,2,opt,name=label_filter,json=labelFilter,proto3" json:"label_filter,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *GetProfileStatusByNameRequest) Reset() { - *x = GetProfileStatusByNameRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[76] +func (x *ListProfilesRequest) Reset() { + *x = ListProfilesRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GetProfileStatusByNameRequest) String() string { +func (x *ListProfilesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetProfileStatusByNameRequest) ProtoMessage() {} +func (*ListProfilesRequest) ProtoMessage() {} -func (x *GetProfileStatusByNameRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[76] +func (x *ListProfilesRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[78] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5347,87 +5051,95 @@ func (x *GetProfileStatusByNameRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetProfileStatusByNameRequest.ProtoReflect.Descriptor instead. -func (*GetProfileStatusByNameRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{76} +// Deprecated: Use ListProfilesRequest.ProtoReflect.Descriptor instead. +func (*ListProfilesRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{78} } -func (x *GetProfileStatusByNameRequest) GetContext() *Context { +func (x *ListProfilesRequest) GetContext() *Context { if x != nil { return x.Context } return nil } -func (x *GetProfileStatusByNameRequest) GetName() string { +func (x *ListProfilesRequest) GetLabelFilter() string { if x != nil { - return x.Name + return x.LabelFilter } return "" } -func (x *GetProfileStatusByNameRequest) GetEntity() *EntityTypedId { - if x != nil { - return x.Entity - } - return nil +type ListProfilesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Profiles []*Profile `protobuf:"bytes,1,rep,name=profiles,proto3" json:"profiles,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *GetProfileStatusByNameRequest) GetAll() bool { - if x != nil { - return x.All - } - return false +func (x *ListProfilesResponse) Reset() { + *x = ListProfilesResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[79] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -// Deprecated: Marked as deprecated in minder/v1/minder.proto. -func (x *GetProfileStatusByNameRequest) GetRule() string { - if x != nil { - return x.Rule - } - return "" +func (x *ListProfilesResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *GetProfileStatusByNameRequest) GetRuleType() string { +func (*ListProfilesResponse) ProtoMessage() {} + +func (x *ListProfilesResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[79] if x != nil { - return x.RuleType + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *GetProfileStatusByNameRequest) GetRuleName() string { +// Deprecated: Use ListProfilesResponse.ProtoReflect.Descriptor instead. +func (*ListProfilesResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{79} +} + +func (x *ListProfilesResponse) GetProfiles() []*Profile { if x != nil { - return x.RuleName + return x.Profiles } - return "" + return nil } -type GetProfileStatusByNameResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// get profile by id +type GetProfileByIdRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context which contains the profiles + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + // id is the id of the profile to get + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields - - // profile_status is the status of the profile - ProfileStatus *ProfileStatus `protobuf:"bytes,1,opt,name=profile_status,json=profileStatus,proto3" json:"profile_status,omitempty"` - // rule_evaluation_status is the status of the rules - RuleEvaluationStatus []*RuleEvaluationStatus `protobuf:"bytes,2,rep,name=rule_evaluation_status,json=ruleEvaluationStatus,proto3" json:"rule_evaluation_status,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *GetProfileStatusByNameResponse) Reset() { - *x = GetProfileStatusByNameResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[77] +func (x *GetProfileByIdRequest) Reset() { + *x = GetProfileByIdRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GetProfileStatusByNameResponse) String() string { +func (x *GetProfileByIdRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetProfileStatusByNameResponse) ProtoMessage() {} +func (*GetProfileByIdRequest) ProtoMessage() {} -func (x *GetProfileStatusByNameResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[77] +func (x *GetProfileByIdRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[80] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5438,49 +5150,47 @@ func (x *GetProfileStatusByNameResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetProfileStatusByNameResponse.ProtoReflect.Descriptor instead. -func (*GetProfileStatusByNameResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{77} +// Deprecated: Use GetProfileByIdRequest.ProtoReflect.Descriptor instead. +func (*GetProfileByIdRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{80} } -func (x *GetProfileStatusByNameResponse) GetProfileStatus() *ProfileStatus { +func (x *GetProfileByIdRequest) GetContext() *Context { if x != nil { - return x.ProfileStatus + return x.Context } return nil } -func (x *GetProfileStatusByNameResponse) GetRuleEvaluationStatus() []*RuleEvaluationStatus { +func (x *GetProfileByIdRequest) GetId() string { if x != nil { - return x.RuleEvaluationStatus + return x.Id } - return nil + return "" } -type GetProfileStatusByProjectRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type GetProfileByIdResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Profile *Profile `protobuf:"bytes,1,opt,name=profile,proto3" json:"profile,omitempty"` unknownFields protoimpl.UnknownFields - - // context is the context in which the rule type is evaluated. - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *GetProfileStatusByProjectRequest) Reset() { - *x = GetProfileStatusByProjectRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[78] +func (x *GetProfileByIdResponse) Reset() { + *x = GetProfileByIdResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GetProfileStatusByProjectRequest) String() string { +func (x *GetProfileByIdResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetProfileStatusByProjectRequest) ProtoMessage() {} +func (*GetProfileByIdResponse) ProtoMessage() {} -func (x *GetProfileStatusByProjectRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[78] +func (x *GetProfileByIdResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[81] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5491,42 +5201,44 @@ func (x *GetProfileStatusByProjectRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetProfileStatusByProjectRequest.ProtoReflect.Descriptor instead. -func (*GetProfileStatusByProjectRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{78} +// Deprecated: Use GetProfileByIdResponse.ProtoReflect.Descriptor instead. +func (*GetProfileByIdResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{81} } -func (x *GetProfileStatusByProjectRequest) GetContext() *Context { +func (x *GetProfileByIdResponse) GetProfile() *Profile { if x != nil { - return x.Context + return x.Profile } return nil } -type GetProfileStatusByProjectResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// get profile by name +type GetProfileByNameRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the rule type is evaluated. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + // name is the name of the profile to get + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` unknownFields protoimpl.UnknownFields - - // profile_status is the status of the profile - ProfileStatus []*ProfileStatus `protobuf:"bytes,1,rep,name=profile_status,json=profileStatus,proto3" json:"profile_status,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *GetProfileStatusByProjectResponse) Reset() { - *x = GetProfileStatusByProjectResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[79] +func (x *GetProfileByNameRequest) Reset() { + *x = GetProfileByNameRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GetProfileStatusByProjectResponse) String() string { +func (x *GetProfileByNameRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetProfileStatusByProjectResponse) ProtoMessage() {} +func (*GetProfileByNameRequest) ProtoMessage() {} -func (x *GetProfileStatusByProjectResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[79] +func (x *GetProfileByNameRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[82] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5537,41 +5249,47 @@ func (x *GetProfileStatusByProjectResponse) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use GetProfileStatusByProjectResponse.ProtoReflect.Descriptor instead. -func (*GetProfileStatusByProjectResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{79} +// Deprecated: Use GetProfileByNameRequest.ProtoReflect.Descriptor instead. +func (*GetProfileByNameRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{82} } -func (x *GetProfileStatusByProjectResponse) GetProfileStatus() []*ProfileStatus { +func (x *GetProfileByNameRequest) GetContext() *Context { if x != nil { - return x.ProfileStatus + return x.Context } return nil } -type EntityAutoRegistrationConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *GetProfileByNameRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} - Enabled *bool `protobuf:"varint,1,opt,name=enabled,proto3,oneof" json:"enabled,omitempty"` +type GetProfileByNameResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Profile *Profile `protobuf:"bytes,1,opt,name=profile,proto3" json:"profile,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *EntityAutoRegistrationConfig) Reset() { - *x = EntityAutoRegistrationConfig{} - mi := &file_minder_v1_minder_proto_msgTypes[80] +func (x *GetProfileByNameResponse) Reset() { + *x = GetProfileByNameResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *EntityAutoRegistrationConfig) String() string { +func (x *GetProfileByNameResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EntityAutoRegistrationConfig) ProtoMessage() {} +func (*GetProfileByNameResponse) ProtoMessage() {} -func (x *EntityAutoRegistrationConfig) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[80] +func (x *GetProfileByNameResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[83] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5582,45 +5300,50 @@ func (x *EntityAutoRegistrationConfig) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use EntityAutoRegistrationConfig.ProtoReflect.Descriptor instead. -func (*EntityAutoRegistrationConfig) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{80} +// Deprecated: Use GetProfileByNameResponse.ProtoReflect.Descriptor instead. +func (*GetProfileByNameResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{83} } -func (x *EntityAutoRegistrationConfig) GetEnabled() bool { - if x != nil && x.Enabled != nil { - return *x.Enabled +func (x *GetProfileByNameResponse) GetProfile() *Profile { + if x != nil { + return x.Profile } - return false + return nil } -// AutoRegistration is the configuration for auto-registering entities. -// When nothing is set, it means that auto-registration is disabled. There is no difference between disabled -// and undefined so for the "let's not auto-register anything" case we'd just let the repeated string empty -type AutoRegistration struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // enabled is the list of entities that are enabled for auto-registration. - Entities map[string]*EntityAutoRegistrationConfig `protobuf:"bytes,1,rep,name=entities,proto3" json:"entities,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +// get the overall profile status as output +type ProfileStatus struct { + state protoimpl.MessageState `protogen:"open.v1"` + // profile_id is the id of the profile. One of profile_id or profile_name must be set. + ProfileId string `protobuf:"bytes,1,opt,name=profile_id,json=profileId,proto3" json:"profile_id,omitempty"` + // profile_name is the name of the profile. One of profile_id or profile_name must be set. + ProfileName string `protobuf:"bytes,2,opt,name=profile_name,json=profileName,proto3" json:"profile_name,omitempty"` + // profile_status is the status of the profile + ProfileStatus string `protobuf:"bytes,3,opt,name=profile_status,json=profileStatus,proto3" json:"profile_status,omitempty"` + // last_updated is the last time the profile was updated + LastUpdated *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=last_updated,json=lastUpdated,proto3" json:"last_updated,omitempty"` + // profile_display_name is the display name of the profile + ProfileDisplayName string `protobuf:"bytes,5,opt,name=profile_display_name,json=profileDisplayName,proto3" json:"profile_display_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *AutoRegistration) Reset() { - *x = AutoRegistration{} - mi := &file_minder_v1_minder_proto_msgTypes[81] +func (x *ProfileStatus) Reset() { + *x = ProfileStatus{} + mi := &file_minder_v1_minder_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *AutoRegistration) String() string { +func (x *ProfileStatus) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AutoRegistration) ProtoMessage() {} +func (*ProfileStatus) ProtoMessage() {} -func (x *AutoRegistration) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[81] +func (x *ProfileStatus) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[84] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5631,90 +5354,76 @@ func (x *AutoRegistration) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AutoRegistration.ProtoReflect.Descriptor instead. -func (*AutoRegistration) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{81} +// Deprecated: Use ProfileStatus.ProtoReflect.Descriptor instead. +func (*ProfileStatus) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{84} } -func (x *AutoRegistration) GetEntities() map[string]*EntityAutoRegistrationConfig { +func (x *ProfileStatus) GetProfileId() string { if x != nil { - return x.Entities + return x.ProfileId } - return nil -} - -// ProviderConfig contains the generic configuration for a provider. -type ProviderConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // auto_registration is the configuration for auto-registering entities. - AutoRegistration *AutoRegistration `protobuf:"bytes,1,opt,name=auto_registration,json=autoRegistration,proto3,oneof" json:"auto_registration,omitempty"` -} - -func (x *ProviderConfig) Reset() { - *x = ProviderConfig{} - mi := &file_minder_v1_minder_proto_msgTypes[82] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + return "" } -func (x *ProviderConfig) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *ProfileStatus) GetProfileName() string { + if x != nil { + return x.ProfileName + } + return "" } -func (*ProviderConfig) ProtoMessage() {} - -func (x *ProviderConfig) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[82] +func (x *ProfileStatus) GetProfileStatus() string { if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms + return x.ProfileStatus } - return mi.MessageOf(x) + return "" } -// Deprecated: Use ProviderConfig.ProtoReflect.Descriptor instead. -func (*ProviderConfig) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{82} +func (x *ProfileStatus) GetLastUpdated() *timestamppb.Timestamp { + if x != nil { + return x.LastUpdated + } + return nil } -func (x *ProviderConfig) GetAutoRegistration() *AutoRegistration { +func (x *ProfileStatus) GetProfileDisplayName() string { if x != nil { - return x.AutoRegistration + return x.ProfileDisplayName } - return nil + return "" } -// RESTProviderConfig contains the configuration for the REST provider. -type RESTProviderConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// EvalResultAlert holds the alert details for a given rule evaluation +type EvalResultAlert struct { + state protoimpl.MessageState `protogen:"open.v1"` + // status is the status of the alert + Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + // last_updated is the last time the alert was performed or attempted + LastUpdated *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=last_updated,json=lastUpdated,proto3" json:"last_updated,omitempty"` + // details is the description of the alert attempt if any + Details string `protobuf:"bytes,3,opt,name=details,proto3" json:"details,omitempty"` + // url is the URL to the alert + Url string `protobuf:"bytes,4,opt,name=url,proto3" json:"url,omitempty"` unknownFields protoimpl.UnknownFields - - // base_url is the base URL for the REST provider. - BaseUrl *string `protobuf:"bytes,1,opt,name=base_url,json=baseUrl,proto3,oneof" json:"base_url,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *RESTProviderConfig) Reset() { - *x = RESTProviderConfig{} - mi := &file_minder_v1_minder_proto_msgTypes[83] +func (x *EvalResultAlert) Reset() { + *x = EvalResultAlert{} + mi := &file_minder_v1_minder_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RESTProviderConfig) String() string { +func (x *EvalResultAlert) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RESTProviderConfig) ProtoMessage() {} +func (*EvalResultAlert) ProtoMessage() {} -func (x *RESTProviderConfig) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[83] +func (x *EvalResultAlert) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[85] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5725,49 +5434,1241 @@ func (x *RESTProviderConfig) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RESTProviderConfig.ProtoReflect.Descriptor instead. -func (*RESTProviderConfig) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{83} +// Deprecated: Use EvalResultAlert.ProtoReflect.Descriptor instead. +func (*EvalResultAlert) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{85} } -func (x *RESTProviderConfig) GetBaseUrl() string { - if x != nil && x.BaseUrl != nil { - return *x.BaseUrl +func (x *EvalResultAlert) GetStatus() string { + if x != nil { + return x.Status } return "" } -// GitHubProviderConfig contains the configuration for the GitHub client -// -// Endpoint: is the GitHub API endpoint -// -// If using the public GitHub API, Endpoint can be left blank -// disable revive linting for this struct as there is nothing wrong with the -// naming convention -type GitHubProviderConfig struct { - state protoimpl.MessageState +func (x *EvalResultAlert) GetLastUpdated() *timestamppb.Timestamp { + if x != nil { + return x.LastUpdated + } + return nil +} + +func (x *EvalResultAlert) GetDetails() string { + if x != nil { + return x.Details + } + return "" +} + +func (x *EvalResultAlert) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +// get the status of the rules for a given profile +type RuleEvaluationStatus struct { + state protoimpl.MessageState `protogen:"open.v1"` + // profile_id is the id of the profile + ProfileId string `protobuf:"bytes,1,opt,name=profile_id,json=profileId,proto3" json:"profile_id,omitempty"` + // rule_id is the id of the rule + RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + // rule_name is the type of the rule. Deprecated in favor of rule_type_name + // + // Deprecated: Marked as deprecated in minder/v1/minder.proto. + RuleName string `protobuf:"bytes,3,opt,name=rule_name,json=ruleName,proto3" json:"rule_name,omitempty"` + // entity is the entity that was evaluated + Entity string `protobuf:"bytes,4,opt,name=entity,proto3" json:"entity,omitempty"` + // status is the status of the evaluation + Status string `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` + // last_updated is the last time the profile was updated + LastUpdated *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=last_updated,json=lastUpdated,proto3" json:"last_updated,omitempty"` + // entity_info is the information about the entity + EntityInfo map[string]string `protobuf:"bytes,7,rep,name=entity_info,json=entityInfo,proto3" json:"entity_info,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // details is the description of the evaluation if any + Details string `protobuf:"bytes,8,opt,name=details,proto3" json:"details,omitempty"` + // guidance is the guidance for the evaluation if any + Guidance string `protobuf:"bytes,9,opt,name=guidance,proto3" json:"guidance,omitempty"` + // remediation_status is the status of the remediation + RemediationStatus string `protobuf:"bytes,10,opt,name=remediation_status,json=remediationStatus,proto3" json:"remediation_status,omitempty"` + // remediation_last_updated is the last time the remediation was performed or attempted + RemediationLastUpdated *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=remediation_last_updated,json=remediationLastUpdated,proto3,oneof" json:"remediation_last_updated,omitempty"` + // remediation_details is the description of the remediation attempt if any + RemediationDetails string `protobuf:"bytes,12,opt,name=remediation_details,json=remediationDetails,proto3" json:"remediation_details,omitempty"` + // rule_type_name is the name of the rule + RuleTypeName string `protobuf:"bytes,13,opt,name=rule_type_name,json=ruleTypeName,proto3" json:"rule_type_name,omitempty"` + // rule_description_name is the name to describe the rule + RuleDescriptionName string `protobuf:"bytes,14,opt,name=rule_description_name,json=ruleDescriptionName,proto3" json:"rule_description_name,omitempty"` + // alert holds the alert details if the rule generated an alert in an external system + Alert *EvalResultAlert `protobuf:"bytes,15,opt,name=alert,proto3" json:"alert,omitempty"` + // severity is the severity of the rule. This may be empty. + Severity *Severity `protobuf:"bytes,16,opt,name=severity,proto3" json:"severity,omitempty"` + // rule_evaluation_id is the id of the rule evaluation + RuleEvaluationId string `protobuf:"bytes,17,opt,name=rule_evaluation_id,json=ruleEvaluationId,proto3" json:"rule_evaluation_id,omitempty"` + // remediation_url is a url to get more data about a remediation, for PRs is the link to the PR + RemediationUrl string `protobuf:"bytes,18,opt,name=remediation_url,json=remediationUrl,proto3" json:"remediation_url,omitempty"` + // rule_display_name captures the display name of the rule + RuleDisplayName string `protobuf:"bytes,19,opt,name=rule_display_name,json=ruleDisplayName,proto3" json:"rule_display_name,omitempty"` + // release_phase is the phase of the release + ReleasePhase RuleTypeReleasePhase `protobuf:"varint,20,opt,name=release_phase,json=releasePhase,proto3,enum=minder.v1.RuleTypeReleasePhase" json:"release_phase,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RuleEvaluationStatus) Reset() { + *x = RuleEvaluationStatus{} + mi := &file_minder_v1_minder_proto_msgTypes[86] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RuleEvaluationStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RuleEvaluationStatus) ProtoMessage() {} + +func (x *RuleEvaluationStatus) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[86] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RuleEvaluationStatus.ProtoReflect.Descriptor instead. +func (*RuleEvaluationStatus) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{86} +} + +func (x *RuleEvaluationStatus) GetProfileId() string { + if x != nil { + return x.ProfileId + } + return "" +} + +func (x *RuleEvaluationStatus) GetRuleId() string { + if x != nil { + return x.RuleId + } + return "" +} + +// Deprecated: Marked as deprecated in minder/v1/minder.proto. +func (x *RuleEvaluationStatus) GetRuleName() string { + if x != nil { + return x.RuleName + } + return "" +} + +func (x *RuleEvaluationStatus) GetEntity() string { + if x != nil { + return x.Entity + } + return "" +} + +func (x *RuleEvaluationStatus) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *RuleEvaluationStatus) GetLastUpdated() *timestamppb.Timestamp { + if x != nil { + return x.LastUpdated + } + return nil +} + +func (x *RuleEvaluationStatus) GetEntityInfo() map[string]string { + if x != nil { + return x.EntityInfo + } + return nil +} + +func (x *RuleEvaluationStatus) GetDetails() string { + if x != nil { + return x.Details + } + return "" +} + +func (x *RuleEvaluationStatus) GetGuidance() string { + if x != nil { + return x.Guidance + } + return "" +} + +func (x *RuleEvaluationStatus) GetRemediationStatus() string { + if x != nil { + return x.RemediationStatus + } + return "" +} + +func (x *RuleEvaluationStatus) GetRemediationLastUpdated() *timestamppb.Timestamp { + if x != nil { + return x.RemediationLastUpdated + } + return nil +} + +func (x *RuleEvaluationStatus) GetRemediationDetails() string { + if x != nil { + return x.RemediationDetails + } + return "" +} + +func (x *RuleEvaluationStatus) GetRuleTypeName() string { + if x != nil { + return x.RuleTypeName + } + return "" +} + +func (x *RuleEvaluationStatus) GetRuleDescriptionName() string { + if x != nil { + return x.RuleDescriptionName + } + return "" +} + +func (x *RuleEvaluationStatus) GetAlert() *EvalResultAlert { + if x != nil { + return x.Alert + } + return nil +} + +func (x *RuleEvaluationStatus) GetSeverity() *Severity { + if x != nil { + return x.Severity + } + return nil +} + +func (x *RuleEvaluationStatus) GetRuleEvaluationId() string { + if x != nil { + return x.RuleEvaluationId + } + return "" +} + +func (x *RuleEvaluationStatus) GetRemediationUrl() string { + if x != nil { + return x.RemediationUrl + } + return "" +} + +func (x *RuleEvaluationStatus) GetRuleDisplayName() string { + if x != nil { + return x.RuleDisplayName + } + return "" +} + +func (x *RuleEvaluationStatus) GetReleasePhase() RuleTypeReleasePhase { + if x != nil { + return x.ReleasePhase + } + return RuleTypeReleasePhase_RULE_TYPE_RELEASE_PHASE_UNSPECIFIED +} + +// EntiryTypeId is a message that carries an ID together with a type to uniquely identify an entity +// such as (repo, 1), (artifact, 2), ... +type EntityTypedId struct { + state protoimpl.MessageState `protogen:"open.v1"` + // entity is the entity to get status for. Incompatible with `all` + Type Entity `protobuf:"varint,1,opt,name=type,proto3,enum=minder.v1.Entity" json:"type,omitempty"` + // id is the ID of the entity to get status for. Incompatible with `all` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EntityTypedId) Reset() { + *x = EntityTypedId{} + mi := &file_minder_v1_minder_proto_msgTypes[87] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EntityTypedId) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EntityTypedId) ProtoMessage() {} + +func (x *EntityTypedId) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[87] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EntityTypedId.ProtoReflect.Descriptor instead. +func (*EntityTypedId) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{87} +} + +func (x *EntityTypedId) GetType() Entity { + if x != nil { + return x.Type + } + return Entity_ENTITY_UNSPECIFIED +} + +func (x *EntityTypedId) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type GetProfileStatusByNameRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the rule type is evaluated. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + // name is the name of the profile to get + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + // entity is the entity to get status for. Incompatible with `all`. + // This is optional. + Entity *EntityTypedId `protobuf:"bytes,3,opt,name=entity,proto3" json:"entity,omitempty"` + // all is true if the status of all entities should be returned. + // Incompatible with `entity`. This is optional. + All bool `protobuf:"varint,4,opt,name=all,proto3" json:"all,omitempty"` + // rule is the type of the rule. Deprecated in favor of rule_type + // + // Deprecated: Marked as deprecated in minder/v1/minder.proto. + Rule string `protobuf:"bytes,5,opt,name=rule,proto3" json:"rule,omitempty"` + // rule_type is the type of the rule to filter on. + // This is optional. + RuleType string `protobuf:"bytes,6,opt,name=rule_type,json=ruleType,proto3" json:"rule_type,omitempty"` + // rule_name is the name of the rule to filter on. + // This is optional. + RuleName string `protobuf:"bytes,7,opt,name=rule_name,json=ruleName,proto3" json:"rule_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetProfileStatusByNameRequest) Reset() { + *x = GetProfileStatusByNameRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[88] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetProfileStatusByNameRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetProfileStatusByNameRequest) ProtoMessage() {} + +func (x *GetProfileStatusByNameRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[88] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetProfileStatusByNameRequest.ProtoReflect.Descriptor instead. +func (*GetProfileStatusByNameRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{88} +} + +func (x *GetProfileStatusByNameRequest) GetContext() *Context { + if x != nil { + return x.Context + } + return nil +} + +func (x *GetProfileStatusByNameRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *GetProfileStatusByNameRequest) GetEntity() *EntityTypedId { + if x != nil { + return x.Entity + } + return nil +} + +func (x *GetProfileStatusByNameRequest) GetAll() bool { + if x != nil { + return x.All + } + return false +} + +// Deprecated: Marked as deprecated in minder/v1/minder.proto. +func (x *GetProfileStatusByNameRequest) GetRule() string { + if x != nil { + return x.Rule + } + return "" +} + +func (x *GetProfileStatusByNameRequest) GetRuleType() string { + if x != nil { + return x.RuleType + } + return "" +} + +func (x *GetProfileStatusByNameRequest) GetRuleName() string { + if x != nil { + return x.RuleName + } + return "" +} + +type GetProfileStatusByNameResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // profile_status is the status of the profile + ProfileStatus *ProfileStatus `protobuf:"bytes,1,opt,name=profile_status,json=profileStatus,proto3" json:"profile_status,omitempty"` + // rule_evaluation_status is the status of the rules + RuleEvaluationStatus []*RuleEvaluationStatus `protobuf:"bytes,2,rep,name=rule_evaluation_status,json=ruleEvaluationStatus,proto3" json:"rule_evaluation_status,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetProfileStatusByNameResponse) Reset() { + *x = GetProfileStatusByNameResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[89] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetProfileStatusByNameResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetProfileStatusByNameResponse) ProtoMessage() {} + +func (x *GetProfileStatusByNameResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[89] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetProfileStatusByNameResponse.ProtoReflect.Descriptor instead. +func (*GetProfileStatusByNameResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{89} +} + +func (x *GetProfileStatusByNameResponse) GetProfileStatus() *ProfileStatus { + if x != nil { + return x.ProfileStatus + } + return nil +} + +func (x *GetProfileStatusByNameResponse) GetRuleEvaluationStatus() []*RuleEvaluationStatus { + if x != nil { + return x.RuleEvaluationStatus + } + return nil +} + +type GetProfileStatusByProjectRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the rule type is evaluated. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetProfileStatusByProjectRequest) Reset() { + *x = GetProfileStatusByProjectRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[90] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetProfileStatusByProjectRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetProfileStatusByProjectRequest) ProtoMessage() {} + +func (x *GetProfileStatusByProjectRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[90] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetProfileStatusByProjectRequest.ProtoReflect.Descriptor instead. +func (*GetProfileStatusByProjectRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{90} +} + +func (x *GetProfileStatusByProjectRequest) GetContext() *Context { + if x != nil { + return x.Context + } + return nil +} + +type GetProfileStatusByProjectResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // profile_status is the status of the profile + ProfileStatus []*ProfileStatus `protobuf:"bytes,1,rep,name=profile_status,json=profileStatus,proto3" json:"profile_status,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetProfileStatusByProjectResponse) Reset() { + *x = GetProfileStatusByProjectResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[91] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetProfileStatusByProjectResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetProfileStatusByProjectResponse) ProtoMessage() {} + +func (x *GetProfileStatusByProjectResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[91] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetProfileStatusByProjectResponse.ProtoReflect.Descriptor instead. +func (*GetProfileStatusByProjectResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{91} +} + +func (x *GetProfileStatusByProjectResponse) GetProfileStatus() []*ProfileStatus { + if x != nil { + return x.ProfileStatus + } + return nil +} + +type EntityAutoRegistrationConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + Enabled *bool `protobuf:"varint,1,opt,name=enabled,proto3,oneof" json:"enabled,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EntityAutoRegistrationConfig) Reset() { + *x = EntityAutoRegistrationConfig{} + mi := &file_minder_v1_minder_proto_msgTypes[92] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EntityAutoRegistrationConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EntityAutoRegistrationConfig) ProtoMessage() {} + +func (x *EntityAutoRegistrationConfig) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[92] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EntityAutoRegistrationConfig.ProtoReflect.Descriptor instead. +func (*EntityAutoRegistrationConfig) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{92} +} + +func (x *EntityAutoRegistrationConfig) GetEnabled() bool { + if x != nil && x.Enabled != nil { + return *x.Enabled + } + return false +} + +// AutoRegistration is the configuration for auto-registering entities. +// When nothing is set, it means that auto-registration is disabled. There is no difference between disabled +// and undefined so for the "let's not auto-register anything" case we'd just let the repeated string empty +type AutoRegistration struct { + state protoimpl.MessageState `protogen:"open.v1"` + // enabled is the list of entities that are enabled for auto-registration. + Entities map[string]*EntityAutoRegistrationConfig `protobuf:"bytes,1,rep,name=entities,proto3" json:"entities,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AutoRegistration) Reset() { + *x = AutoRegistration{} + mi := &file_minder_v1_minder_proto_msgTypes[93] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AutoRegistration) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AutoRegistration) ProtoMessage() {} + +func (x *AutoRegistration) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[93] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AutoRegistration.ProtoReflect.Descriptor instead. +func (*AutoRegistration) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{93} +} + +func (x *AutoRegistration) GetEntities() map[string]*EntityAutoRegistrationConfig { + if x != nil { + return x.Entities + } + return nil +} + +// ProviderConfig contains the generic configuration for a provider. +type ProviderConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // auto_registration is the configuration for auto-registering entities. + AutoRegistration *AutoRegistration `protobuf:"bytes,1,opt,name=auto_registration,json=autoRegistration,proto3,oneof" json:"auto_registration,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ProviderConfig) Reset() { + *x = ProviderConfig{} + mi := &file_minder_v1_minder_proto_msgTypes[94] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ProviderConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProviderConfig) ProtoMessage() {} + +func (x *ProviderConfig) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[94] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProviderConfig.ProtoReflect.Descriptor instead. +func (*ProviderConfig) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{94} +} + +func (x *ProviderConfig) GetAutoRegistration() *AutoRegistration { + if x != nil { + return x.AutoRegistration + } + return nil +} + +// RESTProviderConfig contains the configuration for the REST provider. +type RESTProviderConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // base_url is the base URL for the REST provider. + BaseUrl *string `protobuf:"bytes,1,opt,name=base_url,json=baseUrl,proto3,oneof" json:"base_url,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RESTProviderConfig) Reset() { + *x = RESTProviderConfig{} + mi := &file_minder_v1_minder_proto_msgTypes[95] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RESTProviderConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RESTProviderConfig) ProtoMessage() {} + +func (x *RESTProviderConfig) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[95] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RESTProviderConfig.ProtoReflect.Descriptor instead. +func (*RESTProviderConfig) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{95} +} + +func (x *RESTProviderConfig) GetBaseUrl() string { + if x != nil && x.BaseUrl != nil { + return *x.BaseUrl + } + return "" +} + +// GitHubProviderConfig contains the configuration for the GitHub client +// +// Endpoint: is the GitHub API endpoint +// +// If using the public GitHub API, Endpoint can be left blank +// disable revive linting for this struct as there is nothing wrong with the +// naming convention +type GitHubProviderConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Endpoint is the GitHub API endpoint. If using the public GitHub API, Endpoint can be left blank. + Endpoint *string `protobuf:"bytes,1,opt,name=endpoint,proto3,oneof" json:"endpoint,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GitHubProviderConfig) Reset() { + *x = GitHubProviderConfig{} + mi := &file_minder_v1_minder_proto_msgTypes[96] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GitHubProviderConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GitHubProviderConfig) ProtoMessage() {} + +func (x *GitHubProviderConfig) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[96] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GitHubProviderConfig.ProtoReflect.Descriptor instead. +func (*GitHubProviderConfig) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{96} +} + +func (x *GitHubProviderConfig) GetEndpoint() string { + if x != nil && x.Endpoint != nil { + return *x.Endpoint + } + return "" +} + +// GitHubAppProviderConfig contains the configuration for the GitHub App provider +type GitHubAppProviderConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Endpoint is the GitHub API endpoint. If using the public GitHub API, Endpoint can be left blank. + Endpoint *string `protobuf:"bytes,1,opt,name=endpoint,proto3,oneof" json:"endpoint,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GitHubAppProviderConfig) Reset() { + *x = GitHubAppProviderConfig{} + mi := &file_minder_v1_minder_proto_msgTypes[97] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GitHubAppProviderConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GitHubAppProviderConfig) ProtoMessage() {} + +func (x *GitHubAppProviderConfig) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[97] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GitHubAppProviderConfig.ProtoReflect.Descriptor instead. +func (*GitHubAppProviderConfig) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{97} +} + +func (x *GitHubAppProviderConfig) GetEndpoint() string { + if x != nil && x.Endpoint != nil { + return *x.Endpoint + } + return "" +} + +// GitLabProviderConfig contains the configuration for the GitLab provider. +// +// Endpoint: is the GitLab API endpoint +// +// If using the public GitLab API, Endpoint can be left blank +type GitLabProviderConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Endpoint is the GitLab API endpoint. If using the public GitLab API, Endpoint can be left blank. + Endpoint string `protobuf:"bytes,1,opt,name=endpoint,proto3" json:"endpoint,omitempty"` + // group is the GitLab group to use for the provider + Group string `protobuf:"bytes,2,opt,name=group,proto3" json:"group,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GitLabProviderConfig) Reset() { + *x = GitLabProviderConfig{} + mi := &file_minder_v1_minder_proto_msgTypes[98] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GitLabProviderConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GitLabProviderConfig) ProtoMessage() {} + +func (x *GitLabProviderConfig) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[98] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GitLabProviderConfig.ProtoReflect.Descriptor instead. +func (*GitLabProviderConfig) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{98} +} + +func (x *GitLabProviderConfig) GetEndpoint() string { + if x != nil { + return x.Endpoint + } + return "" +} + +func (x *GitLabProviderConfig) GetGroup() string { + if x != nil { + return x.Group + } + return "" +} + +// DockerHubProviderConfig contains the configuration for the DockerHub provider. +// +// Namespace: is the namespace for the DockerHub provider. +type DockerHubProviderConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // namespace is the namespace for the DockerHub provider. + Namespace *string `protobuf:"bytes,1,opt,name=namespace,proto3,oneof" json:"namespace,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DockerHubProviderConfig) Reset() { + *x = DockerHubProviderConfig{} + mi := &file_minder_v1_minder_proto_msgTypes[99] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DockerHubProviderConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DockerHubProviderConfig) ProtoMessage() {} + +func (x *DockerHubProviderConfig) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[99] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DockerHubProviderConfig.ProtoReflect.Descriptor instead. +func (*DockerHubProviderConfig) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{99} +} + +func (x *DockerHubProviderConfig) GetNamespace() string { + if x != nil && x.Namespace != nil { + return *x.Namespace + } + return "" +} + +// GHCRProviderConfig contains the configuration for the GHCR provider. +// +// Namespace: is the namespace for the GHCR provider. +type GHCRProviderConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // namespace is the namespace for the GHCR provider. + Namespace *string `protobuf:"bytes,1,opt,name=namespace,proto3,oneof" json:"namespace,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GHCRProviderConfig) Reset() { + *x = GHCRProviderConfig{} + mi := &file_minder_v1_minder_proto_msgTypes[100] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GHCRProviderConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GHCRProviderConfig) ProtoMessage() {} + +func (x *GHCRProviderConfig) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[100] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GHCRProviderConfig.ProtoReflect.Descriptor instead. +func (*GHCRProviderConfig) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{100} +} + +func (x *GHCRProviderConfig) GetNamespace() string { + if x != nil && x.Namespace != nil { + return *x.Namespace + } + return "" +} + +// Context defines the context in which a rule is evaluated. +// this normally refers to a combination of the provider, organization and project. +type Context struct { + state protoimpl.MessageState `protogen:"open.v1"` + // name of the provider + Provider *string `protobuf:"bytes,1,opt,name=provider,proto3,oneof" json:"provider,omitempty"` + // ID of the project. If empty or unset, will select the user's default project + // if they only have one project. + Project *string `protobuf:"bytes,3,opt,name=project,proto3,oneof" json:"project,omitempty"` + RetiredOrganization *string `protobuf:"bytes,2,opt,name=retired_organization,json=retiredOrganization,proto3,oneof" json:"retired_organization,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Context) Reset() { + *x = Context{} + mi := &file_minder_v1_minder_proto_msgTypes[101] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Context) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Context) ProtoMessage() {} + +func (x *Context) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[101] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Context.ProtoReflect.Descriptor instead. +func (*Context) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{101} +} + +func (x *Context) GetProvider() string { + if x != nil && x.Provider != nil { + return *x.Provider + } + return "" +} + +func (x *Context) GetProject() string { + if x != nil && x.Project != nil { + return *x.Project + } + return "" +} + +func (x *Context) GetRetiredOrganization() string { + if x != nil && x.RetiredOrganization != nil { + return *x.RetiredOrganization + } + return "" +} + +// ContextV2 defines the context in which a rule is evaluated. +type ContextV2 struct { + state protoimpl.MessageState `protogen:"open.v1"` + // project is the project ID. If empty or unset, will select the user's default project + // if they only have one project. + ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` + // name of the provider. Set to empty string when not applicable. + Provider string `protobuf:"bytes,2,opt,name=provider,proto3" json:"provider,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ContextV2) Reset() { + *x = ContextV2{} + mi := &file_minder_v1_minder_proto_msgTypes[102] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ContextV2) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ContextV2) ProtoMessage() {} + +func (x *ContextV2) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[102] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ContextV2.ProtoReflect.Descriptor instead. +func (*ContextV2) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{102} +} + +func (x *ContextV2) GetProjectId() string { + if x != nil { + return x.ProjectId + } + return "" +} + +func (x *ContextV2) GetProvider() string { + if x != nil { + return x.Provider + } + return "" +} + +// ListRuleTypesRequest is the request to list rule types. +type ListRuleTypesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the rule types are evaluated. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache +} + +func (x *ListRuleTypesRequest) Reset() { + *x = ListRuleTypesRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[103] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListRuleTypesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRuleTypesRequest) ProtoMessage() {} + +func (x *ListRuleTypesRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[103] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRuleTypesRequest.ProtoReflect.Descriptor instead. +func (*ListRuleTypesRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{103} +} + +func (x *ListRuleTypesRequest) GetContext() *Context { + if x != nil { + return x.Context + } + return nil +} + +// ListRuleTypesResponse is the response to list rule types. +type ListRuleTypesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // rule_types is the list of rule types. + RuleTypes []*RuleType `protobuf:"bytes,1,rep,name=rule_types,json=ruleTypes,proto3" json:"rule_types,omitempty"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} - // Endpoint is the GitHub API endpoint. If using the public GitHub API, Endpoint can be left blank. - Endpoint *string `protobuf:"bytes,1,opt,name=endpoint,proto3,oneof" json:"endpoint,omitempty"` +func (x *ListRuleTypesResponse) Reset() { + *x = ListRuleTypesResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[104] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *GitHubProviderConfig) Reset() { - *x = GitHubProviderConfig{} - mi := &file_minder_v1_minder_proto_msgTypes[84] +func (x *ListRuleTypesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRuleTypesResponse) ProtoMessage() {} + +func (x *ListRuleTypesResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[104] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRuleTypesResponse.ProtoReflect.Descriptor instead. +func (*ListRuleTypesResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{104} +} + +func (x *ListRuleTypesResponse) GetRuleTypes() []*RuleType { + if x != nil { + return x.RuleTypes + } + return nil +} + +// GetRuleTypeByNameRequest is the request to get a rule type by name. +type GetRuleTypeByNameRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the rule type is evaluated. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + // name is the name of the rule type. + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetRuleTypeByNameRequest) Reset() { + *x = GetRuleTypeByNameRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GitHubProviderConfig) String() string { +func (x *GetRuleTypeByNameRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GitHubProviderConfig) ProtoMessage() {} +func (*GetRuleTypeByNameRequest) ProtoMessage() {} -func (x *GitHubProviderConfig) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[84] +func (x *GetRuleTypeByNameRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[105] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5778,43 +6679,97 @@ func (x *GitHubProviderConfig) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GitHubProviderConfig.ProtoReflect.Descriptor instead. -func (*GitHubProviderConfig) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{84} +// Deprecated: Use GetRuleTypeByNameRequest.ProtoReflect.Descriptor instead. +func (*GetRuleTypeByNameRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{105} } -func (x *GitHubProviderConfig) GetEndpoint() string { - if x != nil && x.Endpoint != nil { - return *x.Endpoint +func (x *GetRuleTypeByNameRequest) GetContext() *Context { + if x != nil { + return x.Context + } + return nil +} + +func (x *GetRuleTypeByNameRequest) GetName() string { + if x != nil { + return x.Name } return "" } -// GitHubAppProviderConfig contains the configuration for the GitHub App provider -type GitHubAppProviderConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// GetRuleTypeByNameResponse is the response to get a rule type by name. +type GetRuleTypeByNameResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // rule_type is the rule type. + RuleType *RuleType `protobuf:"bytes,1,opt,name=rule_type,json=ruleType,proto3" json:"rule_type,omitempty"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} - // Endpoint is the GitHub API endpoint. If using the public GitHub API, Endpoint can be left blank. - Endpoint *string `protobuf:"bytes,1,opt,name=endpoint,proto3,oneof" json:"endpoint,omitempty"` +func (x *GetRuleTypeByNameResponse) Reset() { + *x = GetRuleTypeByNameResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[106] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *GitHubAppProviderConfig) Reset() { - *x = GitHubAppProviderConfig{} - mi := &file_minder_v1_minder_proto_msgTypes[85] +func (x *GetRuleTypeByNameResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRuleTypeByNameResponse) ProtoMessage() {} + +func (x *GetRuleTypeByNameResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[106] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetRuleTypeByNameResponse.ProtoReflect.Descriptor instead. +func (*GetRuleTypeByNameResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{106} +} + +func (x *GetRuleTypeByNameResponse) GetRuleType() *RuleType { + if x != nil { + return x.RuleType + } + return nil +} + +// GetRuleTypeByIdRequest is the request to get a rule type by id. +type GetRuleTypeByIdRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the rule type is evaluated. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + // id is the id of the rule type. + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetRuleTypeByIdRequest) Reset() { + *x = GetRuleTypeByIdRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GitHubAppProviderConfig) String() string { +func (x *GetRuleTypeByIdRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GitHubAppProviderConfig) ProtoMessage() {} +func (*GetRuleTypeByIdRequest) ProtoMessage() {} -func (x *GitHubAppProviderConfig) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[85] +func (x *GetRuleTypeByIdRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[107] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5825,49 +6780,95 @@ func (x *GitHubAppProviderConfig) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GitHubAppProviderConfig.ProtoReflect.Descriptor instead. -func (*GitHubAppProviderConfig) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{85} +// Deprecated: Use GetRuleTypeByIdRequest.ProtoReflect.Descriptor instead. +func (*GetRuleTypeByIdRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{107} } -func (x *GitHubAppProviderConfig) GetEndpoint() string { - if x != nil && x.Endpoint != nil { - return *x.Endpoint +func (x *GetRuleTypeByIdRequest) GetContext() *Context { + if x != nil { + return x.Context + } + return nil +} + +func (x *GetRuleTypeByIdRequest) GetId() string { + if x != nil { + return x.Id } return "" } -// GitLabProviderConfig contains the configuration for the GitLab provider. -// -// Endpoint: is the GitLab API endpoint -// -// If using the public GitLab API, Endpoint can be left blank -type GitLabProviderConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// GetRuleTypeByIdResponse is the response to get a rule type by id. +type GetRuleTypeByIdResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // rule_type is the rule type. + RuleType *RuleType `protobuf:"bytes,1,opt,name=rule_type,json=ruleType,proto3" json:"rule_type,omitempty"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} - // Endpoint is the GitLab API endpoint. If using the public GitLab API, Endpoint can be left blank. - Endpoint string `protobuf:"bytes,1,opt,name=endpoint,proto3" json:"endpoint,omitempty"` - // group is the GitLab group to use for the provider - Group string `protobuf:"bytes,2,opt,name=group,proto3" json:"group,omitempty"` +func (x *GetRuleTypeByIdResponse) Reset() { + *x = GetRuleTypeByIdResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[108] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *GitLabProviderConfig) Reset() { - *x = GitLabProviderConfig{} - mi := &file_minder_v1_minder_proto_msgTypes[86] +func (x *GetRuleTypeByIdResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRuleTypeByIdResponse) ProtoMessage() {} + +func (x *GetRuleTypeByIdResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[108] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetRuleTypeByIdResponse.ProtoReflect.Descriptor instead. +func (*GetRuleTypeByIdResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{108} +} + +func (x *GetRuleTypeByIdResponse) GetRuleType() *RuleType { + if x != nil { + return x.RuleType + } + return nil +} + +// CreateRuleTypeRequest is the request to create a rule type. +type CreateRuleTypeRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // rule_type is the rule type to be created. + RuleType *RuleType `protobuf:"bytes,1,opt,name=rule_type,json=ruleType,proto3" json:"rule_type,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateRuleTypeRequest) Reset() { + *x = CreateRuleTypeRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GitLabProviderConfig) String() string { +func (x *CreateRuleTypeRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GitLabProviderConfig) ProtoMessage() {} +func (*CreateRuleTypeRequest) ProtoMessage() {} -func (x *GitLabProviderConfig) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[86] +func (x *CreateRuleTypeRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[109] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5878,52 +6879,42 @@ func (x *GitLabProviderConfig) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GitLabProviderConfig.ProtoReflect.Descriptor instead. -func (*GitLabProviderConfig) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{86} -} - -func (x *GitLabProviderConfig) GetEndpoint() string { - if x != nil { - return x.Endpoint - } - return "" +// Deprecated: Use CreateRuleTypeRequest.ProtoReflect.Descriptor instead. +func (*CreateRuleTypeRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{109} } -func (x *GitLabProviderConfig) GetGroup() string { +func (x *CreateRuleTypeRequest) GetRuleType() *RuleType { if x != nil { - return x.Group + return x.RuleType } - return "" + return nil } -// DockerHubProviderConfig contains the configuration for the DockerHub provider. -// -// Namespace: is the namespace for the DockerHub provider. -type DockerHubProviderConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// CreateRuleTypeResponse is the response to create a rule type. +type CreateRuleTypeResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // rule_type is the rule type that was created. + RuleType *RuleType `protobuf:"bytes,1,opt,name=rule_type,json=ruleType,proto3" json:"rule_type,omitempty"` unknownFields protoimpl.UnknownFields - - // namespace is the namespace for the DockerHub provider. - Namespace *string `protobuf:"bytes,1,opt,name=namespace,proto3,oneof" json:"namespace,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *DockerHubProviderConfig) Reset() { - *x = DockerHubProviderConfig{} - mi := &file_minder_v1_minder_proto_msgTypes[87] +func (x *CreateRuleTypeResponse) Reset() { + *x = CreateRuleTypeResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *DockerHubProviderConfig) String() string { +func (x *CreateRuleTypeResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DockerHubProviderConfig) ProtoMessage() {} +func (*CreateRuleTypeResponse) ProtoMessage() {} -func (x *DockerHubProviderConfig) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[87] +func (x *CreateRuleTypeResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[110] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5934,45 +6925,42 @@ func (x *DockerHubProviderConfig) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DockerHubProviderConfig.ProtoReflect.Descriptor instead. -func (*DockerHubProviderConfig) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{87} +// Deprecated: Use CreateRuleTypeResponse.ProtoReflect.Descriptor instead. +func (*CreateRuleTypeResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{110} } -func (x *DockerHubProviderConfig) GetNamespace() string { - if x != nil && x.Namespace != nil { - return *x.Namespace +func (x *CreateRuleTypeResponse) GetRuleType() *RuleType { + if x != nil { + return x.RuleType } - return "" + return nil } -// GHCRProviderConfig contains the configuration for the GHCR provider. -// -// Namespace: is the namespace for the GHCR provider. -type GHCRProviderConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// UpdateRuleTypeRequest is the request to update a rule type. +type UpdateRuleTypeRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // rule_type is the rule type to be updated. + RuleType *RuleType `protobuf:"bytes,2,opt,name=rule_type,json=ruleType,proto3" json:"rule_type,omitempty"` unknownFields protoimpl.UnknownFields - - // namespace is the namespace for the GHCR provider. - Namespace *string `protobuf:"bytes,1,opt,name=namespace,proto3,oneof" json:"namespace,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *GHCRProviderConfig) Reset() { - *x = GHCRProviderConfig{} - mi := &file_minder_v1_minder_proto_msgTypes[88] +func (x *UpdateRuleTypeRequest) Reset() { + *x = UpdateRuleTypeRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GHCRProviderConfig) String() string { +func (x *UpdateRuleTypeRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GHCRProviderConfig) ProtoMessage() {} +func (*UpdateRuleTypeRequest) ProtoMessage() {} -func (x *GHCRProviderConfig) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[88] +func (x *UpdateRuleTypeRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[111] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5983,47 +6971,42 @@ func (x *GHCRProviderConfig) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GHCRProviderConfig.ProtoReflect.Descriptor instead. -func (*GHCRProviderConfig) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{88} +// Deprecated: Use UpdateRuleTypeRequest.ProtoReflect.Descriptor instead. +func (*UpdateRuleTypeRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{111} } -func (x *GHCRProviderConfig) GetNamespace() string { - if x != nil && x.Namespace != nil { - return *x.Namespace +func (x *UpdateRuleTypeRequest) GetRuleType() *RuleType { + if x != nil { + return x.RuleType } - return "" + return nil } -// Context defines the context in which a rule is evaluated. -// this normally refers to a combination of the provider, organization and project. -type Context struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// UpdateRuleTypeResponse is the response to update a rule type. +type UpdateRuleTypeResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // rule_type is the rule type that was updated. + RuleType *RuleType `protobuf:"bytes,1,opt,name=rule_type,json=ruleType,proto3" json:"rule_type,omitempty"` unknownFields protoimpl.UnknownFields - - // name of the provider - Provider *string `protobuf:"bytes,1,opt,name=provider,proto3,oneof" json:"provider,omitempty"` - // ID of the project - Project *string `protobuf:"bytes,3,opt,name=project,proto3,oneof" json:"project,omitempty"` - RetiredOrganization *string `protobuf:"bytes,2,opt,name=retired_organization,json=retiredOrganization,proto3,oneof" json:"retired_organization,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *Context) Reset() { - *x = Context{} - mi := &file_minder_v1_minder_proto_msgTypes[89] +func (x *UpdateRuleTypeResponse) Reset() { + *x = UpdateRuleTypeResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *Context) String() string { +func (x *UpdateRuleTypeResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Context) ProtoMessage() {} +func (*UpdateRuleTypeResponse) ProtoMessage() {} -func (x *Context) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[89] +func (x *UpdateRuleTypeResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[112] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6034,59 +7017,44 @@ func (x *Context) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Context.ProtoReflect.Descriptor instead. -func (*Context) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{89} -} - -func (x *Context) GetProvider() string { - if x != nil && x.Provider != nil { - return *x.Provider - } - return "" -} - -func (x *Context) GetProject() string { - if x != nil && x.Project != nil { - return *x.Project - } - return "" +// Deprecated: Use UpdateRuleTypeResponse.ProtoReflect.Descriptor instead. +func (*UpdateRuleTypeResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{112} } -func (x *Context) GetRetiredOrganization() string { - if x != nil && x.RetiredOrganization != nil { - return *x.RetiredOrganization +func (x *UpdateRuleTypeResponse) GetRuleType() *RuleType { + if x != nil { + return x.RuleType } - return "" + return nil } -// ContextV2 defines the context in which a rule is evaluated. -type ContextV2 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// DeleteRuleTypeRequest is the request to delete a rule type. +type DeleteRuleTypeRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the rule type is evaluated. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + // id is the id of the rule type to be deleted. + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields - - // project is the project ID - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` - // name of the provider. Set to empty string when not applicable. - Provider string `protobuf:"bytes,2,opt,name=provider,proto3" json:"provider,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *ContextV2) Reset() { - *x = ContextV2{} - mi := &file_minder_v1_minder_proto_msgTypes[90] +func (x *DeleteRuleTypeRequest) Reset() { + *x = DeleteRuleTypeRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ContextV2) String() string { +func (x *DeleteRuleTypeRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ContextV2) ProtoMessage() {} +func (*DeleteRuleTypeRequest) ProtoMessage() {} -func (x *ContextV2) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[90] +func (x *DeleteRuleTypeRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[113] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6097,50 +7065,47 @@ func (x *ContextV2) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ContextV2.ProtoReflect.Descriptor instead. -func (*ContextV2) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{90} +// Deprecated: Use DeleteRuleTypeRequest.ProtoReflect.Descriptor instead. +func (*DeleteRuleTypeRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{113} } -func (x *ContextV2) GetProjectId() string { +func (x *DeleteRuleTypeRequest) GetContext() *Context { if x != nil { - return x.ProjectId + return x.Context } - return "" + return nil } -func (x *ContextV2) GetProvider() string { +func (x *DeleteRuleTypeRequest) GetId() string { if x != nil { - return x.Provider + return x.Id } return "" } -// ListRuleTypesRequest is the request to list rule types. -type ListRuleTypesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// DeleteRuleTypeResponse is the response to delete a rule type. +type DeleteRuleTypeResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields - - // context is the context in which the rule types are evaluated. - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *ListRuleTypesRequest) Reset() { - *x = ListRuleTypesRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[91] +func (x *DeleteRuleTypeResponse) Reset() { + *x = DeleteRuleTypeResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListRuleTypesRequest) String() string { +func (x *DeleteRuleTypeResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListRuleTypesRequest) ProtoMessage() {} +func (*DeleteRuleTypeResponse) ProtoMessage() {} -func (x *ListRuleTypesRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[91] +func (x *DeleteRuleTypeResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[114] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6151,43 +7116,49 @@ func (x *ListRuleTypesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListRuleTypesRequest.ProtoReflect.Descriptor instead. -func (*ListRuleTypesRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{91} -} - -func (x *ListRuleTypesRequest) GetContext() *Context { - if x != nil { - return x.Context - } - return nil +// Deprecated: Use DeleteRuleTypeResponse.ProtoReflect.Descriptor instead. +func (*DeleteRuleTypeResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{114} } -// ListRuleTypesResponse is the response to list rule types. -type ListRuleTypesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type ListEvaluationResultsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the evaluation results are evaluated. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + // profile is the profile name or ID to retrieve results for. + // If empty, return evaluation results for profiles selected by + // an empty label_filter. + // + // Types that are valid to be assigned to ProfileSelector: + // + // *ListEvaluationResultsRequest_Profile + // *ListEvaluationResultsRequest_LabelFilter + ProfileSelector isListEvaluationResultsRequest_ProfileSelector `protobuf_oneof:"profile_selector"` + // If set, only return evaluation results for the named entities. + // If empty, return evaluation results for all entities + Entity []*EntityTypedId `protobuf:"bytes,4,rep,name=entity,proto3" json:"entity,omitempty"` + // If set, only return evaluation results for the named rules. + // If empty, return evaluation results for all rules + RuleName []string `protobuf:"bytes,5,rep,name=rule_name,json=ruleName,proto3" json:"rule_name,omitempty"` unknownFields protoimpl.UnknownFields - - // rule_types is the list of rule types. - RuleTypes []*RuleType `protobuf:"bytes,1,rep,name=rule_types,json=ruleTypes,proto3" json:"rule_types,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *ListRuleTypesResponse) Reset() { - *x = ListRuleTypesResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[92] +func (x *ListEvaluationResultsRequest) Reset() { + *x = ListEvaluationResultsRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListRuleTypesResponse) String() string { +func (x *ListEvaluationResultsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListRuleTypesResponse) ProtoMessage() {} +func (*ListEvaluationResultsRequest) ProtoMessage() {} -func (x *ListRuleTypesResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[92] +func (x *ListEvaluationResultsRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[115] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6198,99 +7169,102 @@ func (x *ListRuleTypesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListRuleTypesResponse.ProtoReflect.Descriptor instead. -func (*ListRuleTypesResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{92} +// Deprecated: Use ListEvaluationResultsRequest.ProtoReflect.Descriptor instead. +func (*ListEvaluationResultsRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{115} } -func (x *ListRuleTypesResponse) GetRuleTypes() []*RuleType { +func (x *ListEvaluationResultsRequest) GetContext() *Context { if x != nil { - return x.RuleTypes + return x.Context } return nil } -// GetRuleTypeByNameRequest is the request to get a rule type by name. -type GetRuleTypeByNameRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // context is the context in which the rule type is evaluated. - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // name is the name of the rule type. - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *GetRuleTypeByNameRequest) Reset() { - *x = GetRuleTypeByNameRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[93] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetRuleTypeByNameRequest) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *ListEvaluationResultsRequest) GetProfileSelector() isListEvaluationResultsRequest_ProfileSelector { + if x != nil { + return x.ProfileSelector + } + return nil } -func (*GetRuleTypeByNameRequest) ProtoMessage() {} - -func (x *GetRuleTypeByNameRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[93] +func (x *ListEvaluationResultsRequest) GetProfile() string { if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) + if x, ok := x.ProfileSelector.(*ListEvaluationResultsRequest_Profile); ok { + return x.Profile } - return ms } - return mi.MessageOf(x) + return "" } -// Deprecated: Use GetRuleTypeByNameRequest.ProtoReflect.Descriptor instead. -func (*GetRuleTypeByNameRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{93} +func (x *ListEvaluationResultsRequest) GetLabelFilter() string { + if x != nil { + if x, ok := x.ProfileSelector.(*ListEvaluationResultsRequest_LabelFilter); ok { + return x.LabelFilter + } + } + return "" } -func (x *GetRuleTypeByNameRequest) GetContext() *Context { +func (x *ListEvaluationResultsRequest) GetEntity() []*EntityTypedId { if x != nil { - return x.Context + return x.Entity } return nil } -func (x *GetRuleTypeByNameRequest) GetName() string { +func (x *ListEvaluationResultsRequest) GetRuleName() []string { if x != nil { - return x.Name + return x.RuleName } - return "" + return nil } -// GetRuleTypeByNameResponse is the response to get a rule type by name. -type GetRuleTypeByNameResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +type isListEvaluationResultsRequest_ProfileSelector interface { + isListEvaluationResultsRequest_ProfileSelector() +} - // rule_type is the rule type. - RuleType *RuleType `protobuf:"bytes,1,opt,name=rule_type,json=ruleType,proto3" json:"rule_type,omitempty"` +type ListEvaluationResultsRequest_Profile struct { + // ID can contain either a profile name or an ID + Profile string `protobuf:"bytes,2,opt,name=profile,proto3,oneof"` } -func (x *GetRuleTypeByNameResponse) Reset() { - *x = GetRuleTypeByNameResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[94] +type ListEvaluationResultsRequest_LabelFilter struct { + // Filter profiles to only those matching the specified labels. + // + // The default is to return all user-created profiles; the string "*" can + // be used to select all profiles, including system profiles. This syntax + // may be expanded in the future. + LabelFilter string `protobuf:"bytes,3,opt,name=label_filter,json=labelFilter,proto3,oneof"` +} + +func (*ListEvaluationResultsRequest_Profile) isListEvaluationResultsRequest_ProfileSelector() {} + +func (*ListEvaluationResultsRequest_LabelFilter) isListEvaluationResultsRequest_ProfileSelector() {} + +type ListEvaluationResultsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Each entity selected by the list request will have _single_ entry in entities which contains results of all evaluations for each profile. + Entities []*ListEvaluationResultsResponse_EntityEvaluationResults `protobuf:"bytes,2,rep,name=entities,proto3" json:"entities,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListEvaluationResultsResponse) Reset() { + *x = ListEvaluationResultsResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GetRuleTypeByNameResponse) String() string { +func (x *ListEvaluationResultsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetRuleTypeByNameResponse) ProtoMessage() {} +func (*ListEvaluationResultsResponse) ProtoMessage() {} -func (x *GetRuleTypeByNameResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[94] +func (x *ListEvaluationResultsResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[116] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6301,45 +7275,59 @@ func (x *GetRuleTypeByNameResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetRuleTypeByNameResponse.ProtoReflect.Descriptor instead. -func (*GetRuleTypeByNameResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{94} +// Deprecated: Use ListEvaluationResultsResponse.ProtoReflect.Descriptor instead. +func (*ListEvaluationResultsResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{116} } -func (x *GetRuleTypeByNameResponse) GetRuleType() *RuleType { +func (x *ListEvaluationResultsResponse) GetEntities() []*ListEvaluationResultsResponse_EntityEvaluationResults { if x != nil { - return x.RuleType + return x.Entities } return nil } -// GetRuleTypeByIdRequest is the request to get a rule type by id. -type GetRuleTypeByIdRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// RestType defines the rest data evaluation. +// This is used to fetch data from a REST endpoint. +type RestType struct { + state protoimpl.MessageState `protogen:"open.v1"` + // endpoint is the endpoint to fetch data from. + // This can be a URL or path on the API. + // This is a required field and must be set. + // This is also evaluated via a template which allows + // us dynamically fill in the values. + Endpoint string `protobuf:"bytes,1,opt,name=endpoint,proto3" json:"endpoint,omitempty"` + // method is the method to use to fetch data. + Method string `protobuf:"bytes,2,opt,name=method,proto3" json:"method,omitempty"` + // headers are the headers to be sent to the endpoint. + Headers []string `protobuf:"bytes,3,rep,name=headers,proto3" json:"headers,omitempty"` + // body is the body to be sent to the endpoint. + // This is expected to be a valid JSON string. + Body *string `protobuf:"bytes,4,opt,name=body,proto3,oneof" json:"body,omitempty"` + // parse is the parsing mechanism to be used to parse the data. + Parse string `protobuf:"bytes,5,opt,name=parse,proto3" json:"parse,omitempty"` + // fallback provides a body that the ingester would return in case + // the REST call returns a non-200 status code. + Fallback []*RestType_Fallback `protobuf:"bytes,6,rep,name=fallback,proto3" json:"fallback,omitempty"` unknownFields protoimpl.UnknownFields - - // context is the context in which the rule type is evaluated. - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // id is the id of the rule type. - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *GetRuleTypeByIdRequest) Reset() { - *x = GetRuleTypeByIdRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[95] +func (x *RestType) Reset() { + *x = RestType{} + mi := &file_minder_v1_minder_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GetRuleTypeByIdRequest) String() string { +func (x *RestType) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetRuleTypeByIdRequest) ProtoMessage() {} +func (*RestType) ProtoMessage() {} -func (x *GetRuleTypeByIdRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[95] +func (x *RestType) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[117] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6350,97 +7338,76 @@ func (x *GetRuleTypeByIdRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetRuleTypeByIdRequest.ProtoReflect.Descriptor instead. -func (*GetRuleTypeByIdRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{95} +// Deprecated: Use RestType.ProtoReflect.Descriptor instead. +func (*RestType) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{117} } -func (x *GetRuleTypeByIdRequest) GetContext() *Context { +func (x *RestType) GetEndpoint() string { if x != nil { - return x.Context + return x.Endpoint } - return nil + return "" } -func (x *GetRuleTypeByIdRequest) GetId() string { +func (x *RestType) GetMethod() string { if x != nil { - return x.Id + return x.Method } return "" } -// GetRuleTypeByIdResponse is the response to get a rule type by id. -type GetRuleTypeByIdResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // rule_type is the rule type. - RuleType *RuleType `protobuf:"bytes,1,opt,name=rule_type,json=ruleType,proto3" json:"rule_type,omitempty"` -} - -func (x *GetRuleTypeByIdResponse) Reset() { - *x = GetRuleTypeByIdResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[96] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *RestType) GetHeaders() []string { + if x != nil { + return x.Headers + } + return nil } -func (x *GetRuleTypeByIdResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *RestType) GetBody() string { + if x != nil && x.Body != nil { + return *x.Body + } + return "" } -func (*GetRuleTypeByIdResponse) ProtoMessage() {} - -func (x *GetRuleTypeByIdResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[96] +func (x *RestType) GetParse() string { if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms + return x.Parse } - return mi.MessageOf(x) -} - -// Deprecated: Use GetRuleTypeByIdResponse.ProtoReflect.Descriptor instead. -func (*GetRuleTypeByIdResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{96} + return "" } -func (x *GetRuleTypeByIdResponse) GetRuleType() *RuleType { +func (x *RestType) GetFallback() []*RestType_Fallback { if x != nil { - return x.RuleType + return x.Fallback } return nil } -// CreateRuleTypeRequest is the request to create a rule type. -type CreateRuleTypeRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// BuiltinType defines the builtin data evaluation. +type BuiltinType struct { + state protoimpl.MessageState `protogen:"open.v1"` + Method string `protobuf:"bytes,1,opt,name=method,proto3" json:"method,omitempty"` unknownFields protoimpl.UnknownFields - - // rule_type is the rule type to be created. - RuleType *RuleType `protobuf:"bytes,1,opt,name=rule_type,json=ruleType,proto3" json:"rule_type,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *CreateRuleTypeRequest) Reset() { - *x = CreateRuleTypeRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[97] +func (x *BuiltinType) Reset() { + *x = BuiltinType{} + mi := &file_minder_v1_minder_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *CreateRuleTypeRequest) String() string { +func (x *BuiltinType) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateRuleTypeRequest) ProtoMessage() {} +func (*BuiltinType) ProtoMessage() {} -func (x *CreateRuleTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[97] +func (x *BuiltinType) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[118] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6451,43 +7418,40 @@ func (x *CreateRuleTypeRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateRuleTypeRequest.ProtoReflect.Descriptor instead. -func (*CreateRuleTypeRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{97} +// Deprecated: Use BuiltinType.ProtoReflect.Descriptor instead. +func (*BuiltinType) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{118} } -func (x *CreateRuleTypeRequest) GetRuleType() *RuleType { +func (x *BuiltinType) GetMethod() string { if x != nil { - return x.RuleType + return x.Method } - return nil + return "" } -// CreateRuleTypeResponse is the response to create a rule type. -type CreateRuleTypeResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// ArtifactType defines the artifact data evaluation. +type ArtifactType struct { + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields - - // rule_type is the rule type that was created. - RuleType *RuleType `protobuf:"bytes,1,opt,name=rule_type,json=ruleType,proto3" json:"rule_type,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *CreateRuleTypeResponse) Reset() { - *x = CreateRuleTypeResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[98] +func (x *ArtifactType) Reset() { + *x = ArtifactType{} + mi := &file_minder_v1_minder_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *CreateRuleTypeResponse) String() string { +func (x *ArtifactType) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateRuleTypeResponse) ProtoMessage() {} +func (*ArtifactType) ProtoMessage() {} -func (x *CreateRuleTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[98] +func (x *ArtifactType) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[119] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6498,43 +7462,37 @@ func (x *CreateRuleTypeResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateRuleTypeResponse.ProtoReflect.Descriptor instead. -func (*CreateRuleTypeResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{98} -} - -func (x *CreateRuleTypeResponse) GetRuleType() *RuleType { - if x != nil { - return x.RuleType - } - return nil +// Deprecated: Use ArtifactType.ProtoReflect.Descriptor instead. +func (*ArtifactType) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{119} } -// UpdateRuleTypeRequest is the request to update a rule type. -type UpdateRuleTypeRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// GitType defines the git data ingester. +type GitType struct { + state protoimpl.MessageState `protogen:"open.v1"` + // clone_url is the url of the git repository. + CloneUrl string `protobuf:"bytes,1,opt,name=clone_url,json=cloneUrl,proto3" json:"clone_url,omitempty"` + // branch is the branch of the git repository. + Branch string `protobuf:"bytes,2,opt,name=branch,proto3" json:"branch,omitempty"` unknownFields protoimpl.UnknownFields - - // rule_type is the rule type to be updated. - RuleType *RuleType `protobuf:"bytes,2,opt,name=rule_type,json=ruleType,proto3" json:"rule_type,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *UpdateRuleTypeRequest) Reset() { - *x = UpdateRuleTypeRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[99] +func (x *GitType) Reset() { + *x = GitType{} + mi := &file_minder_v1_minder_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *UpdateRuleTypeRequest) String() string { +func (x *GitType) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateRuleTypeRequest) ProtoMessage() {} +func (*GitType) ProtoMessage() {} -func (x *UpdateRuleTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[99] +func (x *GitType) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[120] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6545,43 +7503,54 @@ func (x *UpdateRuleTypeRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateRuleTypeRequest.ProtoReflect.Descriptor instead. -func (*UpdateRuleTypeRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{99} +// Deprecated: Use GitType.ProtoReflect.Descriptor instead. +func (*GitType) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{120} } -func (x *UpdateRuleTypeRequest) GetRuleType() *RuleType { +func (x *GitType) GetCloneUrl() string { if x != nil { - return x.RuleType + return x.CloneUrl } - return nil + return "" } -// UpdateRuleTypeResponse is the response to update a rule type. -type UpdateRuleTypeResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *GitType) GetBranch() string { + if x != nil { + return x.Branch + } + return "" +} - // rule_type is the rule type that was updated. - RuleType *RuleType `protobuf:"bytes,1,opt,name=rule_type,json=ruleType,proto3" json:"rule_type,omitempty"` +// DiffType defines the diff data ingester. +type DiffType struct { + state protoimpl.MessageState `protogen:"open.v1"` + // ecosystems is the list of ecosystems to be used + // for the "dep" diff type. + Ecosystems []*DiffType_Ecosystem `protobuf:"bytes,1,rep,name=ecosystems,proto3" json:"ecosystems,omitempty"` + // type is the type of diff ingestor to use. + // The default is "dep" which will leverage + // the ecosystems array. + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *UpdateRuleTypeResponse) Reset() { - *x = UpdateRuleTypeResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[100] +func (x *DiffType) Reset() { + *x = DiffType{} + mi := &file_minder_v1_minder_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *UpdateRuleTypeResponse) String() string { +func (x *DiffType) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateRuleTypeResponse) ProtoMessage() {} +func (*DiffType) ProtoMessage() {} -func (x *UpdateRuleTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[100] +func (x *DiffType) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[121] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6592,45 +7561,53 @@ func (x *UpdateRuleTypeResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateRuleTypeResponse.ProtoReflect.Descriptor instead. -func (*UpdateRuleTypeResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{100} +// Deprecated: Use DiffType.ProtoReflect.Descriptor instead. +func (*DiffType) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{121} } -func (x *UpdateRuleTypeResponse) GetRuleType() *RuleType { +func (x *DiffType) GetEcosystems() []*DiffType_Ecosystem { if x != nil { - return x.RuleType + return x.Ecosystems } return nil } -// DeleteRuleTypeRequest is the request to delete a rule type. -type DeleteRuleTypeRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *DiffType) GetType() string { + if x != nil { + return x.Type + } + return "" +} - // context is the context in which the rule type is evaluated. - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // id is the id of the rule type to be deleted. - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` +// DepsType defines the "deps" ingester which can extract depndencies in protobom +// format for rule evaluation. +type DepsType struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to EntityType: + // + // *DepsType_Repo + // *DepsType_Pr + EntityType isDepsType_EntityType `protobuf_oneof:"entity_type"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *DeleteRuleTypeRequest) Reset() { - *x = DeleteRuleTypeRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[101] +func (x *DepsType) Reset() { + *x = DepsType{} + mi := &file_minder_v1_minder_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *DeleteRuleTypeRequest) String() string { +func (x *DepsType) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteRuleTypeRequest) ProtoMessage() {} +func (*DepsType) ProtoMessage() {} -func (x *DeleteRuleTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[101] +func (x *DepsType) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[122] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6641,47 +7618,76 @@ func (x *DeleteRuleTypeRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteRuleTypeRequest.ProtoReflect.Descriptor instead. -func (*DeleteRuleTypeRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{101} +// Deprecated: Use DepsType.ProtoReflect.Descriptor instead. +func (*DepsType) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{122} } -func (x *DeleteRuleTypeRequest) GetContext() *Context { +func (x *DepsType) GetEntityType() isDepsType_EntityType { if x != nil { - return x.Context + return x.EntityType } return nil } -func (x *DeleteRuleTypeRequest) GetId() string { +func (x *DepsType) GetRepo() *DepsType_RepoConfigs { if x != nil { - return x.Id + if x, ok := x.EntityType.(*DepsType_Repo); ok { + return x.Repo + } } - return "" + return nil } -// DeleteRuleTypeResponse is the response to delete a rule type. -type DeleteRuleTypeResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +func (x *DepsType) GetPr() *DepsType_PullRequestConfigs { + if x != nil { + if x, ok := x.EntityType.(*DepsType_Pr); ok { + return x.Pr + } + } + return nil +} + +type isDepsType_EntityType interface { + isDepsType_EntityType() +} + +type DepsType_Repo struct { + Repo *DepsType_RepoConfigs `protobuf:"bytes,1,opt,name=repo,proto3,oneof"` +} + +type DepsType_Pr struct { + Pr *DepsType_PullRequestConfigs `protobuf:"bytes,2,opt,name=pr,proto3,oneof"` +} + +func (*DepsType_Repo) isDepsType_EntityType() {} + +func (*DepsType_Pr) isDepsType_EntityType() {} + +// Severity defines the severity of the rule. +type Severity struct { + state protoimpl.MessageState `protogen:"open.v1"` + // value is the severity value. + Value Severity_Value `protobuf:"varint,1,opt,name=value,proto3,enum=minder.v1.Severity_Value" json:"value,omitempty"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *DeleteRuleTypeResponse) Reset() { - *x = DeleteRuleTypeResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[102] +func (x *Severity) Reset() { + *x = Severity{} + mi := &file_minder_v1_minder_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *DeleteRuleTypeResponse) String() string { +func (x *Severity) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteRuleTypeResponse) ProtoMessage() {} +func (*Severity) ProtoMessage() {} -func (x *DeleteRuleTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[102] +func (x *Severity) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[123] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6692,50 +7698,68 @@ func (x *DeleteRuleTypeResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteRuleTypeResponse.ProtoReflect.Descriptor instead. -func (*DeleteRuleTypeResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{102} +// Deprecated: Use Severity.ProtoReflect.Descriptor instead. +func (*Severity) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{123} } -type ListEvaluationResultsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *Severity) GetValue() Severity_Value { + if x != nil { + return x.Value + } + return Severity_VALUE_UNSPECIFIED +} - // context is the context in which the evaluation results are evaluated. - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // profile is the profile name or ID to retrieve results for. - // If empty, return evaluation results for profiles selected by - // an empty label_filter. - // - // Types that are assignable to ProfileSelector: - // - // *ListEvaluationResultsRequest_Profile - // *ListEvaluationResultsRequest_LabelFilter - ProfileSelector isListEvaluationResultsRequest_ProfileSelector `protobuf_oneof:"profile_selector"` - // If set, only return evaluation results for the named entities. - // If empty, return evaluation results for all entities - Entity []*EntityTypedId `protobuf:"bytes,4,rep,name=entity,proto3" json:"entity,omitempty"` - // If set, only return evaluation results for the named rules. - // If empty, return evaluation results for all rules - RuleName []string `protobuf:"bytes,5,rep,name=rule_name,json=ruleName,proto3" json:"rule_name,omitempty"` +// RuleType defines rules that may or may not be user defined. +// The version is assumed from the folder's version. +type RuleType struct { + state protoimpl.MessageState `protogen:"open.v1"` + // version is the version of the rule type API. + Version string `protobuf:"bytes,11,opt,name=version,proto3" json:"version,omitempty"` + // type is the type of the rule. + Type string `protobuf:"bytes,12,opt,name=type,proto3" json:"type,omitempty"` + // id is the id of the rule type. + // This is mostly optional and is set by the server. + Id *string `protobuf:"bytes,1,opt,name=id,proto3,oneof" json:"id,omitempty"` + // name is the name of the rule type. + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + // display_name is the display name of the rule type. + DisplayName string `protobuf:"bytes,8,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // short_failure_message is the message to display when the evaluation fails. + ShortFailureMessage string `protobuf:"bytes,10,opt,name=short_failure_message,json=shortFailureMessage,proto3" json:"short_failure_message,omitempty"` + // context is the context in which the rule is evaluated. + Context *Context `protobuf:"bytes,3,opt,name=context,proto3" json:"context,omitempty"` + // def is the definition of the rule type. + Def *RuleType_Definition `protobuf:"bytes,4,opt,name=def,proto3" json:"def,omitempty"` + // description is the description of the rule type. + // This is expected to be a valid markdown formatted string. + Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"` + // guidance are instructions we give the user in case a rule fails. + // This is expected to be a valid markdown formatted string. + Guidance string `protobuf:"bytes,6,opt,name=guidance,proto3" json:"guidance,omitempty"` + // severity is the severity of the rule type. + Severity *Severity `protobuf:"bytes,7,opt,name=severity,proto3" json:"severity,omitempty"` + // release_phase is the release phase of the rule type, i.e. alpha, beta, ga, deprecated. + ReleasePhase RuleTypeReleasePhase `protobuf:"varint,9,opt,name=release_phase,json=releasePhase,proto3,enum=minder.v1.RuleTypeReleasePhase" json:"release_phase,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *ListEvaluationResultsRequest) Reset() { - *x = ListEvaluationResultsRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[103] +func (x *RuleType) Reset() { + *x = RuleType{} + mi := &file_minder_v1_minder_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListEvaluationResultsRequest) String() string { +func (x *RuleType) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListEvaluationResultsRequest) ProtoMessage() {} +func (*RuleType) ProtoMessage() {} -func (x *ListEvaluationResultsRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[103] +func (x *RuleType) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[124] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6746,99 +7770,160 @@ func (x *ListEvaluationResultsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListEvaluationResultsRequest.ProtoReflect.Descriptor instead. -func (*ListEvaluationResultsRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{103} +// Deprecated: Use RuleType.ProtoReflect.Descriptor instead. +func (*RuleType) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{124} } -func (x *ListEvaluationResultsRequest) GetContext() *Context { +func (x *RuleType) GetVersion() string { if x != nil { - return x.Context + return x.Version } - return nil + return "" } -func (m *ListEvaluationResultsRequest) GetProfileSelector() isListEvaluationResultsRequest_ProfileSelector { - if m != nil { - return m.ProfileSelector +func (x *RuleType) GetType() string { + if x != nil { + return x.Type } - return nil + return "" } -func (x *ListEvaluationResultsRequest) GetProfile() string { - if x, ok := x.GetProfileSelector().(*ListEvaluationResultsRequest_Profile); ok { - return x.Profile +func (x *RuleType) GetId() string { + if x != nil && x.Id != nil { + return *x.Id } return "" } -func (x *ListEvaluationResultsRequest) GetLabelFilter() string { - if x, ok := x.GetProfileSelector().(*ListEvaluationResultsRequest_LabelFilter); ok { - return x.LabelFilter +func (x *RuleType) GetName() string { + if x != nil { + return x.Name } return "" } -func (x *ListEvaluationResultsRequest) GetEntity() []*EntityTypedId { +func (x *RuleType) GetDisplayName() string { if x != nil { - return x.Entity + return x.DisplayName } - return nil + return "" } -func (x *ListEvaluationResultsRequest) GetRuleName() []string { +func (x *RuleType) GetShortFailureMessage() string { if x != nil { - return x.RuleName + return x.ShortFailureMessage + } + return "" +} + +func (x *RuleType) GetContext() *Context { + if x != nil { + return x.Context } return nil } -type isListEvaluationResultsRequest_ProfileSelector interface { - isListEvaluationResultsRequest_ProfileSelector() +func (x *RuleType) GetDef() *RuleType_Definition { + if x != nil { + return x.Def + } + return nil } -type ListEvaluationResultsRequest_Profile struct { - // ID can contain either a profile name or an ID - Profile string `protobuf:"bytes,2,opt,name=profile,proto3,oneof"` +func (x *RuleType) GetDescription() string { + if x != nil { + return x.Description + } + return "" } -type ListEvaluationResultsRequest_LabelFilter struct { - // Filter profiles to only those matching the specified labels. - // - // The default is to return all user-created profiles; the string "*" can - // be used to select all profiles, including system profiles. This syntax - // may be expanded in the future. - LabelFilter string `protobuf:"bytes,3,opt,name=label_filter,json=labelFilter,proto3,oneof"` +func (x *RuleType) GetGuidance() string { + if x != nil { + return x.Guidance + } + return "" } -func (*ListEvaluationResultsRequest_Profile) isListEvaluationResultsRequest_ProfileSelector() {} +func (x *RuleType) GetSeverity() *Severity { + if x != nil { + return x.Severity + } + return nil +} -func (*ListEvaluationResultsRequest_LabelFilter) isListEvaluationResultsRequest_ProfileSelector() {} +func (x *RuleType) GetReleasePhase() RuleTypeReleasePhase { + if x != nil { + return x.ReleasePhase + } + return RuleTypeReleasePhase_RULE_TYPE_RELEASE_PHASE_UNSPECIFIED +} -type ListEvaluationResultsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// Profile defines a profile that is user defined. +// All fields are optional because we want to allow partial updates. +type Profile struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the profile is evaluated. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + // id is the id of the profile. + // This is optional and is set by the system. + Id *string `protobuf:"bytes,2,opt,name=id,proto3,oneof" json:"id,omitempty"` + // name is the name of the profile instance. + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + // labels are a set of system-provided attributes which can be used to + // filter profiles and status results. Labels cannot be set by the user, + // but are returned in ListProfiles. + // + // Labels use DNS label constraints, with a possible namespace prefix + // separated by a colon (:). They are intended to allow filtering, but + // not to store arbitrary metadata. + // DNS labels are 1-63 character alphanumeric strings with internal hyphens. + // An RE2-style validation regex would be: + // + // DNS_STR = "[a-zA-Z0-9](?[-a-zA-Z0-9]{0,61}[a-zA-Z0-9])?" + // ($DNS_STR:)?$DNS_STR + Labels []string `protobuf:"bytes,12,rep,name=labels,proto3" json:"labels,omitempty"` + // These are the entities that one could set in the profile. + Repository []*Profile_Rule `protobuf:"bytes,4,rep,name=repository,proto3" json:"repository,omitempty"` + BuildEnvironment []*Profile_Rule `protobuf:"bytes,5,rep,name=build_environment,json=buildEnvironment,proto3" json:"build_environment,omitempty"` + Artifact []*Profile_Rule `protobuf:"bytes,6,rep,name=artifact,proto3" json:"artifact,omitempty"` + PullRequest []*Profile_Rule `protobuf:"bytes,7,rep,name=pull_request,json=pullRequest,proto3" json:"pull_request,omitempty"` + Release []*Profile_Rule `protobuf:"bytes,15,rep,name=release,proto3" json:"release,omitempty"` + PipelineRun []*Profile_Rule `protobuf:"bytes,16,rep,name=pipeline_run,json=pipelineRun,proto3" json:"pipeline_run,omitempty"` + TaskRun []*Profile_Rule `protobuf:"bytes,17,rep,name=task_run,json=taskRun,proto3" json:"task_run,omitempty"` + Build []*Profile_Rule `protobuf:"bytes,18,rep,name=build,proto3" json:"build,omitempty"` + Selection []*Profile_Selector `protobuf:"bytes,14,rep,name=selection,proto3" json:"selection,omitempty"` + // whether and how to remediate (on,off,dry_run) + // this is optional and defaults to "off" + Remediate *string `protobuf:"bytes,8,opt,name=remediate,proto3,oneof" json:"remediate,omitempty"` + // whether and how to alert (on,off,dry_run) + // this is optional and defaults to "on" + Alert *string `protobuf:"bytes,9,opt,name=alert,proto3,oneof" json:"alert,omitempty"` + // type is a placeholder for the object type. It should always be set to "profile". + Type string `protobuf:"bytes,10,opt,name=type,proto3" json:"type,omitempty"` + // version is the version of the profile type. In this case, it is "v1" + Version string `protobuf:"bytes,11,opt,name=version,proto3" json:"version,omitempty"` + // display_name is the display name of the profile. + DisplayName string `protobuf:"bytes,13,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` unknownFields protoimpl.UnknownFields - - // Each entity selected by the list request will have _single_ entry in entities which contains results of all evaluations for each profile. - Entities []*ListEvaluationResultsResponse_EntityEvaluationResults `protobuf:"bytes,2,rep,name=entities,proto3" json:"entities,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *ListEvaluationResultsResponse) Reset() { - *x = ListEvaluationResultsResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[104] +func (x *Profile) Reset() { + *x = Profile{} + mi := &file_minder_v1_minder_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListEvaluationResultsResponse) String() string { +func (x *Profile) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListEvaluationResultsResponse) ProtoMessage() {} +func (*Profile) ProtoMessage() {} -func (x *ListEvaluationResultsResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[104] +func (x *Profile) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[125] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6849,140 +7934,158 @@ func (x *ListEvaluationResultsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListEvaluationResultsResponse.ProtoReflect.Descriptor instead. -func (*ListEvaluationResultsResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{104} +// Deprecated: Use Profile.ProtoReflect.Descriptor instead. +func (*Profile) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{125} } -func (x *ListEvaluationResultsResponse) GetEntities() []*ListEvaluationResultsResponse_EntityEvaluationResults { +func (x *Profile) GetContext() *Context { if x != nil { - return x.Entities + return x.Context } return nil } -// RestType defines the rest data evaluation. -// This is used to fetch data from a REST endpoint. -type RestType struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *Profile) GetId() string { + if x != nil && x.Id != nil { + return *x.Id + } + return "" +} - // endpoint is the endpoint to fetch data from. - // This can be a URL or the path on the API.bool - // This is a required field and must be set. - // This is also evaluated via a template which allows - // us dynamically fill in the values. - Endpoint string `protobuf:"bytes,1,opt,name=endpoint,proto3" json:"endpoint,omitempty"` - // method is the method to use to fetch data. - Method string `protobuf:"bytes,2,opt,name=method,proto3" json:"method,omitempty"` - // headers are the headers to be sent to the endpoint. - Headers []string `protobuf:"bytes,3,rep,name=headers,proto3" json:"headers,omitempty"` - // body is the body to be sent to the endpoint. - Body *string `protobuf:"bytes,4,opt,name=body,proto3,oneof" json:"body,omitempty"` - // parse is the parsing mechanism to be used to parse the data. - Parse string `protobuf:"bytes,5,opt,name=parse,proto3" json:"parse,omitempty"` - // fallback provides a body that the ingester would return in case - // the REST call returns a non-200 status code. - Fallback []*RestType_Fallback `protobuf:"bytes,6,rep,name=fallback,proto3" json:"fallback,omitempty"` +func (x *Profile) GetName() string { + if x != nil { + return x.Name + } + return "" } -func (x *RestType) Reset() { - *x = RestType{} - mi := &file_minder_v1_minder_proto_msgTypes[105] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *Profile) GetLabels() []string { + if x != nil { + return x.Labels + } + return nil } -func (x *RestType) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *Profile) GetRepository() []*Profile_Rule { + if x != nil { + return x.Repository + } + return nil +} + +func (x *Profile) GetBuildEnvironment() []*Profile_Rule { + if x != nil { + return x.BuildEnvironment + } + return nil +} + +func (x *Profile) GetArtifact() []*Profile_Rule { + if x != nil { + return x.Artifact + } + return nil +} + +func (x *Profile) GetPullRequest() []*Profile_Rule { + if x != nil { + return x.PullRequest + } + return nil +} + +func (x *Profile) GetRelease() []*Profile_Rule { + if x != nil { + return x.Release + } + return nil +} + +func (x *Profile) GetPipelineRun() []*Profile_Rule { + if x != nil { + return x.PipelineRun + } + return nil } -func (*RestType) ProtoMessage() {} - -func (x *RestType) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[105] +func (x *Profile) GetTaskRun() []*Profile_Rule { if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms + return x.TaskRun } - return mi.MessageOf(x) + return nil } -// Deprecated: Use RestType.ProtoReflect.Descriptor instead. -func (*RestType) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{105} +func (x *Profile) GetBuild() []*Profile_Rule { + if x != nil { + return x.Build + } + return nil } -func (x *RestType) GetEndpoint() string { +func (x *Profile) GetSelection() []*Profile_Selector { if x != nil { - return x.Endpoint + return x.Selection } - return "" + return nil } -func (x *RestType) GetMethod() string { - if x != nil { - return x.Method +func (x *Profile) GetRemediate() string { + if x != nil && x.Remediate != nil { + return *x.Remediate } return "" } -func (x *RestType) GetHeaders() []string { - if x != nil { - return x.Headers +func (x *Profile) GetAlert() string { + if x != nil && x.Alert != nil { + return *x.Alert } - return nil + return "" } -func (x *RestType) GetBody() string { - if x != nil && x.Body != nil { - return *x.Body +func (x *Profile) GetType() string { + if x != nil { + return x.Type } return "" } -func (x *RestType) GetParse() string { +func (x *Profile) GetVersion() string { if x != nil { - return x.Parse + return x.Version } return "" } -func (x *RestType) GetFallback() []*RestType_Fallback { +func (x *Profile) GetDisplayName() string { if x != nil { - return x.Fallback + return x.DisplayName } - return nil + return "" } -// BuiltinType defines the builtin data evaluation. -type BuiltinType struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type ListProjectsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields - - Method string `protobuf:"bytes,1,opt,name=method,proto3" json:"method,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *BuiltinType) Reset() { - *x = BuiltinType{} - mi := &file_minder_v1_minder_proto_msgTypes[106] +func (x *ListProjectsRequest) Reset() { + *x = ListProjectsRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *BuiltinType) String() string { +func (x *ListProjectsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*BuiltinType) ProtoMessage() {} +func (*ListProjectsRequest) ProtoMessage() {} -func (x *BuiltinType) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[106] +func (x *ListProjectsRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[126] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6993,40 +8096,33 @@ func (x *BuiltinType) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use BuiltinType.ProtoReflect.Descriptor instead. -func (*BuiltinType) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{106} -} - -func (x *BuiltinType) GetMethod() string { - if x != nil { - return x.Method - } - return "" +// Deprecated: Use ListProjectsRequest.ProtoReflect.Descriptor instead. +func (*ListProjectsRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{126} } -// ArtifactType defines the artifact data evaluation. -type ArtifactType struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type ListProjectsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Projects []*Project `protobuf:"bytes,1,rep,name=projects,proto3" json:"projects,omitempty"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *ArtifactType) Reset() { - *x = ArtifactType{} - mi := &file_minder_v1_minder_proto_msgTypes[107] +func (x *ListProjectsResponse) Reset() { + *x = ListProjectsResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ArtifactType) String() string { +func (x *ListProjectsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ArtifactType) ProtoMessage() {} +func (*ListProjectsResponse) ProtoMessage() {} -func (x *ArtifactType) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[107] +func (x *ListProjectsResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[127] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7037,38 +8133,43 @@ func (x *ArtifactType) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ArtifactType.ProtoReflect.Descriptor instead. -func (*ArtifactType) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{107} +// Deprecated: Use ListProjectsResponse.ProtoReflect.Descriptor instead. +func (*ListProjectsResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{127} } -// GitType defines the git data ingester. -type GitType struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *ListProjectsResponse) GetProjects() []*Project { + if x != nil { + return x.Projects + } + return nil +} - // clone_url is the url of the git repository. - CloneUrl string `protobuf:"bytes,1,opt,name=clone_url,json=cloneUrl,proto3" json:"clone_url,omitempty"` - // branch is the branch of the git repository. - Branch string `protobuf:"bytes,2,opt,name=branch,proto3" json:"branch,omitempty"` +type CreateProjectRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the project is created. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + // name is the name of the project to create. + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *GitType) Reset() { - *x = GitType{} - mi := &file_minder_v1_minder_proto_msgTypes[108] +func (x *CreateProjectRequest) Reset() { + *x = CreateProjectRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GitType) String() string { +func (x *CreateProjectRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GitType) ProtoMessage() {} +func (*CreateProjectRequest) ProtoMessage() {} -func (x *GitType) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[108] +func (x *CreateProjectRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[128] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7079,55 +8180,48 @@ func (x *GitType) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GitType.ProtoReflect.Descriptor instead. -func (*GitType) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{108} +// Deprecated: Use CreateProjectRequest.ProtoReflect.Descriptor instead. +func (*CreateProjectRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{128} } -func (x *GitType) GetCloneUrl() string { +func (x *CreateProjectRequest) GetContext() *Context { if x != nil { - return x.CloneUrl + return x.Context } - return "" + return nil } -func (x *GitType) GetBranch() string { +func (x *CreateProjectRequest) GetName() string { if x != nil { - return x.Branch + return x.Name } return "" } -// DiffType defines the diff data ingester. -type DiffType struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type CreateProjectResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // project is the project that was created. + Project *Project `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` unknownFields protoimpl.UnknownFields - - // ecosystems is the list of ecosystems to be used - // for the "dep" diff type. - Ecosystems []*DiffType_Ecosystem `protobuf:"bytes,1,rep,name=ecosystems,proto3" json:"ecosystems,omitempty"` - // type is the type of diff ingestor to use. - // The default is "dep" which will leverage - // the ecosystems array. - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *DiffType) Reset() { - *x = DiffType{} - mi := &file_minder_v1_minder_proto_msgTypes[109] +func (x *CreateProjectResponse) Reset() { + *x = CreateProjectResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *DiffType) String() string { +func (x *CreateProjectResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DiffType) ProtoMessage() {} +func (*CreateProjectResponse) ProtoMessage() {} -func (x *DiffType) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[109] +func (x *CreateProjectResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[129] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7138,50 +8232,86 @@ func (x *DiffType) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DiffType.ProtoReflect.Descriptor instead. -func (*DiffType) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{109} +// Deprecated: Use CreateProjectResponse.ProtoReflect.Descriptor instead. +func (*CreateProjectResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{129} } -func (x *DiffType) GetEcosystems() []*DiffType_Ecosystem { +func (x *CreateProjectResponse) GetProject() *Project { if x != nil { - return x.Ecosystems + return x.Project } return nil } -func (x *DiffType) GetType() string { +type DeleteProjectRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the project is deleted. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteProjectRequest) Reset() { + *x = DeleteProjectRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[130] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteProjectRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteProjectRequest) ProtoMessage() {} + +func (x *DeleteProjectRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[130] if x != nil { - return x.Type + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -// Severity defines the severity of the rule. -type Severity struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +// Deprecated: Use DeleteProjectRequest.ProtoReflect.Descriptor instead. +func (*DeleteProjectRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{130} +} - // value is the severity value. - Value Severity_Value `protobuf:"varint,1,opt,name=value,proto3,enum=minder.v1.Severity_Value" json:"value,omitempty"` +func (x *DeleteProjectRequest) GetContext() *Context { + if x != nil { + return x.Context + } + return nil } -func (x *Severity) Reset() { - *x = Severity{} - mi := &file_minder_v1_minder_proto_msgTypes[110] +type DeleteProjectResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // project_id is the id of the project that was deleted. + ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteProjectResponse) Reset() { + *x = DeleteProjectResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *Severity) String() string { +func (x *DeleteProjectResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Severity) ProtoMessage() {} +func (*DeleteProjectResponse) ProtoMessage() {} -func (x *Severity) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[110] +func (x *DeleteProjectResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[131] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7192,67 +8322,47 @@ func (x *Severity) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Severity.ProtoReflect.Descriptor instead. -func (*Severity) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{110} +// Deprecated: Use DeleteProjectResponse.ProtoReflect.Descriptor instead. +func (*DeleteProjectResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{131} } -func (x *Severity) GetValue() Severity_Value { +func (x *DeleteProjectResponse) GetProjectId() string { if x != nil { - return x.Value + return x.ProjectId } - return Severity_VALUE_UNSPECIFIED + return "" } -// RuleType defines rules that may or may not be user defined. -// The version is assumed from the folder's version. -type RuleType struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type UpdateProjectRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the project is updated. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + // display_name is the display name of the project to update. + // This is optional. + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // description is the description of the project to update. + // This is optional. + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` unknownFields protoimpl.UnknownFields - - // version is the version of the rule type API. - Version string `protobuf:"bytes,11,opt,name=version,proto3" json:"version,omitempty"` - // type is the type of the rule. - Type string `protobuf:"bytes,12,opt,name=type,proto3" json:"type,omitempty"` - // id is the id of the rule type. - // This is mostly optional and is set by the server. - Id *string `protobuf:"bytes,1,opt,name=id,proto3,oneof" json:"id,omitempty"` - // name is the name of the rule type. - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - // display_name is the display name of the rule type. - DisplayName string `protobuf:"bytes,8,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - // short_failure_message is the message to display when the evaluation fails. - ShortFailureMessage string `protobuf:"bytes,10,opt,name=short_failure_message,json=shortFailureMessage,proto3" json:"short_failure_message,omitempty"` - // context is the context in which the rule is evaluated. - Context *Context `protobuf:"bytes,3,opt,name=context,proto3" json:"context,omitempty"` - // def is the definition of the rule type. - Def *RuleType_Definition `protobuf:"bytes,4,opt,name=def,proto3" json:"def,omitempty"` - // description is the description of the rule type. - Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"` - // guidance are instructions we give the user in case a rule fails. - Guidance string `protobuf:"bytes,6,opt,name=guidance,proto3" json:"guidance,omitempty"` - // severity is the severity of the rule type. - Severity *Severity `protobuf:"bytes,7,opt,name=severity,proto3" json:"severity,omitempty"` - // release_phase is the release phase of the rule type, i.e. alpha, beta, ga, deprecated. - ReleasePhase RuleTypeReleasePhase `protobuf:"varint,9,opt,name=release_phase,json=releasePhase,proto3,enum=minder.v1.RuleTypeReleasePhase" json:"release_phase,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *RuleType) Reset() { - *x = RuleType{} - mi := &file_minder_v1_minder_proto_msgTypes[111] +func (x *UpdateProjectRequest) Reset() { + *x = UpdateProjectRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[132] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RuleType) String() string { +func (x *UpdateProjectRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RuleType) ProtoMessage() {} +func (*UpdateProjectRequest) ProtoMessage() {} -func (x *RuleType) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[111] +func (x *UpdateProjectRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[132] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7263,160 +8373,159 @@ func (x *RuleType) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RuleType.ProtoReflect.Descriptor instead. -func (*RuleType) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{111} +// Deprecated: Use UpdateProjectRequest.ProtoReflect.Descriptor instead. +func (*UpdateProjectRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{132} } -func (x *RuleType) GetVersion() string { +func (x *UpdateProjectRequest) GetContext() *Context { if x != nil { - return x.Version + return x.Context } - return "" + return nil } -func (x *RuleType) GetType() string { +func (x *UpdateProjectRequest) GetDisplayName() string { if x != nil { - return x.Type + return x.DisplayName } return "" } -func (x *RuleType) GetId() string { - if x != nil && x.Id != nil { - return *x.Id +func (x *UpdateProjectRequest) GetDescription() string { + if x != nil { + return x.Description } return "" } -func (x *RuleType) GetName() string { - if x != nil { - return x.Name - } - return "" +type UpdateProjectResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // project is the project that was updated. + Project *Project `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *RuleType) GetDisplayName() string { - if x != nil { - return x.DisplayName - } - return "" +func (x *UpdateProjectResponse) Reset() { + *x = UpdateProjectResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[133] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *RuleType) GetShortFailureMessage() string { - if x != nil { - return x.ShortFailureMessage - } - return "" +func (x *UpdateProjectResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *RuleType) GetContext() *Context { +func (*UpdateProjectResponse) ProtoMessage() {} + +func (x *UpdateProjectResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[133] if x != nil { - return x.Context + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *RuleType) GetDef() *RuleType_Definition { +// Deprecated: Use UpdateProjectResponse.ProtoReflect.Descriptor instead. +func (*UpdateProjectResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{133} +} + +func (x *UpdateProjectResponse) GetProject() *Project { if x != nil { - return x.Def + return x.Project } return nil } -func (x *RuleType) GetDescription() string { - if x != nil { - return x.Description - } - return "" +type ProjectPatch struct { + state protoimpl.MessageState `protogen:"open.v1"` + // display_name is the display name of the project to update. + DisplayName *string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3,oneof" json:"display_name,omitempty"` + // description is the description of the project to update. + Description *string `protobuf:"bytes,2,opt,name=description,proto3,oneof" json:"description,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *RuleType) GetGuidance() string { - if x != nil { - return x.Guidance - } - return "" +func (x *ProjectPatch) Reset() { + *x = ProjectPatch{} + mi := &file_minder_v1_minder_proto_msgTypes[134] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *RuleType) GetSeverity() *Severity { - if x != nil { - return x.Severity - } - return nil +func (x *ProjectPatch) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *RuleType) GetReleasePhase() RuleTypeReleasePhase { +func (*ProjectPatch) ProtoMessage() {} + +func (x *ProjectPatch) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[134] if x != nil { - return x.ReleasePhase + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return RuleTypeReleasePhase_RULE_TYPE_RELEASE_PHASE_UNSPECIFIED + return mi.MessageOf(x) } -// Profile defines a profile that is user defined. -type Profile struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +// Deprecated: Use ProjectPatch.ProtoReflect.Descriptor instead. +func (*ProjectPatch) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{134} +} - // context is the context in which the profile is evaluated. - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // id is the id of the profile. - // This is optional and is set by the system. - Id *string `protobuf:"bytes,2,opt,name=id,proto3,oneof" json:"id,omitempty"` - // name is the name of the profile instance. - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - // labels are a set of system-provided attributes which can be used to - // filter profiles and status results. Labels cannot be set by the user, - // but are returned in ListProfiles. - // - // Labels use DNS label constraints, with a possible namespace prefix - // separated by a colon (:). They are intended to allow filtering, but - // not to store arbitrary metadata. - // DNS labels are 1-63 character alphanumeric strings with internal hyphens. - // An RE2-style validation regex would be: - // - // DNS_STR = "[a-zA-Z0-9](?[-a-zA-Z0-9]{0,61}[a-zA-Z0-9])?" - // ($DNS_STR:)?$DNS_STR - Labels []string `protobuf:"bytes,12,rep,name=labels,proto3" json:"labels,omitempty"` - // These are the entities that one could set in the profile. - Repository []*Profile_Rule `protobuf:"bytes,4,rep,name=repository,proto3" json:"repository,omitempty"` - BuildEnvironment []*Profile_Rule `protobuf:"bytes,5,rep,name=build_environment,json=buildEnvironment,proto3" json:"build_environment,omitempty"` - Artifact []*Profile_Rule `protobuf:"bytes,6,rep,name=artifact,proto3" json:"artifact,omitempty"` - PullRequest []*Profile_Rule `protobuf:"bytes,7,rep,name=pull_request,json=pullRequest,proto3" json:"pull_request,omitempty"` - Release []*Profile_Rule `protobuf:"bytes,15,rep,name=release,proto3" json:"release,omitempty"` - PipelineRun []*Profile_Rule `protobuf:"bytes,16,rep,name=pipeline_run,json=pipelineRun,proto3" json:"pipeline_run,omitempty"` - TaskRun []*Profile_Rule `protobuf:"bytes,17,rep,name=task_run,json=taskRun,proto3" json:"task_run,omitempty"` - Build []*Profile_Rule `protobuf:"bytes,18,rep,name=build,proto3" json:"build,omitempty"` - Selection []*Profile_Selector `protobuf:"bytes,14,rep,name=selection,proto3" json:"selection,omitempty"` - // whether and how to remediate (on,off,dry_run) - // this is optional and defaults to "off" - Remediate *string `protobuf:"bytes,8,opt,name=remediate,proto3,oneof" json:"remediate,omitempty"` - // whether and how to alert (on,off,dry_run) - // this is optional and defaults to "on" - Alert *string `protobuf:"bytes,9,opt,name=alert,proto3,oneof" json:"alert,omitempty"` - // type is a placeholder for the object type. It should always be set to "profile". - Type string `protobuf:"bytes,10,opt,name=type,proto3" json:"type,omitempty"` - // version is the version of the profile type. In this case, it is "v1" - Version string `protobuf:"bytes,11,opt,name=version,proto3" json:"version,omitempty"` - // display_name is the display name of the profile. - DisplayName string `protobuf:"bytes,13,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` +func (x *ProjectPatch) GetDisplayName() string { + if x != nil && x.DisplayName != nil { + return *x.DisplayName + } + return "" } -func (x *Profile) Reset() { - *x = Profile{} - mi := &file_minder_v1_minder_proto_msgTypes[112] +func (x *ProjectPatch) GetDescription() string { + if x != nil && x.Description != nil { + return *x.Description + } + return "" +} + +type PatchProjectRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the project is updated. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + // patch is the patch to apply to the project + Patch *ProjectPatch `protobuf:"bytes,3,opt,name=patch,proto3" json:"patch,omitempty"` + // needed to enable PATCH, see https://grpc-ecosystem.github.io/grpc-gateway/docs/mapping/patch_feature/ + // is not exposed to the API user + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PatchProjectRequest) Reset() { + *x = PatchProjectRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[135] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *Profile) String() string { +func (x *PatchProjectRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Profile) ProtoMessage() {} +func (*PatchProjectRequest) ProtoMessage() {} -func (x *Profile) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[112] +func (x *PatchProjectRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[135] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7427,158 +8536,200 @@ func (x *Profile) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Profile.ProtoReflect.Descriptor instead. -func (*Profile) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{112} +// Deprecated: Use PatchProjectRequest.ProtoReflect.Descriptor instead. +func (*PatchProjectRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{135} } -func (x *Profile) GetContext() *Context { +func (x *PatchProjectRequest) GetContext() *Context { if x != nil { return x.Context } return nil } -func (x *Profile) GetId() string { - if x != nil && x.Id != nil { - return *x.Id - } - return "" -} - -func (x *Profile) GetName() string { +func (x *PatchProjectRequest) GetPatch() *ProjectPatch { if x != nil { - return x.Name + return x.Patch } - return "" + return nil } -func (x *Profile) GetLabels() []string { +func (x *PatchProjectRequest) GetUpdateMask() *fieldmaskpb.FieldMask { if x != nil { - return x.Labels + return x.UpdateMask } return nil } -func (x *Profile) GetRepository() []*Profile_Rule { - if x != nil { - return x.Repository - } - return nil +type PatchProjectResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // project is the project that was updated. + Project *Project `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *Profile) GetBuildEnvironment() []*Profile_Rule { - if x != nil { - return x.BuildEnvironment - } - return nil +func (x *PatchProjectResponse) Reset() { + *x = PatchProjectResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[136] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *Profile) GetArtifact() []*Profile_Rule { - if x != nil { - return x.Artifact - } - return nil +func (x *PatchProjectResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *Profile) GetPullRequest() []*Profile_Rule { +func (*PatchProjectResponse) ProtoMessage() {} + +func (x *PatchProjectResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[136] if x != nil { - return x.PullRequest + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *Profile) GetRelease() []*Profile_Rule { - if x != nil { - return x.Release - } - return nil +// Deprecated: Use PatchProjectResponse.ProtoReflect.Descriptor instead. +func (*PatchProjectResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{136} } -func (x *Profile) GetPipelineRun() []*Profile_Rule { +func (x *PatchProjectResponse) GetProject() *Project { if x != nil { - return x.PipelineRun + return x.Project } return nil } -func (x *Profile) GetTaskRun() []*Profile_Rule { +type ListChildProjectsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the child projects are listed. + Context *ContextV2 `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + // recursive is true if child projects should be listed recursively. + Recursive bool `protobuf:"varint,2,opt,name=recursive,proto3" json:"recursive,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListChildProjectsRequest) Reset() { + *x = ListChildProjectsRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[137] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListChildProjectsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListChildProjectsRequest) ProtoMessage() {} + +func (x *ListChildProjectsRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[137] if x != nil { - return x.TaskRun + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *Profile) GetBuild() []*Profile_Rule { +// Deprecated: Use ListChildProjectsRequest.ProtoReflect.Descriptor instead. +func (*ListChildProjectsRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{137} +} + +func (x *ListChildProjectsRequest) GetContext() *ContextV2 { if x != nil { - return x.Build + return x.Context } return nil } -func (x *Profile) GetSelection() []*Profile_Selector { +func (x *ListChildProjectsRequest) GetRecursive() bool { if x != nil { - return x.Selection + return x.Recursive } - return nil + return false } -func (x *Profile) GetRemediate() string { - if x != nil && x.Remediate != nil { - return *x.Remediate - } - return "" +type ListChildProjectsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Projects []*Project `protobuf:"bytes,1,rep,name=projects,proto3" json:"projects,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *Profile) GetAlert() string { - if x != nil && x.Alert != nil { - return *x.Alert - } - return "" +func (x *ListChildProjectsResponse) Reset() { + *x = ListChildProjectsResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[138] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *Profile) GetType() string { - if x != nil { - return x.Type - } - return "" +func (x *ListChildProjectsResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *Profile) GetVersion() string { +func (*ListChildProjectsResponse) ProtoMessage() {} + +func (x *ListChildProjectsResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[138] if x != nil { - return x.Version + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *Profile) GetDisplayName() string { +// Deprecated: Use ListChildProjectsResponse.ProtoReflect.Descriptor instead. +func (*ListChildProjectsResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{138} +} + +func (x *ListChildProjectsResponse) GetProjects() []*Project { if x != nil { - return x.DisplayName + return x.Projects } - return "" + return nil } -type ListProjectsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type CreateEntityReconciliationTaskRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // entity is the entity to be reconciled. + Entity *EntityTypedId `protobuf:"bytes,1,opt,name=entity,proto3" json:"entity,omitempty"` + // context is the context in which the entity reconciliation task is created. + Context *Context `protobuf:"bytes,2,opt,name=context,proto3" json:"context,omitempty"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *ListProjectsRequest) Reset() { - *x = ListProjectsRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[113] +func (x *CreateEntityReconciliationTaskRequest) Reset() { + *x = CreateEntityReconciliationTaskRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListProjectsRequest) String() string { +func (x *CreateEntityReconciliationTaskRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListProjectsRequest) ProtoMessage() {} +func (*CreateEntityReconciliationTaskRequest) ProtoMessage() {} -func (x *ListProjectsRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[113] +func (x *CreateEntityReconciliationTaskRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[139] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7589,34 +8740,46 @@ func (x *ListProjectsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListProjectsRequest.ProtoReflect.Descriptor instead. -func (*ListProjectsRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{113} +// Deprecated: Use CreateEntityReconciliationTaskRequest.ProtoReflect.Descriptor instead. +func (*CreateEntityReconciliationTaskRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{139} } -type ListProjectsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *CreateEntityReconciliationTaskRequest) GetEntity() *EntityTypedId { + if x != nil { + return x.Entity + } + return nil +} + +func (x *CreateEntityReconciliationTaskRequest) GetContext() *Context { + if x != nil { + return x.Context + } + return nil +} - Projects []*Project `protobuf:"bytes,1,rep,name=projects,proto3" json:"projects,omitempty"` +type CreateEntityReconciliationTaskResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *ListProjectsResponse) Reset() { - *x = ListProjectsResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[114] +func (x *CreateEntityReconciliationTaskResponse) Reset() { + *x = CreateEntityReconciliationTaskResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[140] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListProjectsResponse) String() string { +func (x *CreateEntityReconciliationTaskResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListProjectsResponse) ProtoMessage() {} +func (*CreateEntityReconciliationTaskResponse) ProtoMessage() {} -func (x *ListProjectsResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[114] +func (x *CreateEntityReconciliationTaskResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[140] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7626,45 +8789,35 @@ func (x *ListProjectsResponse) ProtoReflect() protoreflect.Message { } return mi.MessageOf(x) } - -// Deprecated: Use ListProjectsResponse.ProtoReflect.Descriptor instead. -func (*ListProjectsResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{114} -} - -func (x *ListProjectsResponse) GetProjects() []*Project { - if x != nil { - return x.Projects - } - return nil + +// Deprecated: Use CreateEntityReconciliationTaskResponse.ProtoReflect.Descriptor instead. +func (*CreateEntityReconciliationTaskResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{140} } -type CreateProjectRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type ListRolesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the roles are evaluated. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` unknownFields protoimpl.UnknownFields - - // context is the context in which the project is created. - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // name is the name of the project to create. - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *CreateProjectRequest) Reset() { - *x = CreateProjectRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[115] +func (x *ListRolesRequest) Reset() { + *x = ListRolesRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[141] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *CreateProjectRequest) String() string { +func (x *ListRolesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateProjectRequest) ProtoMessage() {} +func (*ListRolesRequest) ProtoMessage() {} -func (x *CreateProjectRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[115] +func (x *ListRolesRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[141] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7675,49 +8828,40 @@ func (x *CreateProjectRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateProjectRequest.ProtoReflect.Descriptor instead. -func (*CreateProjectRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{115} +// Deprecated: Use ListRolesRequest.ProtoReflect.Descriptor instead. +func (*ListRolesRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{141} } -func (x *CreateProjectRequest) GetContext() *Context { +func (x *ListRolesRequest) GetContext() *Context { if x != nil { return x.Context } return nil } -func (x *CreateProjectRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -type CreateProjectResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type ListRolesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Roles []*Role `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` unknownFields protoimpl.UnknownFields - - // project is the project that was created. - Project *Project `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *CreateProjectResponse) Reset() { - *x = CreateProjectResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[116] +func (x *ListRolesResponse) Reset() { + *x = ListRolesResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[142] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *CreateProjectResponse) String() string { +func (x *ListRolesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateProjectResponse) ProtoMessage() {} +func (*ListRolesResponse) ProtoMessage() {} -func (x *CreateProjectResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[116] +func (x *ListRolesResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[142] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7728,42 +8872,41 @@ func (x *CreateProjectResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateProjectResponse.ProtoReflect.Descriptor instead. -func (*CreateProjectResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{116} +// Deprecated: Use ListRolesResponse.ProtoReflect.Descriptor instead. +func (*ListRolesResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{142} } -func (x *CreateProjectResponse) GetProject() *Project { +func (x *ListRolesResponse) GetRoles() []*Role { if x != nil { - return x.Project + return x.Roles } return nil } -type DeleteProjectRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type ListRoleAssignmentsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the role assignments are evaluated. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` unknownFields protoimpl.UnknownFields - - // context is the context in which the project is deleted. - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *DeleteProjectRequest) Reset() { - *x = DeleteProjectRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[117] +func (x *ListRoleAssignmentsRequest) Reset() { + *x = ListRoleAssignmentsRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[143] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *DeleteProjectRequest) String() string { +func (x *ListRoleAssignmentsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteProjectRequest) ProtoMessage() {} +func (*ListRoleAssignmentsRequest) ProtoMessage() {} -func (x *DeleteProjectRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[117] +func (x *ListRoleAssignmentsRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[143] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7774,42 +8917,45 @@ func (x *DeleteProjectRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteProjectRequest.ProtoReflect.Descriptor instead. -func (*DeleteProjectRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{117} +// Deprecated: Use ListRoleAssignmentsRequest.ProtoReflect.Descriptor instead. +func (*ListRoleAssignmentsRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{143} } -func (x *DeleteProjectRequest) GetContext() *Context { +func (x *ListRoleAssignmentsRequest) GetContext() *Context { if x != nil { return x.Context } return nil } -type DeleteProjectResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type ListRoleAssignmentsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // role_assignments contains permission grants which have been accepted + // by a user. + RoleAssignments []*RoleAssignment `protobuf:"bytes,1,rep,name=role_assignments,json=roleAssignments,proto3" json:"role_assignments,omitempty"` + // invitations contains outstanding role invitations which have not yet + // been accepted by a user. + Invitations []*Invitation `protobuf:"bytes,2,rep,name=invitations,proto3" json:"invitations,omitempty"` unknownFields protoimpl.UnknownFields - - // project_id is the id of the project that was deleted. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *DeleteProjectResponse) Reset() { - *x = DeleteProjectResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[118] +func (x *ListRoleAssignmentsResponse) Reset() { + *x = ListRoleAssignmentsResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[144] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *DeleteProjectResponse) String() string { +func (x *ListRoleAssignmentsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteProjectResponse) ProtoMessage() {} +func (*ListRoleAssignmentsResponse) ProtoMessage() {} -func (x *DeleteProjectResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[118] +func (x *ListRoleAssignmentsResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[144] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7820,46 +8966,50 @@ func (x *DeleteProjectResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteProjectResponse.ProtoReflect.Descriptor instead. -func (*DeleteProjectResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{118} +// Deprecated: Use ListRoleAssignmentsResponse.ProtoReflect.Descriptor instead. +func (*ListRoleAssignmentsResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{144} } -func (x *DeleteProjectResponse) GetProjectId() string { +func (x *ListRoleAssignmentsResponse) GetRoleAssignments() []*RoleAssignment { if x != nil { - return x.ProjectId + return x.RoleAssignments } - return "" + return nil } -type UpdateProjectRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *ListRoleAssignmentsResponse) GetInvitations() []*Invitation { + if x != nil { + return x.Invitations + } + return nil +} - // context is the context in which the project is updated. +type AssignRoleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the role assignment is evaluated. Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // display_name is the display name of the project to update. - DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - // description is the description of the project to update. - Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // role_assignment is the role assignment to be created. + RoleAssignment *RoleAssignment `protobuf:"bytes,2,opt,name=role_assignment,json=roleAssignment,proto3" json:"role_assignment,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *UpdateProjectRequest) Reset() { - *x = UpdateProjectRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[119] +func (x *AssignRoleRequest) Reset() { + *x = AssignRoleRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[145] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *UpdateProjectRequest) String() string { +func (x *AssignRoleRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateProjectRequest) ProtoMessage() {} +func (*AssignRoleRequest) ProtoMessage() {} -func (x *UpdateProjectRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[119] +func (x *AssignRoleRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[145] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7870,56 +9020,53 @@ func (x *UpdateProjectRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateProjectRequest.ProtoReflect.Descriptor instead. -func (*UpdateProjectRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{119} +// Deprecated: Use AssignRoleRequest.ProtoReflect.Descriptor instead. +func (*AssignRoleRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{145} } -func (x *UpdateProjectRequest) GetContext() *Context { +func (x *AssignRoleRequest) GetContext() *Context { if x != nil { return x.Context } return nil } -func (x *UpdateProjectRequest) GetDisplayName() string { - if x != nil { - return x.DisplayName - } - return "" -} - -func (x *UpdateProjectRequest) GetDescription() string { +func (x *AssignRoleRequest) GetRoleAssignment() *RoleAssignment { if x != nil { - return x.Description + return x.RoleAssignment } - return "" + return nil } -type UpdateProjectResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type AssignRoleResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // role_assignment is the role assignment that was created. + // This is optional. + RoleAssignment *RoleAssignment `protobuf:"bytes,1,opt,name=role_assignment,json=roleAssignment,proto3" json:"role_assignment,omitempty"` + // invitation contains the details of the invitation for the + // assigned user to join the project if the user is not already + // a member. This is optional. + Invitation *Invitation `protobuf:"bytes,2,opt,name=invitation,proto3" json:"invitation,omitempty"` unknownFields protoimpl.UnknownFields - - // project is the project that was updated. - Project *Project `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *UpdateProjectResponse) Reset() { - *x = UpdateProjectResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[120] +func (x *AssignRoleResponse) Reset() { + *x = AssignRoleResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[146] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *UpdateProjectResponse) String() string { +func (x *AssignRoleResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateProjectResponse) ProtoMessage() {} +func (*AssignRoleResponse) ProtoMessage() {} -func (x *UpdateProjectResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[120] +func (x *AssignRoleResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[146] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7930,44 +9077,56 @@ func (x *UpdateProjectResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateProjectResponse.ProtoReflect.Descriptor instead. -func (*UpdateProjectResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{120} +// Deprecated: Use AssignRoleResponse.ProtoReflect.Descriptor instead. +func (*AssignRoleResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{146} } -func (x *UpdateProjectResponse) GetProject() *Project { +func (x *AssignRoleResponse) GetRoleAssignment() *RoleAssignment { if x != nil { - return x.Project + return x.RoleAssignment } return nil } -type ProjectPatch struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *AssignRoleResponse) GetInvitation() *Invitation { + if x != nil { + return x.Invitation + } + return nil +} - // display_name is the display name of the project to update. - DisplayName *string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3,oneof" json:"display_name,omitempty"` - // description is the description of the project to update. - Description *string `protobuf:"bytes,2,opt,name=description,proto3,oneof" json:"description,omitempty"` +type UpdateRoleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the role assignment is evaluated. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + // subject is the account to change permissions for. + // The account must already have permissions on the project + Subject string `protobuf:"bytes,2,opt,name=subject,proto3" json:"subject,omitempty"` + // All subject roles are _replaced_ with the following role assignments. Must be non-empty, + // use RemoveRole to remove permissions entirely from the project. + Roles []string `protobuf:"bytes,4,rep,name=roles,proto3" json:"roles,omitempty"` + // email is the email address of the subject used for updating invitations + Email string `protobuf:"bytes,5,opt,name=email,proto3" json:"email,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *ProjectPatch) Reset() { - *x = ProjectPatch{} - mi := &file_minder_v1_minder_proto_msgTypes[121] +func (x *UpdateRoleRequest) Reset() { + *x = UpdateRoleRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[147] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ProjectPatch) String() string { +func (x *UpdateRoleRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ProjectPatch) ProtoMessage() {} +func (*UpdateRoleRequest) ProtoMessage() {} -func (x *ProjectPatch) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[121] +func (x *UpdateRoleRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[147] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7978,54 +9137,64 @@ func (x *ProjectPatch) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ProjectPatch.ProtoReflect.Descriptor instead. -func (*ProjectPatch) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{121} +// Deprecated: Use UpdateRoleRequest.ProtoReflect.Descriptor instead. +func (*UpdateRoleRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{147} } -func (x *ProjectPatch) GetDisplayName() string { - if x != nil && x.DisplayName != nil { - return *x.DisplayName +func (x *UpdateRoleRequest) GetContext() *Context { + if x != nil { + return x.Context + } + return nil +} + +func (x *UpdateRoleRequest) GetSubject() string { + if x != nil { + return x.Subject } return "" } -func (x *ProjectPatch) GetDescription() string { - if x != nil && x.Description != nil { - return *x.Description +func (x *UpdateRoleRequest) GetRoles() []string { + if x != nil { + return x.Roles + } + return nil +} + +func (x *UpdateRoleRequest) GetEmail() string { + if x != nil { + return x.Email } return "" } -type PatchProjectRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type UpdateRoleResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // role_assignments are the role assignments that were updated. + RoleAssignments []*RoleAssignment `protobuf:"bytes,1,rep,name=role_assignments,json=roleAssignments,proto3" json:"role_assignments,omitempty"` + // invitations contains the details of the invitations that were updated. + Invitations []*Invitation `protobuf:"bytes,2,rep,name=invitations,proto3" json:"invitations,omitempty"` unknownFields protoimpl.UnknownFields - - // context is the context in which the project is updated. - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // patch is the patch to apply to the project - Patch *ProjectPatch `protobuf:"bytes,3,opt,name=patch,proto3" json:"patch,omitempty"` - // needed to enable PATCH, see https://grpc-ecosystem.github.io/grpc-gateway/docs/mapping/patch_feature/ - // is not exposed to the API user - UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *PatchProjectRequest) Reset() { - *x = PatchProjectRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[122] +func (x *UpdateRoleResponse) Reset() { + *x = UpdateRoleResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[148] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *PatchProjectRequest) String() string { +func (x *UpdateRoleResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PatchProjectRequest) ProtoMessage() {} +func (*UpdateRoleResponse) ProtoMessage() {} -func (x *PatchProjectRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[122] +func (x *UpdateRoleResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[148] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8036,56 +9205,50 @@ func (x *PatchProjectRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PatchProjectRequest.ProtoReflect.Descriptor instead. -func (*PatchProjectRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{122} -} - -func (x *PatchProjectRequest) GetContext() *Context { - if x != nil { - return x.Context - } - return nil +// Deprecated: Use UpdateRoleResponse.ProtoReflect.Descriptor instead. +func (*UpdateRoleResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{148} } -func (x *PatchProjectRequest) GetPatch() *ProjectPatch { +func (x *UpdateRoleResponse) GetRoleAssignments() []*RoleAssignment { if x != nil { - return x.Patch + return x.RoleAssignments } return nil } -func (x *PatchProjectRequest) GetUpdateMask() *fieldmaskpb.FieldMask { +func (x *UpdateRoleResponse) GetInvitations() []*Invitation { if x != nil { - return x.UpdateMask + return x.Invitations } return nil } -type PatchProjectResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // project is the project that was updated. - Project *Project `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` +type RemoveRoleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the role assignment is evaluated. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + // role_assignment is the role assignment to be removed. + RoleAssignment *RoleAssignment `protobuf:"bytes,2,opt,name=role_assignment,json=roleAssignment,proto3" json:"role_assignment,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *PatchProjectResponse) Reset() { - *x = PatchProjectResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[123] +func (x *RemoveRoleRequest) Reset() { + *x = RemoveRoleRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[149] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *PatchProjectResponse) String() string { +func (x *RemoveRoleRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PatchProjectResponse) ProtoMessage() {} +func (*RemoveRoleRequest) ProtoMessage() {} -func (x *PatchProjectResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[123] +func (x *RemoveRoleRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[149] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8096,44 +9259,50 @@ func (x *PatchProjectResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PatchProjectResponse.ProtoReflect.Descriptor instead. -func (*PatchProjectResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{123} +// Deprecated: Use RemoveRoleRequest.ProtoReflect.Descriptor instead. +func (*RemoveRoleRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{149} } -func (x *PatchProjectResponse) GetProject() *Project { +func (x *RemoveRoleRequest) GetContext() *Context { if x != nil { - return x.Project + return x.Context } return nil } -type ListChildProjectsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *RemoveRoleRequest) GetRoleAssignment() *RoleAssignment { + if x != nil { + return x.RoleAssignment + } + return nil +} - // context is the context in which the child projects are listed. - Context *ContextV2 `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // recursive is true if child projects should be listed recursively. - Recursive bool `protobuf:"varint,2,opt,name=recursive,proto3" json:"recursive,omitempty"` +type RemoveRoleResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // role_assignment is the role assignment that was removed. + RoleAssignment *RoleAssignment `protobuf:"bytes,1,opt,name=role_assignment,json=roleAssignment,proto3" json:"role_assignment,omitempty"` + // invitation contains the details of the invitation that was removed. + Invitation *Invitation `protobuf:"bytes,2,opt,name=invitation,proto3" json:"invitation,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *ListChildProjectsRequest) Reset() { - *x = ListChildProjectsRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[124] +func (x *RemoveRoleResponse) Reset() { + *x = RemoveRoleResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[150] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListChildProjectsRequest) String() string { +func (x *RemoveRoleResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListChildProjectsRequest) ProtoMessage() {} +func (*RemoveRoleResponse) ProtoMessage() {} -func (x *ListChildProjectsRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[124] +func (x *RemoveRoleResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[150] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8144,48 +9313,52 @@ func (x *ListChildProjectsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListChildProjectsRequest.ProtoReflect.Descriptor instead. -func (*ListChildProjectsRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{124} +// Deprecated: Use RemoveRoleResponse.ProtoReflect.Descriptor instead. +func (*RemoveRoleResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{150} } -func (x *ListChildProjectsRequest) GetContext() *ContextV2 { +func (x *RemoveRoleResponse) GetRoleAssignment() *RoleAssignment { if x != nil { - return x.Context + return x.RoleAssignment } return nil } -func (x *ListChildProjectsRequest) GetRecursive() bool { +func (x *RemoveRoleResponse) GetInvitation() *Invitation { if x != nil { - return x.Recursive + return x.Invitation } - return false + return nil } -type ListChildProjectsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type Role struct { + state protoimpl.MessageState `protogen:"open.v1"` + // name is the name of the role. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // display name of the role + DisplayName string `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // description is the description of the role. + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` unknownFields protoimpl.UnknownFields - - Projects []*Project `protobuf:"bytes,1,rep,name=projects,proto3" json:"projects,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *ListChildProjectsResponse) Reset() { - *x = ListChildProjectsResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[125] +func (x *Role) Reset() { + *x = Role{} + mi := &file_minder_v1_minder_proto_msgTypes[151] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListChildProjectsResponse) String() string { +func (x *Role) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListChildProjectsResponse) ProtoMessage() {} +func (*Role) ProtoMessage() {} -func (x *ListChildProjectsResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[125] +func (x *Role) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[151] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8196,44 +9369,67 @@ func (x *ListChildProjectsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListChildProjectsResponse.ProtoReflect.Descriptor instead. -func (*ListChildProjectsResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{125} +// Deprecated: Use Role.ProtoReflect.Descriptor instead. +func (*Role) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{151} } -func (x *ListChildProjectsResponse) GetProjects() []*Project { +func (x *Role) GetName() string { if x != nil { - return x.Projects + return x.Name } - return nil + return "" } -type CreateEntityReconciliationTaskRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *Role) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} - // entity is the entity to be reconciled. - Entity *EntityTypedId `protobuf:"bytes,1,opt,name=entity,proto3" json:"entity,omitempty"` - // context is the context in which the entity reconciliation task is created. - Context *Context `protobuf:"bytes,2,opt,name=context,proto3" json:"context,omitempty"` +func (x *Role) GetDescription() string { + if x != nil { + return x.Description + } + return "" } -func (x *CreateEntityReconciliationTaskRequest) Reset() { - *x = CreateEntityReconciliationTaskRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[126] +type RoleAssignment struct { + state protoimpl.MessageState `protogen:"open.v1"` + // role is the role that is assigned. + Role string `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` + // subject is the subject to which the role is assigned. + Subject string `protobuf:"bytes,2,opt,name=subject,proto3" json:"subject,omitempty"` + // display_name is the display name of the subject. + DisplayName string `protobuf:"bytes,5,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // project is the project in which the role is assigned. + Project *string `protobuf:"bytes,4,opt,name=project,proto3,oneof" json:"project,omitempty"` + // email is the email address of the subject used for invitations. + Email string `protobuf:"bytes,6,opt,name=email,proto3" json:"email,omitempty"` + // first_name is the first name of the subject. + FirstName string `protobuf:"bytes,7,opt,name=first_name,json=firstName,proto3" json:"first_name,omitempty"` + // last_name is the last name of the subject. + LastName string `protobuf:"bytes,8,opt,name=last_name,json=lastName,proto3" json:"last_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RoleAssignment) Reset() { + *x = RoleAssignment{} + mi := &file_minder_v1_minder_proto_msgTypes[152] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *CreateEntityReconciliationTaskRequest) String() string { +func (x *RoleAssignment) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateEntityReconciliationTaskRequest) ProtoMessage() {} - -func (x *CreateEntityReconciliationTaskRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[126] +func (*RoleAssignment) ProtoMessage() {} + +func (x *RoleAssignment) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[152] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8244,46 +9440,81 @@ func (x *CreateEntityReconciliationTaskRequest) ProtoReflect() protoreflect.Mess return mi.MessageOf(x) } -// Deprecated: Use CreateEntityReconciliationTaskRequest.ProtoReflect.Descriptor instead. -func (*CreateEntityReconciliationTaskRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{126} +// Deprecated: Use RoleAssignment.ProtoReflect.Descriptor instead. +func (*RoleAssignment) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{152} } -func (x *CreateEntityReconciliationTaskRequest) GetEntity() *EntityTypedId { +func (x *RoleAssignment) GetRole() string { if x != nil { - return x.Entity + return x.Role } - return nil + return "" } -func (x *CreateEntityReconciliationTaskRequest) GetContext() *Context { +func (x *RoleAssignment) GetSubject() string { if x != nil { - return x.Context + return x.Subject } - return nil + return "" } -type CreateEntityReconciliationTaskResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +func (x *RoleAssignment) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *RoleAssignment) GetProject() string { + if x != nil && x.Project != nil { + return *x.Project + } + return "" +} + +func (x *RoleAssignment) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *RoleAssignment) GetFirstName() string { + if x != nil { + return x.FirstName + } + return "" +} + +func (x *RoleAssignment) GetLastName() string { + if x != nil { + return x.LastName + } + return "" +} + +type ListInvitationsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *CreateEntityReconciliationTaskResponse) Reset() { - *x = CreateEntityReconciliationTaskResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[127] +func (x *ListInvitationsRequest) Reset() { + *x = ListInvitationsRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[153] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *CreateEntityReconciliationTaskResponse) String() string { +func (x *ListInvitationsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateEntityReconciliationTaskResponse) ProtoMessage() {} +func (*ListInvitationsRequest) ProtoMessage() {} -func (x *CreateEntityReconciliationTaskResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[127] +func (x *ListInvitationsRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[153] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8294,35 +9525,33 @@ func (x *CreateEntityReconciliationTaskResponse) ProtoReflect() protoreflect.Mes return mi.MessageOf(x) } -// Deprecated: Use CreateEntityReconciliationTaskResponse.ProtoReflect.Descriptor instead. -func (*CreateEntityReconciliationTaskResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{127} +// Deprecated: Use ListInvitationsRequest.ProtoReflect.Descriptor instead. +func (*ListInvitationsRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{153} } -type ListRolesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type ListInvitationsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Invitations []*Invitation `protobuf:"bytes,1,rep,name=invitations,proto3" json:"invitations,omitempty"` unknownFields protoimpl.UnknownFields - - // context is the context in which the roles are evaluated. - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *ListRolesRequest) Reset() { - *x = ListRolesRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[128] +func (x *ListInvitationsResponse) Reset() { + *x = ListInvitationsResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[154] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListRolesRequest) String() string { +func (x *ListInvitationsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListRolesRequest) ProtoMessage() {} +func (*ListInvitationsResponse) ProtoMessage() {} -func (x *ListRolesRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[128] +func (x *ListInvitationsResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[154] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8333,41 +9562,43 @@ func (x *ListRolesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListRolesRequest.ProtoReflect.Descriptor instead. -func (*ListRolesRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{128} +// Deprecated: Use ListInvitationsResponse.ProtoReflect.Descriptor instead. +func (*ListInvitationsResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{154} } -func (x *ListRolesRequest) GetContext() *Context { +func (x *ListInvitationsResponse) GetInvitations() []*Invitation { if x != nil { - return x.Context + return x.Invitations } return nil } -type ListRolesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type ResolveInvitationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // code is the code of the invitation to resolve. + Code string `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"` + // accept is true if the invitation is accepted, false if it is rejected. + Accept bool `protobuf:"varint,2,opt,name=accept,proto3" json:"accept,omitempty"` unknownFields protoimpl.UnknownFields - - Roles []*Role `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *ListRolesResponse) Reset() { - *x = ListRolesResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[129] +func (x *ResolveInvitationRequest) Reset() { + *x = ResolveInvitationRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[155] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListRolesResponse) String() string { +func (x *ResolveInvitationRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListRolesResponse) ProtoMessage() {} +func (*ResolveInvitationRequest) ProtoMessage() {} -func (x *ListRolesResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[129] +func (x *ResolveInvitationRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[155] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8378,42 +9609,58 @@ func (x *ListRolesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListRolesResponse.ProtoReflect.Descriptor instead. -func (*ListRolesResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{129} +// Deprecated: Use ResolveInvitationRequest.ProtoReflect.Descriptor instead. +func (*ResolveInvitationRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{155} } -func (x *ListRolesResponse) GetRoles() []*Role { +func (x *ResolveInvitationRequest) GetCode() string { if x != nil { - return x.Roles + return x.Code } - return nil + return "" } -type ListRoleAssignmentsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *ResolveInvitationRequest) GetAccept() bool { + if x != nil { + return x.Accept + } + return false +} - // context is the context in which the role assignments are evaluated. - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` +type ResolveInvitationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // role is the role that would be assigned if the user + // accepts the invitation. + Role string `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` + // email is the email address of the invited user. + Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` + // project is the project to which the user is invited. + Project string `protobuf:"bytes,3,opt,name=project,proto3" json:"project,omitempty"` + // is_accepted is the status of the invitation. + IsAccepted bool `protobuf:"varint,4,opt,name=is_accepted,json=isAccepted,proto3" json:"is_accepted,omitempty"` + // project_display is the display name of the project to which the user + // is invited. + ProjectDisplay string `protobuf:"bytes,5,opt,name=project_display,json=projectDisplay,proto3" json:"project_display,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *ListRoleAssignmentsRequest) Reset() { - *x = ListRoleAssignmentsRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[130] +func (x *ResolveInvitationResponse) Reset() { + *x = ResolveInvitationResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[156] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListRoleAssignmentsRequest) String() string { +func (x *ResolveInvitationResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListRoleAssignmentsRequest) ProtoMessage() {} +func (*ResolveInvitationResponse) ProtoMessage() {} -func (x *ListRoleAssignmentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[130] +func (x *ResolveInvitationResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[156] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8424,46 +9671,101 @@ func (x *ListRoleAssignmentsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListRoleAssignmentsRequest.ProtoReflect.Descriptor instead. -func (*ListRoleAssignmentsRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{130} +// Deprecated: Use ResolveInvitationResponse.ProtoReflect.Descriptor instead. +func (*ResolveInvitationResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{156} } -func (x *ListRoleAssignmentsRequest) GetContext() *Context { +func (x *ResolveInvitationResponse) GetRole() string { if x != nil { - return x.Context + return x.Role } - return nil + return "" } -type ListRoleAssignmentsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +func (x *ResolveInvitationResponse) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *ResolveInvitationResponse) GetProject() string { + if x != nil { + return x.Project + } + return "" +} + +func (x *ResolveInvitationResponse) GetIsAccepted() bool { + if x != nil { + return x.IsAccepted + } + return false +} + +func (x *ResolveInvitationResponse) GetProjectDisplay() string { + if x != nil { + return x.ProjectDisplay + } + return "" +} + +// Invitation is an invitation to join a project. This is only used in responses. +type Invitation struct { + state protoimpl.MessageState `protogen:"open.v1"` + // role is the role that would be assigned if the user + // accepts the invitation. + Role string `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` + // email is the email address of the invited user. This is + // presented as a convenience for display purposes, and does + // not affect who can accept the invitation using the code. + Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` + // project is the project to which the user is invited. + Project string `protobuf:"bytes,3,opt,name=project,proto3" json:"project,omitempty"` + // code is a unique identifier for the invitation, which can + // be used by the recipient to accept or reject the invitation. + // The code is only transmitted in response to AssignRole or + // ListInvitations RPCs, and not transmitted in + // ListRoleAssignments or other calls. + Code string `protobuf:"bytes,4,opt,name=code,proto3" json:"code,omitempty"` + // created_at is the time at which the invitation was created. + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + // expires_at is the time at which the invitation expires. + ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"` + // expired is true if the invitation has expired. + Expired bool `protobuf:"varint,9,opt,name=expired,proto3" json:"expired,omitempty"` + // sponsor is the account (ID) of the user who created the invitation. + Sponsor string `protobuf:"bytes,7,opt,name=sponsor,proto3" json:"sponsor,omitempty"` + // sponsor_display is the display name of the user who created the + // invitation. + SponsorDisplay string `protobuf:"bytes,8,opt,name=sponsor_display,json=sponsorDisplay,proto3" json:"sponsor_display,omitempty"` + // project_display is the display name of the project to which the user + // is invited. + ProjectDisplay string `protobuf:"bytes,10,opt,name=project_display,json=projectDisplay,proto3" json:"project_display,omitempty"` + // inviteURL is the URL that can be used to accept the invitation. + InviteUrl string `protobuf:"bytes,11,opt,name=invite_url,json=inviteUrl,proto3" json:"invite_url,omitempty"` + // emailSkipped is true if the email was not sent to the invitee. + EmailSkipped bool `protobuf:"varint,12,opt,name=email_skipped,json=emailSkipped,proto3" json:"email_skipped,omitempty"` unknownFields protoimpl.UnknownFields - - // role_assignments contains permission grants which have been accepted - // by a user. - RoleAssignments []*RoleAssignment `protobuf:"bytes,1,rep,name=role_assignments,json=roleAssignments,proto3" json:"role_assignments,omitempty"` - // invitations contains outstanding role invitations which have not yet - // been accepted by a user. - Invitations []*Invitation `protobuf:"bytes,2,rep,name=invitations,proto3" json:"invitations,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *ListRoleAssignmentsResponse) Reset() { - *x = ListRoleAssignmentsResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[131] +func (x *Invitation) Reset() { + *x = Invitation{} + mi := &file_minder_v1_minder_proto_msgTypes[157] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListRoleAssignmentsResponse) String() string { +func (x *Invitation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListRoleAssignmentsResponse) ProtoMessage() {} +func (*Invitation) ProtoMessage() {} -func (x *ListRoleAssignmentsResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[131] +func (x *Invitation) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[157] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8474,169 +9776,120 @@ func (x *ListRoleAssignmentsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListRoleAssignmentsResponse.ProtoReflect.Descriptor instead. -func (*ListRoleAssignmentsResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{131} +// Deprecated: Use Invitation.ProtoReflect.Descriptor instead. +func (*Invitation) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{157} } -func (x *ListRoleAssignmentsResponse) GetRoleAssignments() []*RoleAssignment { +func (x *Invitation) GetRole() string { if x != nil { - return x.RoleAssignments + return x.Role } - return nil + return "" } -func (x *ListRoleAssignmentsResponse) GetInvitations() []*Invitation { +func (x *Invitation) GetEmail() string { if x != nil { - return x.Invitations + return x.Email } - return nil -} - -type AssignRoleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // context is the context in which the role assignment is evaluated. - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // role_assignment is the role assignment to be created. - RoleAssignment *RoleAssignment `protobuf:"bytes,2,opt,name=role_assignment,json=roleAssignment,proto3" json:"role_assignment,omitempty"` -} - -func (x *AssignRoleRequest) Reset() { - *x = AssignRoleRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[132] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *AssignRoleRequest) String() string { - return protoimpl.X.MessageStringOf(x) + return "" } -func (*AssignRoleRequest) ProtoMessage() {} - -func (x *AssignRoleRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[132] +func (x *Invitation) GetProject() string { if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms + return x.Project } - return mi.MessageOf(x) + return "" } -// Deprecated: Use AssignRoleRequest.ProtoReflect.Descriptor instead. -func (*AssignRoleRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{132} +func (x *Invitation) GetCode() string { + if x != nil { + return x.Code + } + return "" } -func (x *AssignRoleRequest) GetContext() *Context { +func (x *Invitation) GetCreatedAt() *timestamppb.Timestamp { if x != nil { - return x.Context + return x.CreatedAt } return nil } -func (x *AssignRoleRequest) GetRoleAssignment() *RoleAssignment { +func (x *Invitation) GetExpiresAt() *timestamppb.Timestamp { if x != nil { - return x.RoleAssignment + return x.ExpiresAt } return nil } -type AssignRoleResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // role_assignment is the role assignment that was created. - RoleAssignment *RoleAssignment `protobuf:"bytes,1,opt,name=role_assignment,json=roleAssignment,proto3" json:"role_assignment,omitempty"` - // invitation contains the details of the invitation for the - // assigned user to join the project if the user is not already - // a member. - Invitation *Invitation `protobuf:"bytes,2,opt,name=invitation,proto3" json:"invitation,omitempty"` -} - -func (x *AssignRoleResponse) Reset() { - *x = AssignRoleResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[133] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *Invitation) GetExpired() bool { + if x != nil { + return x.Expired + } + return false } -func (x *AssignRoleResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *Invitation) GetSponsor() string { + if x != nil { + return x.Sponsor + } + return "" } -func (*AssignRoleResponse) ProtoMessage() {} - -func (x *AssignRoleResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[133] +func (x *Invitation) GetSponsorDisplay() string { if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms + return x.SponsorDisplay } - return mi.MessageOf(x) + return "" } -// Deprecated: Use AssignRoleResponse.ProtoReflect.Descriptor instead. -func (*AssignRoleResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{133} +func (x *Invitation) GetProjectDisplay() string { + if x != nil { + return x.ProjectDisplay + } + return "" } -func (x *AssignRoleResponse) GetRoleAssignment() *RoleAssignment { +func (x *Invitation) GetInviteUrl() string { if x != nil { - return x.RoleAssignment + return x.InviteUrl } - return nil + return "" } -func (x *AssignRoleResponse) GetInvitation() *Invitation { +func (x *Invitation) GetEmailSkipped() bool { if x != nil { - return x.Invitation + return x.EmailSkipped } - return nil + return false } -type UpdateRoleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // context is the context in which the role assignment is evaluated. +type GetProviderRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the provider is evaluated. Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // subject is the account to change permissions for. - // The account must already have permissions on the project - Subject string `protobuf:"bytes,2,opt,name=subject,proto3" json:"subject,omitempty"` - // All subject roles are _replaced_ with the following role assignments. Must be non-empty, - // use RemoveRole to remove permissions entirely from the project. - Roles []string `protobuf:"bytes,4,rep,name=roles,proto3" json:"roles,omitempty"` - // email is the email address of the subject used for updating invitations - Email string `protobuf:"bytes,5,opt,name=email,proto3" json:"email,omitempty"` + // name is the name of the provider to get. + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *UpdateRoleRequest) Reset() { - *x = UpdateRoleRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[134] +func (x *GetProviderRequest) Reset() { + *x = GetProviderRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[158] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *UpdateRoleRequest) String() string { +func (x *GetProviderRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateRoleRequest) ProtoMessage() {} +func (*GetProviderRequest) ProtoMessage() {} -func (x *UpdateRoleRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[134] +func (x *GetProviderRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[158] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8647,65 +9900,48 @@ func (x *UpdateRoleRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateRoleRequest.ProtoReflect.Descriptor instead. -func (*UpdateRoleRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{134} +// Deprecated: Use GetProviderRequest.ProtoReflect.Descriptor instead. +func (*GetProviderRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{158} } -func (x *UpdateRoleRequest) GetContext() *Context { +func (x *GetProviderRequest) GetContext() *Context { if x != nil { return x.Context } return nil } -func (x *UpdateRoleRequest) GetSubject() string { - if x != nil { - return x.Subject - } - return "" -} - -func (x *UpdateRoleRequest) GetRoles() []string { - if x != nil { - return x.Roles - } - return nil -} - -func (x *UpdateRoleRequest) GetEmail() string { +func (x *GetProviderRequest) GetName() string { if x != nil { - return x.Email + return x.Name } return "" } -type UpdateRoleResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type GetProviderResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // provider is the provider that was retrieved. + Provider *Provider `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` unknownFields protoimpl.UnknownFields - - // role_assignments are the role assignments that were updated. - RoleAssignments []*RoleAssignment `protobuf:"bytes,1,rep,name=role_assignments,json=roleAssignments,proto3" json:"role_assignments,omitempty"` - // invitations contains the details of the invitations that were updated. - Invitations []*Invitation `protobuf:"bytes,2,rep,name=invitations,proto3" json:"invitations,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *UpdateRoleResponse) Reset() { - *x = UpdateRoleResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[135] +func (x *GetProviderResponse) Reset() { + *x = GetProviderResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[159] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *UpdateRoleResponse) String() string { +func (x *GetProviderResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateRoleResponse) ProtoMessage() {} +func (*GetProviderResponse) ProtoMessage() {} -func (x *UpdateRoleResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[135] +func (x *GetProviderResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[159] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8716,51 +9952,46 @@ func (x *UpdateRoleResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateRoleResponse.ProtoReflect.Descriptor instead. -func (*UpdateRoleResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{135} -} - -func (x *UpdateRoleResponse) GetRoleAssignments() []*RoleAssignment { - if x != nil { - return x.RoleAssignments - } - return nil +// Deprecated: Use GetProviderResponse.ProtoReflect.Descriptor instead. +func (*GetProviderResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{159} } -func (x *UpdateRoleResponse) GetInvitations() []*Invitation { +func (x *GetProviderResponse) GetProvider() *Provider { if x != nil { - return x.Invitations + return x.Provider } return nil } -type RemoveRoleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type ListProvidersRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the providers are evaluated. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + // limit is the maximum number of providers to return. + // 0 uses a server-defined default. + Limit int32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` + // cursor is the cursor to use for the page of results, empty if at the beginning + Cursor string `protobuf:"bytes,3,opt,name=cursor,proto3" json:"cursor,omitempty"` unknownFields protoimpl.UnknownFields - - // context is the context in which the role assignment is evaluated. - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // role_assignment is the role assignment to be removed. - RoleAssignment *RoleAssignment `protobuf:"bytes,2,opt,name=role_assignment,json=roleAssignment,proto3" json:"role_assignment,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *RemoveRoleRequest) Reset() { - *x = RemoveRoleRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[136] +func (x *ListProvidersRequest) Reset() { + *x = ListProvidersRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[160] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RemoveRoleRequest) String() string { +func (x *ListProvidersRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RemoveRoleRequest) ProtoMessage() {} +func (*ListProvidersRequest) ProtoMessage() {} -func (x *RemoveRoleRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[136] +func (x *ListProvidersRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[160] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8771,51 +10002,56 @@ func (x *RemoveRoleRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RemoveRoleRequest.ProtoReflect.Descriptor instead. -func (*RemoveRoleRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{136} +// Deprecated: Use ListProvidersRequest.ProtoReflect.Descriptor instead. +func (*ListProvidersRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{160} } -func (x *RemoveRoleRequest) GetContext() *Context { +func (x *ListProvidersRequest) GetContext() *Context { if x != nil { return x.Context } return nil } -func (x *RemoveRoleRequest) GetRoleAssignment() *RoleAssignment { +func (x *ListProvidersRequest) GetLimit() int32 { if x != nil { - return x.RoleAssignment + return x.Limit } - return nil + return 0 } -type RemoveRoleResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *ListProvidersRequest) GetCursor() string { + if x != nil { + return x.Cursor + } + return "" +} - // role_assignment is the role assignment that was removed. - RoleAssignment *RoleAssignment `protobuf:"bytes,1,opt,name=role_assignment,json=roleAssignment,proto3" json:"role_assignment,omitempty"` - // invitation contains the details of the invitation that was removed. - Invitation *Invitation `protobuf:"bytes,2,opt,name=invitation,proto3" json:"invitation,omitempty"` +type ListProvidersResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Providers []*Provider `protobuf:"bytes,1,rep,name=providers,proto3" json:"providers,omitempty"` + // cursor is the cursor to use for the next page of results, empty if at the end + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *RemoveRoleResponse) Reset() { - *x = RemoveRoleResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[137] +func (x *ListProvidersResponse) Reset() { + *x = ListProvidersResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[161] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RemoveRoleResponse) String() string { +func (x *ListProvidersResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RemoveRoleResponse) ProtoMessage() {} +func (*ListProvidersResponse) ProtoMessage() {} -func (x *RemoveRoleResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[137] +func (x *ListProvidersResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[161] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8826,53 +10062,50 @@ func (x *RemoveRoleResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RemoveRoleResponse.ProtoReflect.Descriptor instead. -func (*RemoveRoleResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{137} +// Deprecated: Use ListProvidersResponse.ProtoReflect.Descriptor instead. +func (*ListProvidersResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{161} } -func (x *RemoveRoleResponse) GetRoleAssignment() *RoleAssignment { +func (x *ListProvidersResponse) GetProviders() []*Provider { if x != nil { - return x.RoleAssignment + return x.Providers } return nil } -func (x *RemoveRoleResponse) GetInvitation() *Invitation { +func (x *ListProvidersResponse) GetCursor() string { if x != nil { - return x.Invitation + return x.Cursor } - return nil + return "" } -type Role struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type CreateProviderRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the provider is created. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + // provider is the provider to be created. + Provider *Provider `protobuf:"bytes,2,opt,name=provider,proto3" json:"provider,omitempty"` unknownFields protoimpl.UnknownFields - - // name is the name of the role. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // display name of the role - DisplayName string `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - // description is the description of the role. - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *Role) Reset() { - *x = Role{} - mi := &file_minder_v1_minder_proto_msgTypes[138] +func (x *CreateProviderRequest) Reset() { + *x = CreateProviderRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[162] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *Role) String() string { +func (x *CreateProviderRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Role) ProtoMessage() {} +func (*CreateProviderRequest) ProtoMessage() {} -func (x *Role) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[138] +func (x *CreateProviderRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[162] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8883,68 +10116,51 @@ func (x *Role) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Role.ProtoReflect.Descriptor instead. -func (*Role) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{138} -} - -func (x *Role) GetName() string { - if x != nil { - return x.Name - } - return "" +// Deprecated: Use CreateProviderRequest.ProtoReflect.Descriptor instead. +func (*CreateProviderRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{162} } -func (x *Role) GetDisplayName() string { +func (x *CreateProviderRequest) GetContext() *Context { if x != nil { - return x.DisplayName + return x.Context } - return "" + return nil } -func (x *Role) GetDescription() string { +func (x *CreateProviderRequest) GetProvider() *Provider { if x != nil { - return x.Description + return x.Provider } - return "" + return nil } -type RoleAssignment struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type CreateProviderResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // provider is the provider that was created. + Provider *Provider `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` + // authorization provides additional authorization information needed + // to complete the initialization of the provider. + Authorization *AuthorizationParams `protobuf:"bytes,2,opt,name=authorization,proto3" json:"authorization,omitempty"` unknownFields protoimpl.UnknownFields - - // role is the role that is assigned. - Role string `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` - // subject is the subject to which the role is assigned. - Subject string `protobuf:"bytes,2,opt,name=subject,proto3" json:"subject,omitempty"` - // display_name is the display name of the subject. - DisplayName string `protobuf:"bytes,5,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - // project is the project in which the role is assigned. - Project *string `protobuf:"bytes,4,opt,name=project,proto3,oneof" json:"project,omitempty"` - // email is the email address of the subject used for invitations. - Email string `protobuf:"bytes,6,opt,name=email,proto3" json:"email,omitempty"` - // first_name is the first name of the subject. - FirstName string `protobuf:"bytes,7,opt,name=first_name,json=firstName,proto3" json:"first_name,omitempty"` - // last_name is the last name of the subject. - LastName string `protobuf:"bytes,8,opt,name=last_name,json=lastName,proto3" json:"last_name,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *RoleAssignment) Reset() { - *x = RoleAssignment{} - mi := &file_minder_v1_minder_proto_msgTypes[139] +func (x *CreateProviderResponse) Reset() { + *x = CreateProviderResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[163] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RoleAssignment) String() string { +func (x *CreateProviderResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RoleAssignment) ProtoMessage() {} +func (*CreateProviderResponse) ProtoMessage() {} -func (x *RoleAssignment) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[139] +func (x *CreateProviderResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[163] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8955,81 +10171,49 @@ func (x *RoleAssignment) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RoleAssignment.ProtoReflect.Descriptor instead. -func (*RoleAssignment) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{139} -} - -func (x *RoleAssignment) GetRole() string { - if x != nil { - return x.Role - } - return "" -} - -func (x *RoleAssignment) GetSubject() string { - if x != nil { - return x.Subject - } - return "" -} - -func (x *RoleAssignment) GetDisplayName() string { - if x != nil { - return x.DisplayName - } - return "" -} - -func (x *RoleAssignment) GetProject() string { - if x != nil && x.Project != nil { - return *x.Project - } - return "" -} - -func (x *RoleAssignment) GetEmail() string { - if x != nil { - return x.Email - } - return "" +// Deprecated: Use CreateProviderResponse.ProtoReflect.Descriptor instead. +func (*CreateProviderResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{163} } -func (x *RoleAssignment) GetFirstName() string { +func (x *CreateProviderResponse) GetProvider() *Provider { if x != nil { - return x.FirstName + return x.Provider } - return "" + return nil } -func (x *RoleAssignment) GetLastName() string { +func (x *CreateProviderResponse) GetAuthorization() *AuthorizationParams { if x != nil { - return x.LastName + return x.Authorization } - return "" + return nil } -type ListInvitationsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type DeleteProviderRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the provider is deleted. Both + // project and provider are required in this context. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *ListInvitationsRequest) Reset() { - *x = ListInvitationsRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[140] +func (x *DeleteProviderRequest) Reset() { + *x = DeleteProviderRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[164] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListInvitationsRequest) String() string { +func (x *DeleteProviderRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListInvitationsRequest) ProtoMessage() {} +func (*DeleteProviderRequest) ProtoMessage() {} -func (x *ListInvitationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[140] +func (x *DeleteProviderRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[164] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9040,34 +10224,41 @@ func (x *ListInvitationsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListInvitationsRequest.ProtoReflect.Descriptor instead. -func (*ListInvitationsRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{140} +// Deprecated: Use DeleteProviderRequest.ProtoReflect.Descriptor instead. +func (*DeleteProviderRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{164} } -type ListInvitationsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *DeleteProviderRequest) GetContext() *Context { + if x != nil { + return x.Context + } + return nil +} - Invitations []*Invitation `protobuf:"bytes,1,rep,name=invitations,proto3" json:"invitations,omitempty"` +type DeleteProviderResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // name is the name of the provider that was deleted + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *ListInvitationsResponse) Reset() { - *x = ListInvitationsResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[141] +func (x *DeleteProviderResponse) Reset() { + *x = DeleteProviderResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[165] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListInvitationsResponse) String() string { +func (x *DeleteProviderResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListInvitationsResponse) ProtoMessage() {} +func (*DeleteProviderResponse) ProtoMessage() {} -func (x *ListInvitationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[141] +func (x *DeleteProviderResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[165] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9078,44 +10269,43 @@ func (x *ListInvitationsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListInvitationsResponse.ProtoReflect.Descriptor instead. -func (*ListInvitationsResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{141} +// Deprecated: Use DeleteProviderResponse.ProtoReflect.Descriptor instead. +func (*DeleteProviderResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{165} } -func (x *ListInvitationsResponse) GetInvitations() []*Invitation { +func (x *DeleteProviderResponse) GetName() string { if x != nil { - return x.Invitations + return x.Name } - return nil + return "" } -type ResolveInvitationRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type DeleteProviderByIDRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the provider is deleted. Only the project is required in this context. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + // id is the id of the provider to delete + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields - - // code is the code of the invitation to resolve. - Code string `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"` - // accept is true if the invitation is accepted, false if it is rejected. - Accept bool `protobuf:"varint,2,opt,name=accept,proto3" json:"accept,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *ResolveInvitationRequest) Reset() { - *x = ResolveInvitationRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[142] +func (x *DeleteProviderByIDRequest) Reset() { + *x = DeleteProviderByIDRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[166] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ResolveInvitationRequest) String() string { +func (x *DeleteProviderByIDRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ResolveInvitationRequest) ProtoMessage() {} +func (*DeleteProviderByIDRequest) ProtoMessage() {} -func (x *ResolveInvitationRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[142] +func (x *DeleteProviderByIDRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[166] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9126,59 +10316,48 @@ func (x *ResolveInvitationRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ResolveInvitationRequest.ProtoReflect.Descriptor instead. -func (*ResolveInvitationRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{142} +// Deprecated: Use DeleteProviderByIDRequest.ProtoReflect.Descriptor instead. +func (*DeleteProviderByIDRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{166} } -func (x *ResolveInvitationRequest) GetCode() string { +func (x *DeleteProviderByIDRequest) GetContext() *Context { if x != nil { - return x.Code + return x.Context } - return "" + return nil } -func (x *ResolveInvitationRequest) GetAccept() bool { +func (x *DeleteProviderByIDRequest) GetId() string { if x != nil { - return x.Accept + return x.Id } - return false + return "" } -type ResolveInvitationResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type DeleteProviderByIDResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // id is the id of the provider that was deleted + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields - - // role is the role that would be assigned if the user - // accepts the invitation. - Role string `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` - // email is the email address of the invited user. - Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` - // project is the project to which the user is invited. - Project string `protobuf:"bytes,3,opt,name=project,proto3" json:"project,omitempty"` - // is_accepted is the status of the invitation. - IsAccepted bool `protobuf:"varint,4,opt,name=is_accepted,json=isAccepted,proto3" json:"is_accepted,omitempty"` - // project_display is the display name of the project to which the user - // is invited. - ProjectDisplay string `protobuf:"bytes,5,opt,name=project_display,json=projectDisplay,proto3" json:"project_display,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *ResolveInvitationResponse) Reset() { - *x = ResolveInvitationResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[143] +func (x *DeleteProviderByIDResponse) Reset() { + *x = DeleteProviderByIDResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[167] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ResolveInvitationResponse) String() string { +func (x *DeleteProviderByIDResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ResolveInvitationResponse) ProtoMessage() {} +func (*DeleteProviderByIDResponse) ProtoMessage() {} -func (x *ResolveInvitationResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[143] +func (x *DeleteProviderByIDResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[167] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9189,101 +10368,86 @@ func (x *ResolveInvitationResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ResolveInvitationResponse.ProtoReflect.Descriptor instead. -func (*ResolveInvitationResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{143} +// Deprecated: Use DeleteProviderByIDResponse.ProtoReflect.Descriptor instead. +func (*DeleteProviderByIDResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{167} } -func (x *ResolveInvitationResponse) GetRole() string { +func (x *DeleteProviderByIDResponse) GetId() string { if x != nil { - return x.Role + return x.Id } return "" } -func (x *ResolveInvitationResponse) GetEmail() string { - if x != nil { - return x.Email - } - return "" +type ListProviderClassesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the provider classes are evaluated. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *ResolveInvitationResponse) GetProject() string { - if x != nil { - return x.Project - } - return "" +func (x *ListProviderClassesRequest) Reset() { + *x = ListProviderClassesRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[168] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *ResolveInvitationResponse) GetIsAccepted() bool { +func (x *ListProviderClassesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListProviderClassesRequest) ProtoMessage() {} + +func (x *ListProviderClassesRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[168] if x != nil { - return x.IsAccepted + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return false + return mi.MessageOf(x) } -func (x *ResolveInvitationResponse) GetProjectDisplay() string { +// Deprecated: Use ListProviderClassesRequest.ProtoReflect.Descriptor instead. +func (*ListProviderClassesRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{168} +} + +func (x *ListProviderClassesRequest) GetContext() *Context { if x != nil { - return x.ProjectDisplay + return x.Context } - return "" + return nil } -type Invitation struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // role is the role that would be assigned if the user - // accepts the invitation. - Role string `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` - // email is the email address of the invited user. This is - // presented as a convenience for display purposes, and does - // not affect who can accept the invitation using the code. - Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` - // project is the project to which the user is invited. - Project string `protobuf:"bytes,3,opt,name=project,proto3" json:"project,omitempty"` - // code is a unique identifier for the invitation, which can - // be used by the recipient to accept or reject the invitation. - // The code is only transmitted in response to AssignRole or - // ListInvitations RPCs, and not transmitted in - // ListRoleAssignments or other calls. - Code string `protobuf:"bytes,4,opt,name=code,proto3" json:"code,omitempty"` - // created_at is the time at which the invitation was created. - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - // expires_at is the time at which the invitation expires. - ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"` - // expired is true if the invitation has expired. - Expired bool `protobuf:"varint,9,opt,name=expired,proto3" json:"expired,omitempty"` - // sponsor is the account (ID) of the user who created the invitation. - Sponsor string `protobuf:"bytes,7,opt,name=sponsor,proto3" json:"sponsor,omitempty"` - // sponsor_display is the display name of the user who created the - // invitation. - SponsorDisplay string `protobuf:"bytes,8,opt,name=sponsor_display,json=sponsorDisplay,proto3" json:"sponsor_display,omitempty"` - // project_display is the display name of the project to which the user - // is invited. - ProjectDisplay string `protobuf:"bytes,10,opt,name=project_display,json=projectDisplay,proto3" json:"project_display,omitempty"` - // inviteURL is the URL that can be used to accept the invitation. - InviteUrl string `protobuf:"bytes,11,opt,name=invite_url,json=inviteUrl,proto3" json:"invite_url,omitempty"` - // emailSkipped is true if the email was not sent to the invitee. - EmailSkipped bool `protobuf:"varint,12,opt,name=email_skipped,json=emailSkipped,proto3" json:"email_skipped,omitempty"` +type ListProviderClassesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // provider_classes is the list of provider classes. + ProviderClasses []string `protobuf:"bytes,1,rep,name=provider_classes,json=providerClasses,proto3" json:"provider_classes,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *Invitation) Reset() { - *x = Invitation{} - mi := &file_minder_v1_minder_proto_msgTypes[144] +func (x *ListProviderClassesResponse) Reset() { + *x = ListProviderClassesResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[169] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *Invitation) String() string { +func (x *ListProviderClassesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Invitation) ProtoMessage() {} +func (*ListProviderClassesResponse) ProtoMessage() {} -func (x *Invitation) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[144] +func (x *ListProviderClassesResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[169] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9294,121 +10458,147 @@ func (x *Invitation) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Invitation.ProtoReflect.Descriptor instead. -func (*Invitation) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{144} +// Deprecated: Use ListProviderClassesResponse.ProtoReflect.Descriptor instead. +func (*ListProviderClassesResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{169} } -func (x *Invitation) GetRole() string { +func (x *ListProviderClassesResponse) GetProviderClasses() []string { if x != nil { - return x.Role + return x.ProviderClasses } - return "" + return nil } -func (x *Invitation) GetEmail() string { +type PatchProviderRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the provider is updated. + // The provider name is required in this context. + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + Patch *Provider `protobuf:"bytes,2,opt,name=patch,proto3" json:"patch,omitempty"` + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,3,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PatchProviderRequest) Reset() { + *x = PatchProviderRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[170] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PatchProviderRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PatchProviderRequest) ProtoMessage() {} + +func (x *PatchProviderRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[170] if x != nil { - return x.Email + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *Invitation) GetProject() string { - if x != nil { - return x.Project - } - return "" +// Deprecated: Use PatchProviderRequest.ProtoReflect.Descriptor instead. +func (*PatchProviderRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{170} } -func (x *Invitation) GetCode() string { +func (x *PatchProviderRequest) GetContext() *Context { if x != nil { - return x.Code + return x.Context } - return "" + return nil } -func (x *Invitation) GetCreatedAt() *timestamppb.Timestamp { +func (x *PatchProviderRequest) GetPatch() *Provider { if x != nil { - return x.CreatedAt + return x.Patch } return nil } -func (x *Invitation) GetExpiresAt() *timestamppb.Timestamp { +func (x *PatchProviderRequest) GetUpdateMask() *fieldmaskpb.FieldMask { if x != nil { - return x.ExpiresAt + return x.UpdateMask } return nil } -func (x *Invitation) GetExpired() bool { - if x != nil { - return x.Expired - } - return false +type PatchProviderResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Provider *Provider `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *Invitation) GetSponsor() string { - if x != nil { - return x.Sponsor - } - return "" +func (x *PatchProviderResponse) Reset() { + *x = PatchProviderResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[171] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *Invitation) GetSponsorDisplay() string { - if x != nil { - return x.SponsorDisplay - } - return "" +func (x *PatchProviderResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *Invitation) GetProjectDisplay() string { +func (*PatchProviderResponse) ProtoMessage() {} + +func (x *PatchProviderResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[171] if x != nil { - return x.ProjectDisplay + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *Invitation) GetInviteUrl() string { - if x != nil { - return x.InviteUrl - } - return "" +// Deprecated: Use PatchProviderResponse.ProtoReflect.Descriptor instead. +func (*PatchProviderResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{171} } -func (x *Invitation) GetEmailSkipped() bool { +func (x *PatchProviderResponse) GetProvider() *Provider { if x != nil { - return x.EmailSkipped + return x.Provider } - return false + return nil } -type GetProviderRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // context is the context in which the provider is evaluated. - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // name is the name of the provider to get. - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` +type AuthorizationParams struct { + state protoimpl.MessageState `protogen:"open.v1"` + // authorization_url is an external URL to use to authorize the provider. + AuthorizationUrl string `protobuf:"bytes,1,opt,name=authorization_url,json=authorizationUrl,proto3" json:"authorization_url,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *GetProviderRequest) Reset() { - *x = GetProviderRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[145] +func (x *AuthorizationParams) Reset() { + *x = AuthorizationParams{} + mi := &file_minder_v1_minder_proto_msgTypes[172] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GetProviderRequest) String() string { +func (x *AuthorizationParams) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetProviderRequest) ProtoMessage() {} +func (*AuthorizationParams) ProtoMessage() {} -func (x *GetProviderRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[145] +func (x *AuthorizationParams) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[172] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9419,49 +10609,43 @@ func (x *GetProviderRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetProviderRequest.ProtoReflect.Descriptor instead. -func (*GetProviderRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{145} -} - -func (x *GetProviderRequest) GetContext() *Context { - if x != nil { - return x.Context - } - return nil +// Deprecated: Use AuthorizationParams.ProtoReflect.Descriptor instead. +func (*AuthorizationParams) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{172} } -func (x *GetProviderRequest) GetName() string { +func (x *AuthorizationParams) GetAuthorizationUrl() string { if x != nil { - return x.Name + return x.AuthorizationUrl } return "" } -type GetProviderResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type ProviderParameter struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Parameters: + // + // *ProviderParameter_GithubApp + Parameters isProviderParameter_Parameters `protobuf_oneof:"parameters"` unknownFields protoimpl.UnknownFields - - // provider is the provider that was retrieved. - Provider *Provider `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *GetProviderResponse) Reset() { - *x = GetProviderResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[146] +func (x *ProviderParameter) Reset() { + *x = ProviderParameter{} + mi := &file_minder_v1_minder_proto_msgTypes[173] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GetProviderResponse) String() string { +func (x *ProviderParameter) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetProviderResponse) ProtoMessage() {} +func (*ProviderParameter) ProtoMessage() {} -func (x *GetProviderResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[146] +func (x *ProviderParameter) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[173] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9472,46 +10656,70 @@ func (x *GetProviderResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetProviderResponse.ProtoReflect.Descriptor instead. -func (*GetProviderResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{146} +// Deprecated: Use ProviderParameter.ProtoReflect.Descriptor instead. +func (*ProviderParameter) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{173} } -func (x *GetProviderResponse) GetProvider() *Provider { +func (x *ProviderParameter) GetParameters() isProviderParameter_Parameters { if x != nil { - return x.Provider + return x.Parameters } return nil } -type ListProvidersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *ProviderParameter) GetGithubApp() *GitHubAppParams { + if x != nil { + if x, ok := x.Parameters.(*ProviderParameter_GithubApp); ok { + return x.GithubApp + } + } + return nil +} - // context is the context in which the providers are evaluated. - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // limit is the maximum number of providers to return. - Limit int32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` - // cursor is the cursor to use for the page of results, empty if at the beginning - Cursor string `protobuf:"bytes,3,opt,name=cursor,proto3" json:"cursor,omitempty"` +type isProviderParameter_Parameters interface { + isProviderParameter_Parameters() } -func (x *ListProvidersRequest) Reset() { - *x = ListProvidersRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[147] +type ProviderParameter_GithubApp struct { + GithubApp *GitHubAppParams `protobuf:"bytes,1,opt,name=github_app,json=githubApp,proto3,oneof"` +} + +func (*ProviderParameter_GithubApp) isProviderParameter_Parameters() {} + +// GitHubAppParams is the parameters for a GitHub App provider. +type GitHubAppParams struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The GitHub installation ID for the app. On create, this is the only + // parameter used; the organization parameters are ignored. + InstallationId int64 `protobuf:"varint,1,opt,name=installation_id,json=installationId,proto3" json:"installation_id,omitempty"` + // The GitHub organization slug where the app is installed. This is an + // output-only parameter, and is validated on input if set (i.e. the value + // must be either empty or match the org of the installation_id). + Organization string `protobuf:"bytes,2,opt,name=organization,proto3" json:"organization,omitempty"` + // The GitHub organization ID where the app is installed. This is an + // output-only parameter, and is validated on input if set (i.e. the value + // must be either empty or match the org of the installation_id). + OrganizationId int64 `protobuf:"varint,3,opt,name=organization_id,json=organizationId,proto3" json:"organization_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GitHubAppParams) Reset() { + *x = GitHubAppParams{} + mi := &file_minder_v1_minder_proto_msgTypes[174] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListProvidersRequest) String() string { +func (x *GitHubAppParams) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListProvidersRequest) ProtoMessage() {} +func (*GitHubAppParams) ProtoMessage() {} -func (x *ListProvidersRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[147] +func (x *GitHubAppParams) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[174] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9522,57 +10730,78 @@ func (x *ListProvidersRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListProvidersRequest.ProtoReflect.Descriptor instead. -func (*ListProvidersRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{147} +// Deprecated: Use GitHubAppParams.ProtoReflect.Descriptor instead. +func (*GitHubAppParams) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{174} } -func (x *ListProvidersRequest) GetContext() *Context { +func (x *GitHubAppParams) GetInstallationId() int64 { if x != nil { - return x.Context + return x.InstallationId } - return nil + return 0 } -func (x *ListProvidersRequest) GetLimit() int32 { +func (x *GitHubAppParams) GetOrganization() string { if x != nil { - return x.Limit + return x.Organization } - return 0 + return "" } -func (x *ListProvidersRequest) GetCursor() string { +func (x *GitHubAppParams) GetOrganizationId() int64 { if x != nil { - return x.Cursor + return x.OrganizationId } - return "" + return 0 } -type ListProvidersResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// Provider represents a provider that is used to interact with external systems. +// All fields are optional because we want to allow partial updates. +type Provider struct { + state protoimpl.MessageState `protogen:"open.v1"` + // name is the name of the provider. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // class is the name of the provider implementation, eg. 'github' or 'gh-app'. + Class string `protobuf:"bytes,7,opt,name=class,proto3" json:"class,omitempty"` + // project is the project where the provider is. This is ignored on input + // in favor of the context field in CreateProviderRequest. + Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"` + // version is the version of the provider. + // if unset, "v1" is assumed. + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` + // implements is the list of interfaces that the provider implements. + Implements []ProviderType `protobuf:"varint,4,rep,packed,name=implements,proto3,enum=minder.v1.ProviderType" json:"implements,omitempty"` + // config is the configuration of the provider. + Config *structpb.Struct `protobuf:"bytes,5,opt,name=config,proto3" json:"config,omitempty"` + // auth_flows is the list of authorization flows that the provider supports. + AuthFlows []AuthorizationFlow `protobuf:"varint,6,rep,packed,name=auth_flows,json=authFlows,proto3,enum=minder.v1.AuthorizationFlow" json:"auth_flows,omitempty"` + // parameters is the list of parameters that the provider requires. + Parameters *ProviderParameter `protobuf:"bytes,8,opt,name=parameters,proto3" json:"parameters,omitempty"` + // credentials_state is the state of the credentials for the provider. + // This is an output-only field. It may be: "set", "unset", "not_applicable". + CredentialsState string `protobuf:"bytes,9,opt,name=credentials_state,json=credentialsState,proto3" json:"credentials_state,omitempty"` + // id is the unique identifier of the provider. + Id string `protobuf:"bytes,10,opt,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields - - Providers []*Provider `protobuf:"bytes,1,rep,name=providers,proto3" json:"providers,omitempty"` - // cursor is the cursor to use for the next page of results, empty if at the end - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *ListProvidersResponse) Reset() { - *x = ListProvidersResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[148] +func (x *Provider) Reset() { + *x = Provider{} + mi := &file_minder_v1_minder_proto_msgTypes[175] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListProvidersResponse) String() string { +func (x *Provider) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListProvidersResponse) ProtoMessage() {} +func (*Provider) ProtoMessage() {} -func (x *ListProvidersResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[148] +func (x *Provider) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[175] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9583,161 +10812,105 @@ func (x *ListProvidersResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListProvidersResponse.ProtoReflect.Descriptor instead. -func (*ListProvidersResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{148} +// Deprecated: Use Provider.ProtoReflect.Descriptor instead. +func (*Provider) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{175} } -func (x *ListProvidersResponse) GetProviders() []*Provider { +func (x *Provider) GetName() string { if x != nil { - return x.Providers + return x.Name } - return nil + return "" } -func (x *ListProvidersResponse) GetCursor() string { +func (x *Provider) GetClass() string { if x != nil { - return x.Cursor + return x.Class } return "" } -type CreateProviderRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // context is the context in which the provider is created. - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // provider is the provider to be created. - Provider *Provider `protobuf:"bytes,2,opt,name=provider,proto3" json:"provider,omitempty"` -} - -func (x *CreateProviderRequest) Reset() { - *x = CreateProviderRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[149] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *CreateProviderRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CreateProviderRequest) ProtoMessage() {} - -func (x *CreateProviderRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[149] +func (x *Provider) GetProject() string { if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms + return x.Project } - return mi.MessageOf(x) + return "" } -// Deprecated: Use CreateProviderRequest.ProtoReflect.Descriptor instead. -func (*CreateProviderRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{149} +func (x *Provider) GetVersion() string { + if x != nil { + return x.Version + } + return "" } -func (x *CreateProviderRequest) GetContext() *Context { +func (x *Provider) GetImplements() []ProviderType { if x != nil { - return x.Context + return x.Implements } return nil } -func (x *CreateProviderRequest) GetProvider() *Provider { +func (x *Provider) GetConfig() *structpb.Struct { if x != nil { - return x.Provider + return x.Config } return nil } -type CreateProviderResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // provider is the provider that was created. - Provider *Provider `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` - // authorization provides additional authorization information needed - // to complete the initialization of the provider. - Authorization *AuthorizationParams `protobuf:"bytes,2,opt,name=authorization,proto3" json:"authorization,omitempty"` -} - -func (x *CreateProviderResponse) Reset() { - *x = CreateProviderResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[150] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *CreateProviderResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CreateProviderResponse) ProtoMessage() {} - -func (x *CreateProviderResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[150] +func (x *Provider) GetAuthFlows() []AuthorizationFlow { if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms + return x.AuthFlows } - return mi.MessageOf(x) + return nil } -// Deprecated: Use CreateProviderResponse.ProtoReflect.Descriptor instead. -func (*CreateProviderResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{150} +func (x *Provider) GetParameters() *ProviderParameter { + if x != nil { + return x.Parameters + } + return nil } -func (x *CreateProviderResponse) GetProvider() *Provider { +func (x *Provider) GetCredentialsState() string { if x != nil { - return x.Provider + return x.CredentialsState } - return nil + return "" } -func (x *CreateProviderResponse) GetAuthorization() *AuthorizationParams { +func (x *Provider) GetId() string { if x != nil { - return x.Authorization + return x.Id } - return nil + return "" } -type DeleteProviderRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// GetEvaluationHistoryRequest represents a request for the GetEvaluationHistory endpoint +type GetEvaluationHistoryRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Context *Context `protobuf:"bytes,2,opt,name=context,proto3" json:"context,omitempty"` unknownFields protoimpl.UnknownFields - - // context is the context in which the provider is deleted. Both - // project and provider are required in this context. - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *DeleteProviderRequest) Reset() { - *x = DeleteProviderRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[151] +func (x *GetEvaluationHistoryRequest) Reset() { + *x = GetEvaluationHistoryRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[176] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *DeleteProviderRequest) String() string { +func (x *GetEvaluationHistoryRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteProviderRequest) ProtoMessage() {} +func (*GetEvaluationHistoryRequest) ProtoMessage() {} -func (x *DeleteProviderRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[151] +func (x *GetEvaluationHistoryRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[176] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9748,42 +10921,76 @@ func (x *DeleteProviderRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteProviderRequest.ProtoReflect.Descriptor instead. -func (*DeleteProviderRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{151} +// Deprecated: Use GetEvaluationHistoryRequest.ProtoReflect.Descriptor instead. +func (*GetEvaluationHistoryRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{176} } -func (x *DeleteProviderRequest) GetContext() *Context { +func (x *GetEvaluationHistoryRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *GetEvaluationHistoryRequest) GetContext() *Context { if x != nil { return x.Context } return nil } -type DeleteProviderResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// ListEvaluationHistoryRequest represents a request message for the +// ListEvaluationHistory RPC. +// +// Most of its fields are used for filtering, except for `cursor` +// which is used for pagination. +type ListEvaluationHistoryRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + // List of entity types to retrieve. + EntityType []string `protobuf:"bytes,2,rep,name=entity_type,json=entityType,proto3" json:"entity_type,omitempty"` + // List of entity names to retrieve. + EntityName []string `protobuf:"bytes,3,rep,name=entity_name,json=entityName,proto3" json:"entity_name,omitempty"` + // List of profile names to retrieve. + ProfileName []string `protobuf:"bytes,4,rep,name=profile_name,json=profileName,proto3" json:"profile_name,omitempty"` + // List of evaluation statuses to retrieve. + Status []string `protobuf:"bytes,5,rep,name=status,proto3" json:"status,omitempty"` + // List of remediation statuses to retrieve. + Remediation []string `protobuf:"bytes,6,rep,name=remediation,proto3" json:"remediation,omitempty"` + // List of alert statuses to retrieve. + Alert []string `protobuf:"bytes,7,rep,name=alert,proto3" json:"alert,omitempty"` + // Timestamp representing the start time of the selection window. + From *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=from,proto3" json:"from,omitempty"` + // Timestamp representing the end time of the selection window. + To *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=to,proto3" json:"to,omitempty"` + // Filter evaluation history to only those matching the specified labels. + // + // The default is to return all user-created profiles; the string "*" can + // be used to select all profiles, including system profiles. This syntax + // may be expanded in the future. + LabelFilter []string `protobuf:"bytes,11,rep,name=label_filter,json=labelFilter,proto3" json:"label_filter,omitempty"` + // Cursor object to select the "page" of data to retrieve. This is optional. + Cursor *Cursor `protobuf:"bytes,10,opt,name=cursor,proto3" json:"cursor,omitempty"` unknownFields protoimpl.UnknownFields - - // name is the name of the provider that was deleted - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *DeleteProviderResponse) Reset() { - *x = DeleteProviderResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[152] +func (x *ListEvaluationHistoryRequest) Reset() { + *x = ListEvaluationHistoryRequest{} + mi := &file_minder_v1_minder_proto_msgTypes[177] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *DeleteProviderResponse) String() string { +func (x *ListEvaluationHistoryRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteProviderResponse) ProtoMessage() {} +func (*ListEvaluationHistoryRequest) ProtoMessage() {} -func (x *DeleteProviderResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[152] +func (x *ListEvaluationHistoryRequest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[177] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9794,143 +11001,113 @@ func (x *DeleteProviderResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteProviderResponse.ProtoReflect.Descriptor instead. -func (*DeleteProviderResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{152} +// Deprecated: Use ListEvaluationHistoryRequest.ProtoReflect.Descriptor instead. +func (*ListEvaluationHistoryRequest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{177} } -func (x *DeleteProviderResponse) GetName() string { +func (x *ListEvaluationHistoryRequest) GetContext() *Context { if x != nil { - return x.Name + return x.Context } - return "" -} - -type DeleteProviderByIDRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // context is the context in which the provider is deleted. Only the project is required in this context. - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // id is the id of the provider to delete - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` -} - -func (x *DeleteProviderByIDRequest) Reset() { - *x = DeleteProviderByIDRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[153] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *DeleteProviderByIDRequest) String() string { - return protoimpl.X.MessageStringOf(x) + return nil } -func (*DeleteProviderByIDRequest) ProtoMessage() {} - -func (x *DeleteProviderByIDRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[153] +func (x *ListEvaluationHistoryRequest) GetEntityType() []string { if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms + return x.EntityType } - return mi.MessageOf(x) + return nil } -// Deprecated: Use DeleteProviderByIDRequest.ProtoReflect.Descriptor instead. -func (*DeleteProviderByIDRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{153} +func (x *ListEvaluationHistoryRequest) GetEntityName() []string { + if x != nil { + return x.EntityName + } + return nil } -func (x *DeleteProviderByIDRequest) GetContext() *Context { +func (x *ListEvaluationHistoryRequest) GetProfileName() []string { if x != nil { - return x.Context + return x.ProfileName } return nil } -func (x *DeleteProviderByIDRequest) GetId() string { +func (x *ListEvaluationHistoryRequest) GetStatus() []string { if x != nil { - return x.Id + return x.Status } - return "" + return nil } -type DeleteProviderByIDResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // id is the id of the provider that was deleted - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +func (x *ListEvaluationHistoryRequest) GetRemediation() []string { + if x != nil { + return x.Remediation + } + return nil } -func (x *DeleteProviderByIDResponse) Reset() { - *x = DeleteProviderByIDResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[154] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *ListEvaluationHistoryRequest) GetAlert() []string { + if x != nil { + return x.Alert + } + return nil } -func (x *DeleteProviderByIDResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *ListEvaluationHistoryRequest) GetFrom() *timestamppb.Timestamp { + if x != nil { + return x.From + } + return nil } -func (*DeleteProviderByIDResponse) ProtoMessage() {} - -func (x *DeleteProviderByIDResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[154] +func (x *ListEvaluationHistoryRequest) GetTo() *timestamppb.Timestamp { if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms + return x.To } - return mi.MessageOf(x) + return nil } -// Deprecated: Use DeleteProviderByIDResponse.ProtoReflect.Descriptor instead. -func (*DeleteProviderByIDResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{154} +func (x *ListEvaluationHistoryRequest) GetLabelFilter() []string { + if x != nil { + return x.LabelFilter + } + return nil } -func (x *DeleteProviderByIDResponse) GetId() string { +func (x *ListEvaluationHistoryRequest) GetCursor() *Cursor { if x != nil { - return x.Id + return x.Cursor } - return "" + return nil } -type GetUnclaimedProvidersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// GetEvaluationHistoryResponse represents a response message for the +// GetEvaluationHistory RPC. +type GetEvaluationHistoryResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The requested record + Evaluation *EvaluationHistory `protobuf:"bytes,1,opt,name=evaluation,proto3" json:"evaluation,omitempty"` unknownFields protoimpl.UnknownFields - - // context is the context in which the set of providers are evaluated. - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *GetUnclaimedProvidersRequest) Reset() { - *x = GetUnclaimedProvidersRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[155] +func (x *GetEvaluationHistoryResponse) Reset() { + *x = GetEvaluationHistoryResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[178] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GetUnclaimedProvidersRequest) String() string { +func (x *GetEvaluationHistoryResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetUnclaimedProvidersRequest) ProtoMessage() {} +func (*GetEvaluationHistoryResponse) ProtoMessage() {} -func (x *GetUnclaimedProvidersRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[155] +func (x *GetEvaluationHistoryResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[178] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9941,44 +11118,49 @@ func (x *GetUnclaimedProvidersRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetUnclaimedProvidersRequest.ProtoReflect.Descriptor instead. -func (*GetUnclaimedProvidersRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{155} +// Deprecated: Use GetEvaluationHistoryResponse.ProtoReflect.Descriptor instead. +func (*GetEvaluationHistoryResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{178} } -func (x *GetUnclaimedProvidersRequest) GetContext() *Context { +func (x *GetEvaluationHistoryResponse) GetEvaluation() *EvaluationHistory { if x != nil { - return x.Context + return x.Evaluation } return nil } -type GetUnclaimedProvidersResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// ListEvaluationHistoryResponse represents a response message for the +// ListEvaluationHistory RPC. +// +// It ships a collection of records retrieved and pointers to get to +// the next and/or previous pages of data. +type ListEvaluationHistoryResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // List of records retrieved. + Data []*EvaluationHistory `protobuf:"bytes,1,rep,name=data,proto3" json:"data,omitempty"` + // Metadata of the current page and pointers to next and/or + // previous pages. + Page *CursorPage `protobuf:"bytes,2,opt,name=page,proto3" json:"page,omitempty"` unknownFields protoimpl.UnknownFields - - // providers is a set of parameters which can be supplied to allow the user - // to assign existing unclaimed credentials to a new provider in the project - // via CreateProvider(). - Providers []*ProviderParameter `protobuf:"bytes,1,rep,name=providers,proto3" json:"providers,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *GetUnclaimedProvidersResponse) Reset() { - *x = GetUnclaimedProvidersResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[156] +func (x *ListEvaluationHistoryResponse) Reset() { + *x = ListEvaluationHistoryResponse{} + mi := &file_minder_v1_minder_proto_msgTypes[179] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GetUnclaimedProvidersResponse) String() string { +func (x *ListEvaluationHistoryResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetUnclaimedProvidersResponse) ProtoMessage() {} +func (*ListEvaluationHistoryResponse) ProtoMessage() {} -func (x *GetUnclaimedProvidersResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[156] +func (x *ListEvaluationHistoryResponse) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[179] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9989,42 +11171,64 @@ func (x *GetUnclaimedProvidersResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetUnclaimedProvidersResponse.ProtoReflect.Descriptor instead. -func (*GetUnclaimedProvidersResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{156} +// Deprecated: Use ListEvaluationHistoryResponse.ProtoReflect.Descriptor instead. +func (*ListEvaluationHistoryResponse) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{179} } -func (x *GetUnclaimedProvidersResponse) GetProviders() []*ProviderParameter { +func (x *ListEvaluationHistoryResponse) GetData() []*EvaluationHistory { if x != nil { - return x.Providers + return x.Data } return nil } -type ListProviderClassesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *ListEvaluationHistoryResponse) GetPage() *CursorPage { + if x != nil { + return x.Page + } + return nil +} - // context is the context in which the provider classes are evaluated. - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` +// EvaluationHistory represents the history of an entity evaluation. +// This is only used in responses. +type EvaluationHistory struct { + state protoimpl.MessageState `protogen:"open.v1"` + // entity contains details of the entity which was evaluated. + Entity *EvaluationHistoryEntity `protobuf:"bytes,1,opt,name=entity,proto3" json:"entity,omitempty"` + // rule contains details of the rule which the entity was evaluated against. + Rule *EvaluationHistoryRule `protobuf:"bytes,2,opt,name=rule,proto3" json:"rule,omitempty"` + // status contains the evaluation status. + Status *EvaluationHistoryStatus `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + // alert contains details of the alerts for this evaluation. + // This is optional. + Alert *EvaluationHistoryAlert `protobuf:"bytes,4,opt,name=alert,proto3" json:"alert,omitempty"` + // remediation contains details of the remediation for this evaluation. + // This is optional. + Remediation *EvaluationHistoryRemediation `protobuf:"bytes,5,opt,name=remediation,proto3" json:"remediation,omitempty"` + // created_at is the timestamp of creation of this evaluation + EvaluatedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=evaluated_at,json=evaluatedAt,proto3" json:"evaluated_at,omitempty"` + // id is the unique identifier of the evaluation. + Id string `protobuf:"bytes,7,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *ListProviderClassesRequest) Reset() { - *x = ListProviderClassesRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[157] +func (x *EvaluationHistory) Reset() { + *x = EvaluationHistory{} + mi := &file_minder_v1_minder_proto_msgTypes[180] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListProviderClassesRequest) String() string { +func (x *EvaluationHistory) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListProviderClassesRequest) ProtoMessage() {} +func (*EvaluationHistory) ProtoMessage() {} -func (x *ListProviderClassesRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[157] +func (x *EvaluationHistory) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[180] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10035,89 +11239,87 @@ func (x *ListProviderClassesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListProviderClassesRequest.ProtoReflect.Descriptor instead. -func (*ListProviderClassesRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{157} +// Deprecated: Use EvaluationHistory.ProtoReflect.Descriptor instead. +func (*EvaluationHistory) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{180} } -func (x *ListProviderClassesRequest) GetContext() *Context { +func (x *EvaluationHistory) GetEntity() *EvaluationHistoryEntity { if x != nil { - return x.Context + return x.Entity } return nil } -type ListProviderClassesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // provider_classes is the list of provider classes. - ProviderClasses []string `protobuf:"bytes,1,rep,name=provider_classes,json=providerClasses,proto3" json:"provider_classes,omitempty"` +func (x *EvaluationHistory) GetRule() *EvaluationHistoryRule { + if x != nil { + return x.Rule + } + return nil } -func (x *ListProviderClassesResponse) Reset() { - *x = ListProviderClassesResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[158] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *EvaluationHistory) GetStatus() *EvaluationHistoryStatus { + if x != nil { + return x.Status + } + return nil } -func (x *ListProviderClassesResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *EvaluationHistory) GetAlert() *EvaluationHistoryAlert { + if x != nil { + return x.Alert + } + return nil } -func (*ListProviderClassesResponse) ProtoMessage() {} - -func (x *ListProviderClassesResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[158] +func (x *EvaluationHistory) GetRemediation() *EvaluationHistoryRemediation { if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms + return x.Remediation } - return mi.MessageOf(x) + return nil } -// Deprecated: Use ListProviderClassesResponse.ProtoReflect.Descriptor instead. -func (*ListProviderClassesResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{158} +func (x *EvaluationHistory) GetEvaluatedAt() *timestamppb.Timestamp { + if x != nil { + return x.EvaluatedAt + } + return nil } -func (x *ListProviderClassesResponse) GetProviderClasses() []string { +func (x *EvaluationHistory) GetId() string { if x != nil { - return x.ProviderClasses + return x.Id } - return nil + return "" } -type PatchProviderRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type EvaluationHistoryEntity struct { + state protoimpl.MessageState `protogen:"open.v1"` + // id is the unique identifier of the entity. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // type is the entity type. + Type Entity `protobuf:"varint,2,opt,name=type,proto3,enum=minder.v1.Entity" json:"type,omitempty"` + // name is the entity name. + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` unknownFields protoimpl.UnknownFields - - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - Patch *Provider `protobuf:"bytes,2,opt,name=patch,proto3" json:"patch,omitempty"` - UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,3,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *PatchProviderRequest) Reset() { - *x = PatchProviderRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[159] +func (x *EvaluationHistoryEntity) Reset() { + *x = EvaluationHistoryEntity{} + mi := &file_minder_v1_minder_proto_msgTypes[181] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *PatchProviderRequest) String() string { +func (x *EvaluationHistoryEntity) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PatchProviderRequest) ProtoMessage() {} +func (*EvaluationHistoryEntity) ProtoMessage() {} -func (x *PatchProviderRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[159] +func (x *EvaluationHistoryEntity) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[181] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10128,55 +11330,61 @@ func (x *PatchProviderRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PatchProviderRequest.ProtoReflect.Descriptor instead. -func (*PatchProviderRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{159} +// Deprecated: Use EvaluationHistoryEntity.ProtoReflect.Descriptor instead. +func (*EvaluationHistoryEntity) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{181} } -func (x *PatchProviderRequest) GetContext() *Context { +func (x *EvaluationHistoryEntity) GetId() string { if x != nil { - return x.Context + return x.Id } - return nil + return "" } -func (x *PatchProviderRequest) GetPatch() *Provider { +func (x *EvaluationHistoryEntity) GetType() Entity { if x != nil { - return x.Patch + return x.Type } - return nil + return Entity_ENTITY_UNSPECIFIED } -func (x *PatchProviderRequest) GetUpdateMask() *fieldmaskpb.FieldMask { +func (x *EvaluationHistoryEntity) GetName() string { if x != nil { - return x.UpdateMask + return x.Name } - return nil + return "" } -type PatchProviderResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type EvaluationHistoryRule struct { + state protoimpl.MessageState `protogen:"open.v1"` + // name is the name of the rule instance. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // type is the name of the rule type. + RuleType string `protobuf:"bytes,2,opt,name=rule_type,json=ruleType,proto3" json:"rule_type,omitempty"` + // profile is the name of the profile which contains the rule. + Profile string `protobuf:"bytes,3,opt,name=profile,proto3" json:"profile,omitempty"` + // severity is the severity of the rule type. + Severity *Severity `protobuf:"bytes,4,opt,name=severity,proto3" json:"severity,omitempty"` unknownFields protoimpl.UnknownFields - - Provider *Provider `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *PatchProviderResponse) Reset() { - *x = PatchProviderResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[160] +func (x *EvaluationHistoryRule) Reset() { + *x = EvaluationHistoryRule{} + mi := &file_minder_v1_minder_proto_msgTypes[182] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *PatchProviderResponse) String() string { +func (x *EvaluationHistoryRule) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PatchProviderResponse) ProtoMessage() {} +func (*EvaluationHistoryRule) ProtoMessage() {} -func (x *PatchProviderResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[160] +func (x *EvaluationHistoryRule) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[182] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10187,42 +11395,66 @@ func (x *PatchProviderResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PatchProviderResponse.ProtoReflect.Descriptor instead. -func (*PatchProviderResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{160} +// Deprecated: Use EvaluationHistoryRule.ProtoReflect.Descriptor instead. +func (*EvaluationHistoryRule) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{182} } -func (x *PatchProviderResponse) GetProvider() *Provider { +func (x *EvaluationHistoryRule) GetName() string { if x != nil { - return x.Provider + return x.Name + } + return "" +} + +func (x *EvaluationHistoryRule) GetRuleType() string { + if x != nil { + return x.RuleType + } + return "" +} + +func (x *EvaluationHistoryRule) GetProfile() string { + if x != nil { + return x.Profile + } + return "" +} + +func (x *EvaluationHistoryRule) GetSeverity() *Severity { + if x != nil { + return x.Severity } return nil } -type AuthorizationParams struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type EvaluationHistoryStatus struct { + state protoimpl.MessageState `protogen:"open.v1"` + // status is one of (success, error, failure, skipped) + // not using enums to mirror the behaviour of the existing API contracts. + Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + // details contains optional details about the evaluation. + // the structure and contents are rule type specific, and are subject to change. + Details string `protobuf:"bytes,2,opt,name=details,proto3" json:"details,omitempty"` unknownFields protoimpl.UnknownFields - - // authorization_url is an external URL to use to authorize the provider. - AuthorizationUrl string `protobuf:"bytes,1,opt,name=authorization_url,json=authorizationUrl,proto3" json:"authorization_url,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *AuthorizationParams) Reset() { - *x = AuthorizationParams{} - mi := &file_minder_v1_minder_proto_msgTypes[161] +func (x *EvaluationHistoryStatus) Reset() { + *x = EvaluationHistoryStatus{} + mi := &file_minder_v1_minder_proto_msgTypes[183] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *AuthorizationParams) String() string { +func (x *EvaluationHistoryStatus) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AuthorizationParams) ProtoMessage() {} +func (*EvaluationHistoryStatus) ProtoMessage() {} -func (x *AuthorizationParams) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[161] +func (x *EvaluationHistoryStatus) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[183] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10233,44 +11465,52 @@ func (x *AuthorizationParams) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AuthorizationParams.ProtoReflect.Descriptor instead. -func (*AuthorizationParams) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{161} +// Deprecated: Use EvaluationHistoryStatus.ProtoReflect.Descriptor instead. +func (*EvaluationHistoryStatus) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{183} } -func (x *AuthorizationParams) GetAuthorizationUrl() string { +func (x *EvaluationHistoryStatus) GetStatus() string { if x != nil { - return x.AuthorizationUrl + return x.Status } return "" } -type ProviderParameter struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *EvaluationHistoryStatus) GetDetails() string { + if x != nil { + return x.Details + } + return "" +} - // Types that are assignable to Parameters: - // - // *ProviderParameter_GithubApp - Parameters isProviderParameter_Parameters `protobuf_oneof:"parameters"` +type EvaluationHistoryRemediation struct { + state protoimpl.MessageState `protogen:"open.v1"` + // status is one of (success, error, failure, skipped, not available) + // not using enums to mirror the behaviour of the existing API contracts. + Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + // details contains optional details about the remediation. + // the structure and contents are remediation specific, and are subject to change. + Details string `protobuf:"bytes,2,opt,name=details,proto3" json:"details,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *ProviderParameter) Reset() { - *x = ProviderParameter{} - mi := &file_minder_v1_minder_proto_msgTypes[162] +func (x *EvaluationHistoryRemediation) Reset() { + *x = EvaluationHistoryRemediation{} + mi := &file_minder_v1_minder_proto_msgTypes[184] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ProviderParameter) String() string { +func (x *EvaluationHistoryRemediation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ProviderParameter) ProtoMessage() {} +func (*EvaluationHistoryRemediation) ProtoMessage() {} -func (x *ProviderParameter) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[162] +func (x *EvaluationHistoryRemediation) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[184] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10281,69 +11521,52 @@ func (x *ProviderParameter) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ProviderParameter.ProtoReflect.Descriptor instead. -func (*ProviderParameter) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{162} +// Deprecated: Use EvaluationHistoryRemediation.ProtoReflect.Descriptor instead. +func (*EvaluationHistoryRemediation) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{184} } -func (m *ProviderParameter) GetParameters() isProviderParameter_Parameters { - if m != nil { - return m.Parameters +func (x *EvaluationHistoryRemediation) GetStatus() string { + if x != nil { + return x.Status } - return nil + return "" } -func (x *ProviderParameter) GetGithubApp() *GitHubAppParams { - if x, ok := x.GetParameters().(*ProviderParameter_GithubApp); ok { - return x.GithubApp +func (x *EvaluationHistoryRemediation) GetDetails() string { + if x != nil { + return x.Details } - return nil -} - -type isProviderParameter_Parameters interface { - isProviderParameter_Parameters() -} - -type ProviderParameter_GithubApp struct { - GithubApp *GitHubAppParams `protobuf:"bytes,1,opt,name=github_app,json=githubApp,proto3,oneof"` + return "" } -func (*ProviderParameter_GithubApp) isProviderParameter_Parameters() {} - -// GitHubAppParams is the parameters for a GitHub App provider. -type GitHubAppParams struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type EvaluationHistoryAlert struct { + state protoimpl.MessageState `protogen:"open.v1"` + // status is one of (on, off, error, skipped, not available) + // not using enums to mirror the behaviour of the existing API contracts. + Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + // details contains optional details about the alert. + // the structure and contents are alert specific, and are subject to change. + Details string `protobuf:"bytes,2,opt,name=details,proto3" json:"details,omitempty"` unknownFields protoimpl.UnknownFields - - // The GitHub installation ID for the app. On create, this is the only - // parameter used; the organization parameters are ignored. - InstallationId int64 `protobuf:"varint,1,opt,name=installation_id,json=installationId,proto3" json:"installation_id,omitempty"` - // The GitHub organization slug where the app is installed. This is an - // output-only parameter, and is validated on input if set (i.e. the value - // must be either empty or match the org of the installation_id). - Organization string `protobuf:"bytes,2,opt,name=organization,proto3" json:"organization,omitempty"` - // The GitHub organization ID where the app is installed. This is an - // output-only parameter, and is validated on input if set (i.e. the value - // must be either empty or match the org of the installation_id). - OrganizationId int64 `protobuf:"varint,3,opt,name=organization_id,json=organizationId,proto3" json:"organization_id,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *GitHubAppParams) Reset() { - *x = GitHubAppParams{} - mi := &file_minder_v1_minder_proto_msgTypes[163] +func (x *EvaluationHistoryAlert) Reset() { + *x = EvaluationHistoryAlert{} + mi := &file_minder_v1_minder_proto_msgTypes[185] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GitHubAppParams) String() string { +func (x *EvaluationHistoryAlert) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GitHubAppParams) ProtoMessage() {} +func (*EvaluationHistoryAlert) ProtoMessage() {} -func (x *GitHubAppParams) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[163] +func (x *EvaluationHistoryAlert) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[185] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10354,74 +11577,59 @@ func (x *GitHubAppParams) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GitHubAppParams.ProtoReflect.Descriptor instead. -func (*GitHubAppParams) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{163} -} - -func (x *GitHubAppParams) GetInstallationId() int64 { - if x != nil { - return x.InstallationId - } - return 0 +// Deprecated: Use EvaluationHistoryAlert.ProtoReflect.Descriptor instead. +func (*EvaluationHistoryAlert) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{185} } -func (x *GitHubAppParams) GetOrganization() string { +func (x *EvaluationHistoryAlert) GetStatus() string { if x != nil { - return x.Organization + return x.Status } return "" } -func (x *GitHubAppParams) GetOrganizationId() int64 { +func (x *EvaluationHistoryAlert) GetDetails() string { if x != nil { - return x.OrganizationId + return x.Details } - return 0 + return "" } -type Provider struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // name is the name of the provider. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // class is the name of the provider implementation, eg. 'github' or 'gh-app'. - Class string `protobuf:"bytes,7,opt,name=class,proto3" json:"class,omitempty"` - // project is the project where the provider is. This is ignored on input - // in favor of the context field in CreateProviderRequest. - Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"` - // version is the version of the provider. - Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` - // implements is the list of interfaces that the provider implements. - Implements []ProviderType `protobuf:"varint,4,rep,packed,name=implements,proto3,enum=minder.v1.ProviderType" json:"implements,omitempty"` - // config is the configuration of the provider. - Config *structpb.Struct `protobuf:"bytes,5,opt,name=config,proto3" json:"config,omitempty"` - // auth_flows is the list of authorization flows that the provider supports. - AuthFlows []AuthorizationFlow `protobuf:"varint,6,rep,packed,name=auth_flows,json=authFlows,proto3,enum=minder.v1.AuthorizationFlow" json:"auth_flows,omitempty"` - // parameters is the list of parameters that the provider requires. - Parameters *ProviderParameter `protobuf:"bytes,8,opt,name=parameters,proto3" json:"parameters,omitempty"` - // credentials_state is the state of the credentials for the provider. - // This is an output-only field. It may be: "set", "unset", "not_applicable". - CredentialsState string `protobuf:"bytes,9,opt,name=credentials_state,json=credentialsState,proto3" json:"credentials_state,omitempty"` +// used for parsing resources in ruletypes +type EntityInstance struct { + state protoimpl.MessageState `protogen:"open.v1"` + // id is the unique identifier of the entity. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // context is the context in which the entity is evaluated. + Context *ContextV2 `protobuf:"bytes,2,opt,name=context,proto3" json:"context,omitempty"` + // name is the name of the entity. + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + // type is the type of the entity. + // DISCUSSION: If we're aiming for a BYO entity type, we should probably + // have this be a string, and have the user provide the type. + Type Entity `protobuf:"varint,4,opt,name=type,proto3,enum=minder.v1.Entity" json:"type,omitempty"` + // properties is a map of properties of the entity. + Properties *structpb.Struct `protobuf:"bytes,5,opt,name=properties,proto3" json:"properties,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *Provider) Reset() { - *x = Provider{} - mi := &file_minder_v1_minder_proto_msgTypes[164] +func (x *EntityInstance) Reset() { + *x = EntityInstance{} + mi := &file_minder_v1_minder_proto_msgTypes[186] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *Provider) String() string { +func (x *EntityInstance) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Provider) ProtoMessage() {} +func (*EntityInstance) ProtoMessage() {} -func (x *Provider) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[164] +func (x *EntityInstance) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[186] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10432,99 +11640,81 @@ func (x *Provider) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Provider.ProtoReflect.Descriptor instead. -func (*Provider) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{164} -} - -func (x *Provider) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Provider) GetClass() string { - if x != nil { - return x.Class - } - return "" -} - -func (x *Provider) GetProject() string { - if x != nil { - return x.Project - } - return "" +// Deprecated: Use EntityInstance.ProtoReflect.Descriptor instead. +func (*EntityInstance) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{186} } -func (x *Provider) GetVersion() string { +func (x *EntityInstance) GetId() string { if x != nil { - return x.Version + return x.Id } return "" } -func (x *Provider) GetImplements() []ProviderType { +func (x *EntityInstance) GetContext() *ContextV2 { if x != nil { - return x.Implements + return x.Context } return nil } -func (x *Provider) GetConfig() *structpb.Struct { +func (x *EntityInstance) GetName() string { if x != nil { - return x.Config + return x.Name } - return nil + return "" } -func (x *Provider) GetAuthFlows() []AuthorizationFlow { +func (x *EntityInstance) GetType() Entity { if x != nil { - return x.AuthFlows + return x.Type } - return nil + return Entity_ENTITY_UNSPECIFIED } -func (x *Provider) GetParameters() *ProviderParameter { +func (x *EntityInstance) GetProperties() *structpb.Struct { if x != nil { - return x.Parameters + return x.Properties } return nil } -func (x *Provider) GetCredentialsState() string { - if x != nil { - return x.CredentialsState - } - return "" -} - -// GetEvaluationHistoryRequest represents a request for the GetEvaluationHistory endpoint -type GetEvaluationHistoryRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// UpstreamEntityRef providers enough information for the +// provider to identify the entity in the upstream system. +type UpstreamEntityRef struct { + state protoimpl.MessageState `protogen:"open.v1"` + // context is the context in which the entity is evaluated. + // Note that the context is included here since users of + // this message may return upstream references from + // multiple providers + Context *ContextV2 `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` + // type is the type of the entity. + Type Entity `protobuf:"varint,2,opt,name=type,proto3,enum=minder.v1.Entity" json:"type,omitempty"` + // properties is a map of properties of the entity. + // This will be used to identify the entity in the upstream system + // and will be a subset of the properties of the entity that will + // be stored in Minder. + Properties *structpb.Struct `protobuf:"bytes,3,opt,name=properties,proto3" json:"properties,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Context *Context `protobuf:"bytes,2,opt,name=context,proto3" json:"context,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *GetEvaluationHistoryRequest) Reset() { - *x = GetEvaluationHistoryRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[165] +func (x *UpstreamEntityRef) Reset() { + *x = UpstreamEntityRef{} + mi := &file_minder_v1_minder_proto_msgTypes[187] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GetEvaluationHistoryRequest) String() string { +func (x *UpstreamEntityRef) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetEvaluationHistoryRequest) ProtoMessage() {} +func (*UpstreamEntityRef) ProtoMessage() {} -func (x *GetEvaluationHistoryRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[165] +func (x *UpstreamEntityRef) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[187] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10535,71 +11725,77 @@ func (x *GetEvaluationHistoryRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetEvaluationHistoryRequest.ProtoReflect.Descriptor instead. -func (*GetEvaluationHistoryRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{165} +// Deprecated: Use UpstreamEntityRef.ProtoReflect.Descriptor instead. +func (*UpstreamEntityRef) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{187} } -func (x *GetEvaluationHistoryRequest) GetId() string { +func (x *UpstreamEntityRef) GetContext() *ContextV2 { if x != nil { - return x.Id + return x.Context } - return "" + return nil } -func (x *GetEvaluationHistoryRequest) GetContext() *Context { +func (x *UpstreamEntityRef) GetType() Entity { if x != nil { - return x.Context + return x.Type + } + return Entity_ENTITY_UNSPECIFIED +} + +func (x *UpstreamEntityRef) GetProperties() *structpb.Struct { + if x != nil { + return x.Properties } return nil } -// ListEvaluationHistoryRequest represents a request message for the -// ListEvaluationHistory RPC. -// -// Most of its fields are used for filtering, except for `cursor` -// which is used for pagination. -type ListEvaluationHistoryRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// DataSource is a Data source instance. Data sources represent +// external integrations that enrich the data in Minder, but do not +// have explicit lifecycle objects (entities). Integrations which +// create entities are called Providers. +type DataSource struct { + state protoimpl.MessageState `protogen:"open.v1"` + // version is the version of the data source API. + Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` + // type is the data source type + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + // context is the context in which the data source is evaluated. + // Note that in this case we only need the project in the + // context, since data sources are not provider-specific. + Context *ContextV2 `protobuf:"bytes,3,opt,name=context,proto3" json:"context,omitempty"` + // name is the name of the data source. + // Note that this is unique within a project hierarchy. + // Names must be lowercase and can only contain letters, numbers, + // hyphens, and underscores. + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + // id is the unique identifier of the data source. + Id string `protobuf:"bytes,5,opt,name=id,proto3" json:"id,omitempty"` + // Types that are valid to be assigned to Driver: + // + // *DataSource_Structured + // *DataSource_Rest + Driver isDataSource_Driver `protobuf_oneof:"driver"` unknownFields protoimpl.UnknownFields - - Context *Context `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // List of entity types to retrieve. - EntityType []string `protobuf:"bytes,2,rep,name=entity_type,json=entityType,proto3" json:"entity_type,omitempty"` - // List of entity names to retrieve. - EntityName []string `protobuf:"bytes,3,rep,name=entity_name,json=entityName,proto3" json:"entity_name,omitempty"` - // List of profile names to retrieve. - ProfileName []string `protobuf:"bytes,4,rep,name=profile_name,json=profileName,proto3" json:"profile_name,omitempty"` - // List of evaluation statuses to retrieve. - Status []string `protobuf:"bytes,5,rep,name=status,proto3" json:"status,omitempty"` - // List of remediation statuses to retrieve. - Remediation []string `protobuf:"bytes,6,rep,name=remediation,proto3" json:"remediation,omitempty"` - // List of alert statuses to retrieve. - Alert []string `protobuf:"bytes,7,rep,name=alert,proto3" json:"alert,omitempty"` - // Timestamp representing the start time of the selection window. - From *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=from,proto3" json:"from,omitempty"` - // Timestamp representing the end time of the selection window. - To *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=to,proto3" json:"to,omitempty"` - // Cursor object to select the "page" of data to retrieve. - Cursor *Cursor `protobuf:"bytes,10,opt,name=cursor,proto3" json:"cursor,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *ListEvaluationHistoryRequest) Reset() { - *x = ListEvaluationHistoryRequest{} - mi := &file_minder_v1_minder_proto_msgTypes[166] +func (x *DataSource) Reset() { + *x = DataSource{} + mi := &file_minder_v1_minder_proto_msgTypes[188] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListEvaluationHistoryRequest) String() string { +func (x *DataSource) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListEvaluationHistoryRequest) ProtoMessage() {} +func (*DataSource) ProtoMessage() {} -func (x *ListEvaluationHistoryRequest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[166] +func (x *DataSource) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[188] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10610,107 +11806,159 @@ func (x *ListEvaluationHistoryRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListEvaluationHistoryRequest.ProtoReflect.Descriptor instead. -func (*ListEvaluationHistoryRequest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{166} +// Deprecated: Use DataSource.ProtoReflect.Descriptor instead. +func (*DataSource) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{188} } -func (x *ListEvaluationHistoryRequest) GetContext() *Context { +func (x *DataSource) GetVersion() string { if x != nil { - return x.Context + return x.Version } - return nil + return "" } -func (x *ListEvaluationHistoryRequest) GetEntityType() []string { +func (x *DataSource) GetType() string { if x != nil { - return x.EntityType + return x.Type } - return nil + return "" } -func (x *ListEvaluationHistoryRequest) GetEntityName() []string { +func (x *DataSource) GetContext() *ContextV2 { if x != nil { - return x.EntityName + return x.Context } return nil } -func (x *ListEvaluationHistoryRequest) GetProfileName() []string { +func (x *DataSource) GetName() string { if x != nil { - return x.ProfileName + return x.Name } - return nil + return "" } -func (x *ListEvaluationHistoryRequest) GetStatus() []string { +func (x *DataSource) GetId() string { if x != nil { - return x.Status + return x.Id } - return nil + return "" } -func (x *ListEvaluationHistoryRequest) GetRemediation() []string { +func (x *DataSource) GetDriver() isDataSource_Driver { if x != nil { - return x.Remediation + return x.Driver } return nil } -func (x *ListEvaluationHistoryRequest) GetAlert() []string { +func (x *DataSource) GetStructured() *StructDataSource { if x != nil { - return x.Alert + if x, ok := x.Driver.(*DataSource_Structured); ok { + return x.Structured + } } return nil } -func (x *ListEvaluationHistoryRequest) GetFrom() *timestamppb.Timestamp { +func (x *DataSource) GetRest() *RestDataSource { if x != nil { - return x.From + if x, ok := x.Driver.(*DataSource_Rest); ok { + return x.Rest + } } return nil } -func (x *ListEvaluationHistoryRequest) GetTo() *timestamppb.Timestamp { +type isDataSource_Driver interface { + isDataSource_Driver() +} + +type DataSource_Structured struct { + // structured is the structired data - data source. + Structured *StructDataSource `protobuf:"bytes,8,opt,name=structured,proto3,oneof"` +} + +type DataSource_Rest struct { + // rest is the REST data source driver. + Rest *RestDataSource `protobuf:"bytes,6,opt,name=rest,proto3,oneof"` +} + +func (*DataSource_Structured) isDataSource_Driver() {} + +func (*DataSource_Rest) isDataSource_Driver() {} + +// StructDataSource is the structured data source driver. +type StructDataSource struct { + state protoimpl.MessageState `protogen:"open.v1"` + // defs is the list of definitions for the structured data API. + Def map[string]*StructDataSource_Def `protobuf:"bytes,1,rep,name=def,proto3" json:"def,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *StructDataSource) Reset() { + *x = StructDataSource{} + mi := &file_minder_v1_minder_proto_msgTypes[189] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *StructDataSource) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StructDataSource) ProtoMessage() {} + +func (x *StructDataSource) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[189] if x != nil { - return x.To + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *ListEvaluationHistoryRequest) GetCursor() *Cursor { +// Deprecated: Use StructDataSource.ProtoReflect.Descriptor instead. +func (*StructDataSource) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{189} +} + +func (x *StructDataSource) GetDef() map[string]*StructDataSource_Def { if x != nil { - return x.Cursor + return x.Def } return nil } -// GetEvaluationHistoryResponse represents a response message for the -// GetEvaluationHistory RPC. -type GetEvaluationHistoryResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// RestDataSource is the REST data source driver. +type RestDataSource struct { + state protoimpl.MessageState `protogen:"open.v1"` + // defs is the list of definitions for the REST API. + Def map[string]*RestDataSource_Def `protobuf:"bytes,1,rep,name=def,proto3" json:"def,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` unknownFields protoimpl.UnknownFields - - // The requested record - Evaluation *EvaluationHistory `protobuf:"bytes,1,opt,name=evaluation,proto3" json:"evaluation,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *GetEvaluationHistoryResponse) Reset() { - *x = GetEvaluationHistoryResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[167] +func (x *RestDataSource) Reset() { + *x = RestDataSource{} + mi := &file_minder_v1_minder_proto_msgTypes[190] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GetEvaluationHistoryResponse) String() string { +func (x *RestDataSource) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetEvaluationHistoryResponse) ProtoMessage() {} - -func (x *GetEvaluationHistoryResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[167] +func (*RestDataSource) ProtoMessage() {} + +func (x *RestDataSource) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[190] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10721,50 +11969,44 @@ func (x *GetEvaluationHistoryResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetEvaluationHistoryResponse.ProtoReflect.Descriptor instead. -func (*GetEvaluationHistoryResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{167} +// Deprecated: Use RestDataSource.ProtoReflect.Descriptor instead. +func (*RestDataSource) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{190} } -func (x *GetEvaluationHistoryResponse) GetEvaluation() *EvaluationHistory { +func (x *RestDataSource) GetDef() map[string]*RestDataSource_Def { if x != nil { - return x.Evaluation + return x.Def } return nil } -// ListEvaluationHistoryResponse represents a response message for the -// ListEvaluationHistory RPC. -// -// It ships a collection of records retrieved and pointers to get to -// the next and/or previous pages of data. -type ListEvaluationHistoryResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// DataSourceReference is a reference to a data source. +// Note that for a resource to refer to a data source the data source must +// be available in the same project hierarchy. +type DataSourceReference struct { + state protoimpl.MessageState `protogen:"open.v1"` + // refer to a data source by name. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` unknownFields protoimpl.UnknownFields - - // List of records retrieved. - Data []*EvaluationHistory `protobuf:"bytes,1,rep,name=data,proto3" json:"data,omitempty"` - // Metadata of the current page and pointers to next and/or - // previous pages. - Page *CursorPage `protobuf:"bytes,2,opt,name=page,proto3" json:"page,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *ListEvaluationHistoryResponse) Reset() { - *x = ListEvaluationHistoryResponse{} - mi := &file_minder_v1_minder_proto_msgTypes[168] +func (x *DataSourceReference) Reset() { + *x = DataSourceReference{} + mi := &file_minder_v1_minder_proto_msgTypes[191] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListEvaluationHistoryResponse) String() string { +func (x *DataSourceReference) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListEvaluationHistoryResponse) ProtoMessage() {} +func (*DataSourceReference) ProtoMessage() {} -func (x *ListEvaluationHistoryResponse) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[168] +func (x *DataSourceReference) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[191] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10775,61 +12017,41 @@ func (x *ListEvaluationHistoryResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListEvaluationHistoryResponse.ProtoReflect.Descriptor instead. -func (*ListEvaluationHistoryResponse) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{168} -} - -func (x *ListEvaluationHistoryResponse) GetData() []*EvaluationHistory { - if x != nil { - return x.Data - } - return nil +// Deprecated: Use DataSourceReference.ProtoReflect.Descriptor instead. +func (*DataSourceReference) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{191} } -func (x *ListEvaluationHistoryResponse) GetPage() *CursorPage { +func (x *DataSourceReference) GetName() string { if x != nil { - return x.Page + return x.Name } - return nil + return "" } -type EvaluationHistory struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type RegisterRepoResult_Status struct { + state protoimpl.MessageState `protogen:"open.v1"` + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` + Error *string `protobuf:"bytes,2,opt,name=error,proto3,oneof" json:"error,omitempty"` unknownFields protoimpl.UnknownFields - - // entity contains details of the entity which was evaluated. - Entity *EvaluationHistoryEntity `protobuf:"bytes,1,opt,name=entity,proto3" json:"entity,omitempty"` - // rule contains details of the rule which the entity was evaluated against. - Rule *EvaluationHistoryRule `protobuf:"bytes,2,opt,name=rule,proto3" json:"rule,omitempty"` - // status contains the evaluation status. - Status *EvaluationHistoryStatus `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` - // alert contains details of the alerts for this evaluation. - Alert *EvaluationHistoryAlert `protobuf:"bytes,4,opt,name=alert,proto3" json:"alert,omitempty"` - // remediation contains details of the remediation for this evaluation. - Remediation *EvaluationHistoryRemediation `protobuf:"bytes,5,opt,name=remediation,proto3" json:"remediation,omitempty"` - // created_at is the timestamp of creation of this evaluation - EvaluatedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=evaluated_at,json=evaluatedAt,proto3" json:"evaluated_at,omitempty"` - // id is the unique identifier of the evaluation. - Id string `protobuf:"bytes,7,opt,name=id,proto3" json:"id,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *EvaluationHistory) Reset() { - *x = EvaluationHistory{} - mi := &file_minder_v1_minder_proto_msgTypes[169] +func (x *RegisterRepoResult_Status) Reset() { + *x = RegisterRepoResult_Status{} + mi := &file_minder_v1_minder_proto_msgTypes[192] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *EvaluationHistory) String() string { +func (x *RegisterRepoResult_Status) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EvaluationHistory) ProtoMessage() {} +func (*RegisterRepoResult_Status) ProtoMessage() {} -func (x *EvaluationHistory) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[169] +func (x *RegisterRepoResult_Status) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[192] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10840,88 +12062,103 @@ func (x *EvaluationHistory) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use EvaluationHistory.ProtoReflect.Descriptor instead. -func (*EvaluationHistory) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{169} +// Deprecated: Use RegisterRepoResult_Status.ProtoReflect.Descriptor instead. +func (*RegisterRepoResult_Status) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{30, 0} } -func (x *EvaluationHistory) GetEntity() *EvaluationHistoryEntity { +func (x *RegisterRepoResult_Status) GetSuccess() bool { if x != nil { - return x.Entity + return x.Success } - return nil + return false } -func (x *EvaluationHistory) GetRule() *EvaluationHistoryRule { - if x != nil { - return x.Rule +func (x *RegisterRepoResult_Status) GetError() string { + if x != nil && x.Error != nil { + return *x.Error } - return nil + return "" } -func (x *EvaluationHistory) GetStatus() *EvaluationHistoryStatus { - if x != nil { - return x.Status - } - return nil +type ListEvaluationResultsResponse_EntityProfileEvaluationResults struct { + state protoimpl.MessageState `protogen:"open.v1"` + // profile_status is the status of the profile - id, name, status, last_updated + ProfileStatus *ProfileStatus `protobuf:"bytes,1,opt,name=profile_status,json=profileStatus,proto3" json:"profile_status,omitempty"` + // Note that some fields like profile_id and entity might be empty + // Eventually we might replace this type with another one that fits the API better + Results []*RuleEvaluationStatus `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *EvaluationHistory) GetAlert() *EvaluationHistoryAlert { - if x != nil { - return x.Alert - } - return nil +func (x *ListEvaluationResultsResponse_EntityProfileEvaluationResults) Reset() { + *x = ListEvaluationResultsResponse_EntityProfileEvaluationResults{} + mi := &file_minder_v1_minder_proto_msgTypes[195] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *EvaluationHistory) GetRemediation() *EvaluationHistoryRemediation { +func (x *ListEvaluationResultsResponse_EntityProfileEvaluationResults) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListEvaluationResultsResponse_EntityProfileEvaluationResults) ProtoMessage() {} + +func (x *ListEvaluationResultsResponse_EntityProfileEvaluationResults) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[195] if x != nil { - return x.Remediation + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *EvaluationHistory) GetEvaluatedAt() *timestamppb.Timestamp { +// Deprecated: Use ListEvaluationResultsResponse_EntityProfileEvaluationResults.ProtoReflect.Descriptor instead. +func (*ListEvaluationResultsResponse_EntityProfileEvaluationResults) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{116, 0} +} + +func (x *ListEvaluationResultsResponse_EntityProfileEvaluationResults) GetProfileStatus() *ProfileStatus { if x != nil { - return x.EvaluatedAt + return x.ProfileStatus } return nil } -func (x *EvaluationHistory) GetId() string { +func (x *ListEvaluationResultsResponse_EntityProfileEvaluationResults) GetResults() []*RuleEvaluationStatus { if x != nil { - return x.Id + return x.Results } - return "" + return nil } -type EvaluationHistoryEntity struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type ListEvaluationResultsResponse_EntityEvaluationResults struct { + state protoimpl.MessageState `protogen:"open.v1"` + Entity *EntityTypedId `protobuf:"bytes,1,opt,name=entity,proto3" json:"entity,omitempty"` + Profiles []*ListEvaluationResultsResponse_EntityProfileEvaluationResults `protobuf:"bytes,2,rep,name=profiles,proto3" json:"profiles,omitempty"` unknownFields protoimpl.UnknownFields - - // id is the unique identifier of the entity. - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - // type is the entity type. - Type Entity `protobuf:"varint,2,opt,name=type,proto3,enum=minder.v1.Entity" json:"type,omitempty"` - // name is the entity name. - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *EvaluationHistoryEntity) Reset() { - *x = EvaluationHistoryEntity{} - mi := &file_minder_v1_minder_proto_msgTypes[170] +func (x *ListEvaluationResultsResponse_EntityEvaluationResults) Reset() { + *x = ListEvaluationResultsResponse_EntityEvaluationResults{} + mi := &file_minder_v1_minder_proto_msgTypes[196] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *EvaluationHistoryEntity) String() string { +func (x *ListEvaluationResultsResponse_EntityEvaluationResults) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EvaluationHistoryEntity) ProtoMessage() {} +func (*ListEvaluationResultsResponse_EntityEvaluationResults) ProtoMessage() {} -func (x *EvaluationHistoryEntity) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[170] +func (x *ListEvaluationResultsResponse_EntityEvaluationResults) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[196] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10932,62 +12169,49 @@ func (x *EvaluationHistoryEntity) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use EvaluationHistoryEntity.ProtoReflect.Descriptor instead. -func (*EvaluationHistoryEntity) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{170} -} - -func (x *EvaluationHistoryEntity) GetId() string { - if x != nil { - return x.Id - } - return "" +// Deprecated: Use ListEvaluationResultsResponse_EntityEvaluationResults.ProtoReflect.Descriptor instead. +func (*ListEvaluationResultsResponse_EntityEvaluationResults) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{116, 1} } -func (x *EvaluationHistoryEntity) GetType() Entity { +func (x *ListEvaluationResultsResponse_EntityEvaluationResults) GetEntity() *EntityTypedId { if x != nil { - return x.Type + return x.Entity } - return Entity_ENTITY_UNSPECIFIED + return nil } -func (x *EvaluationHistoryEntity) GetName() string { +func (x *ListEvaluationResultsResponse_EntityEvaluationResults) GetProfiles() []*ListEvaluationResultsResponse_EntityProfileEvaluationResults { if x != nil { - return x.Name + return x.Profiles } - return "" + return nil } -type EvaluationHistoryRule struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type RestType_Fallback struct { + state protoimpl.MessageState `protogen:"open.v1"` + HttpCode int32 `protobuf:"varint,1,opt,name=http_code,json=httpCode,proto3" json:"http_code,omitempty"` + // This is expected to be a valid JSON string. + Body string `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"` unknownFields protoimpl.UnknownFields - - // name is the name of the rule instance. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // type is the name of the rule type. - RuleType string `protobuf:"bytes,2,opt,name=rule_type,json=ruleType,proto3" json:"rule_type,omitempty"` - // profile is the name of the profile which contains the rule. - Profile string `protobuf:"bytes,3,opt,name=profile,proto3" json:"profile,omitempty"` - // severity is the severity of the rule type. - Severity *Severity `protobuf:"bytes,4,opt,name=severity,proto3" json:"severity,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *EvaluationHistoryRule) Reset() { - *x = EvaluationHistoryRule{} - mi := &file_minder_v1_minder_proto_msgTypes[171] +func (x *RestType_Fallback) Reset() { + *x = RestType_Fallback{} + mi := &file_minder_v1_minder_proto_msgTypes[197] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *EvaluationHistoryRule) String() string { +func (x *RestType_Fallback) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EvaluationHistoryRule) ProtoMessage() {} +func (*RestType_Fallback) ProtoMessage() {} -func (x *EvaluationHistoryRule) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[171] +func (x *RestType_Fallback) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[197] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10998,67 +12222,50 @@ func (x *EvaluationHistoryRule) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use EvaluationHistoryRule.ProtoReflect.Descriptor instead. -func (*EvaluationHistoryRule) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{171} -} - -func (x *EvaluationHistoryRule) GetName() string { - if x != nil { - return x.Name - } - return "" +// Deprecated: Use RestType_Fallback.ProtoReflect.Descriptor instead. +func (*RestType_Fallback) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{117, 0} } -func (x *EvaluationHistoryRule) GetRuleType() string { +func (x *RestType_Fallback) GetHttpCode() int32 { if x != nil { - return x.RuleType + return x.HttpCode } - return "" + return 0 } -func (x *EvaluationHistoryRule) GetProfile() string { +func (x *RestType_Fallback) GetBody() string { if x != nil { - return x.Profile + return x.Body } return "" } -func (x *EvaluationHistoryRule) GetSeverity() *Severity { - if x != nil { - return x.Severity - } - return nil -} - -type EvaluationHistoryStatus struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type DiffType_Ecosystem struct { + state protoimpl.MessageState `protogen:"open.v1"` + // name is the name of the ecosystem. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // depfile is the file that contains the dependencies for this ecosystem + Depfile string `protobuf:"bytes,2,opt,name=depfile,proto3" json:"depfile,omitempty"` unknownFields protoimpl.UnknownFields - - // status is one of (success, error, failure, skipped) - // not using enums to mirror the behaviour of the existing API contracts. - Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` - // details contains optional details about the evaluation. - // the structure and contents are rule type specific, and are subject to change. - Details string `protobuf:"bytes,2,opt,name=details,proto3" json:"details,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *EvaluationHistoryStatus) Reset() { - *x = EvaluationHistoryStatus{} - mi := &file_minder_v1_minder_proto_msgTypes[172] +func (x *DiffType_Ecosystem) Reset() { + *x = DiffType_Ecosystem{} + mi := &file_minder_v1_minder_proto_msgTypes[198] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *EvaluationHistoryStatus) String() string { +func (x *DiffType_Ecosystem) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EvaluationHistoryStatus) ProtoMessage() {} +func (*DiffType_Ecosystem) ProtoMessage() {} -func (x *EvaluationHistoryStatus) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[172] +func (x *DiffType_Ecosystem) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[198] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11069,53 +12276,49 @@ func (x *EvaluationHistoryStatus) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use EvaluationHistoryStatus.ProtoReflect.Descriptor instead. -func (*EvaluationHistoryStatus) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{172} +// Deprecated: Use DiffType_Ecosystem.ProtoReflect.Descriptor instead. +func (*DiffType_Ecosystem) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{121, 0} } -func (x *EvaluationHistoryStatus) GetStatus() string { +func (x *DiffType_Ecosystem) GetName() string { if x != nil { - return x.Status + return x.Name } return "" } -func (x *EvaluationHistoryStatus) GetDetails() string { +func (x *DiffType_Ecosystem) GetDepfile() string { if x != nil { - return x.Details + return x.Depfile } return "" } -type EvaluationHistoryRemediation struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// branch is the branch of the git repository, when applied to repository entities. +// Has no meaning or effect on other entity types. +type DepsType_RepoConfigs struct { + state protoimpl.MessageState `protogen:"open.v1"` + Branch string `protobuf:"bytes,1,opt,name=branch,proto3" json:"branch,omitempty"` unknownFields protoimpl.UnknownFields - - // status is one of (success, error, failure, skipped, not available) - // not using enums to mirror the behaviour of the existing API contracts. - Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` - // details contains optional details about the remediation. - // the structure and contents are remediation specific, and are subject to change. - Details string `protobuf:"bytes,2,opt,name=details,proto3" json:"details,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *EvaluationHistoryRemediation) Reset() { - *x = EvaluationHistoryRemediation{} - mi := &file_minder_v1_minder_proto_msgTypes[173] +func (x *DepsType_RepoConfigs) Reset() { + *x = DepsType_RepoConfigs{} + mi := &file_minder_v1_minder_proto_msgTypes[199] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *EvaluationHistoryRemediation) String() string { +func (x *DepsType_RepoConfigs) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EvaluationHistoryRemediation) ProtoMessage() {} +func (*DepsType_RepoConfigs) ProtoMessage() {} -func (x *EvaluationHistoryRemediation) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[173] +func (x *DepsType_RepoConfigs) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[199] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11126,53 +12329,41 @@ func (x *EvaluationHistoryRemediation) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use EvaluationHistoryRemediation.ProtoReflect.Descriptor instead. -func (*EvaluationHistoryRemediation) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{173} -} - -func (x *EvaluationHistoryRemediation) GetStatus() string { - if x != nil { - return x.Status - } - return "" +// Deprecated: Use DepsType_RepoConfigs.ProtoReflect.Descriptor instead. +func (*DepsType_RepoConfigs) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{122, 0} } -func (x *EvaluationHistoryRemediation) GetDetails() string { +func (x *DepsType_RepoConfigs) GetBranch() string { if x != nil { - return x.Details + return x.Branch } return "" } -type EvaluationHistoryAlert struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type DepsType_PullRequestConfigs struct { + state protoimpl.MessageState `protogen:"open.v1"` + // filter is the filter to apply to the PRs. The default value is "NEW_AND_UPDATED". + Filter string `protobuf:"bytes,1,opt,name=filter,proto3" json:"filter,omitempty"` unknownFields protoimpl.UnknownFields - - // status is one of (on, off, error, skipped, not available) - // not using enums to mirror the behaviour of the existing API contracts. - Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` - // details contains optional details about the alert. - // the structure and contents are alert specific, and are subject to change. - Details string `protobuf:"bytes,2,opt,name=details,proto3" json:"details,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *EvaluationHistoryAlert) Reset() { - *x = EvaluationHistoryAlert{} - mi := &file_minder_v1_minder_proto_msgTypes[174] +func (x *DepsType_PullRequestConfigs) Reset() { + *x = DepsType_PullRequestConfigs{} + mi := &file_minder_v1_minder_proto_msgTypes[200] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *EvaluationHistoryAlert) String() string { +func (x *DepsType_PullRequestConfigs) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EvaluationHistoryAlert) ProtoMessage() {} +func (*DepsType_PullRequestConfigs) ProtoMessage() {} -func (x *EvaluationHistoryAlert) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[174] +func (x *DepsType_PullRequestConfigs) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[200] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11183,59 +12374,52 @@ func (x *EvaluationHistoryAlert) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use EvaluationHistoryAlert.ProtoReflect.Descriptor instead. -func (*EvaluationHistoryAlert) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{174} -} - -func (x *EvaluationHistoryAlert) GetStatus() string { - if x != nil { - return x.Status - } - return "" +// Deprecated: Use DepsType_PullRequestConfigs.ProtoReflect.Descriptor instead. +func (*DepsType_PullRequestConfigs) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{122, 1} } -func (x *EvaluationHistoryAlert) GetDetails() string { +func (x *DepsType_PullRequestConfigs) GetFilter() string { if x != nil { - return x.Details + return x.Filter } return "" } -type EntityInstance struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// Definition defines the rule type. It encompases the schema and the data evaluation. +type RuleType_Definition struct { + state protoimpl.MessageState `protogen:"open.v1"` + // in_entity is the entity in which the rule is evaluated. + // This can be repository, build_environment or artifact. + InEntity string `protobuf:"bytes,1,opt,name=in_entity,json=inEntity,proto3" json:"in_entity,omitempty"` + // rule_schema is the schema of the rule. This is expressed in JSON Schema. + RuleSchema *structpb.Struct `protobuf:"bytes,2,opt,name=rule_schema,json=ruleSchema,proto3" json:"rule_schema,omitempty"` + // param_schema is the schema of the parameters that are passed to the rule. + // This is expressed in JSON Schema. + ParamSchema *structpb.Struct `protobuf:"bytes,3,opt,name=param_schema,json=paramSchema,proto3,oneof" json:"param_schema,omitempty"` + Ingest *RuleType_Definition_Ingest `protobuf:"bytes,4,opt,name=ingest,proto3" json:"ingest,omitempty"` + Eval *RuleType_Definition_Eval `protobuf:"bytes,5,opt,name=eval,proto3" json:"eval,omitempty"` + Remediate *RuleType_Definition_Remediate `protobuf:"bytes,6,opt,name=remediate,proto3" json:"remediate,omitempty"` + Alert *RuleType_Definition_Alert `protobuf:"bytes,7,opt,name=alert,proto3" json:"alert,omitempty"` unknownFields protoimpl.UnknownFields - - // id is the unique identifier of the entity. - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - // context is the context in which the entity is evaluated. - Context *ContextV2 `protobuf:"bytes,2,opt,name=context,proto3" json:"context,omitempty"` - // name is the name of the entity. - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - // type is the type of the entity. - // DISCUSSION: If we're aiming for a BYO entity type, we should probably - // have this be a string, and have the user provide the type. - Type Entity `protobuf:"varint,4,opt,name=type,proto3,enum=minder.v1.Entity" json:"type,omitempty"` - // properties is a map of properties of the entity. - Properties *structpb.Struct `protobuf:"bytes,5,opt,name=properties,proto3" json:"properties,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *EntityInstance) Reset() { - *x = EntityInstance{} - mi := &file_minder_v1_minder_proto_msgTypes[175] +func (x *RuleType_Definition) Reset() { + *x = RuleType_Definition{} + mi := &file_minder_v1_minder_proto_msgTypes[201] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *EntityInstance) String() string { +func (x *RuleType_Definition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EntityInstance) ProtoMessage() {} +func (*RuleType_Definition) ProtoMessage() {} -func (x *EntityInstance) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[175] +func (x *RuleType_Definition) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[201] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11246,142 +12430,102 @@ func (x *EntityInstance) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use EntityInstance.ProtoReflect.Descriptor instead. -func (*EntityInstance) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{175} +// Deprecated: Use RuleType_Definition.ProtoReflect.Descriptor instead. +func (*RuleType_Definition) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{124, 0} } -func (x *EntityInstance) GetId() string { +func (x *RuleType_Definition) GetInEntity() string { if x != nil { - return x.Id + return x.InEntity } return "" } -func (x *EntityInstance) GetContext() *ContextV2 { +func (x *RuleType_Definition) GetRuleSchema() *structpb.Struct { if x != nil { - return x.Context + return x.RuleSchema } return nil } -func (x *EntityInstance) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *EntityInstance) GetType() Entity { - if x != nil { - return x.Type - } - return Entity_ENTITY_UNSPECIFIED -} - -func (x *EntityInstance) GetProperties() *structpb.Struct { +func (x *RuleType_Definition) GetParamSchema() *structpb.Struct { if x != nil { - return x.Properties + return x.ParamSchema } return nil } -// UpstreamEntityRef providers enough information for the -// provider to identify the entity in the upstream system. -type UpstreamEntityRef struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // context is the context in which the entity is evaluated. - // Note that the context is included here since users of - // this message may return upstream references from - // multiple providers - Context *ContextV2 `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` - // type is the type of the entity. - Type Entity `protobuf:"varint,2,opt,name=type,proto3,enum=minder.v1.Entity" json:"type,omitempty"` - // properties is a map of properties of the entity. - // This will be used to identify the entity in the upstream system - // and will be a subset of the properties of the entity that will - // be stored in Minder. - Properties *structpb.Struct `protobuf:"bytes,3,opt,name=properties,proto3" json:"properties,omitempty"` -} - -func (x *UpstreamEntityRef) Reset() { - *x = UpstreamEntityRef{} - mi := &file_minder_v1_minder_proto_msgTypes[176] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *UpstreamEntityRef) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UpstreamEntityRef) ProtoMessage() {} - -func (x *UpstreamEntityRef) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[176] +func (x *RuleType_Definition) GetIngest() *RuleType_Definition_Ingest { if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms + return x.Ingest } - return mi.MessageOf(x) -} - -// Deprecated: Use UpstreamEntityRef.ProtoReflect.Descriptor instead. -func (*UpstreamEntityRef) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{176} + return nil } -func (x *UpstreamEntityRef) GetContext() *ContextV2 { +func (x *RuleType_Definition) GetEval() *RuleType_Definition_Eval { if x != nil { - return x.Context + return x.Eval } return nil } -func (x *UpstreamEntityRef) GetType() Entity { +func (x *RuleType_Definition) GetRemediate() *RuleType_Definition_Remediate { if x != nil { - return x.Type + return x.Remediate } - return Entity_ENTITY_UNSPECIFIED + return nil } -func (x *UpstreamEntityRef) GetProperties() *structpb.Struct { +func (x *RuleType_Definition) GetAlert() *RuleType_Definition_Alert { if x != nil { - return x.Properties + return x.Alert } return nil } -type RegisterRepoResult_Status struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// Ingest defines how the data is ingested. +type RuleType_Definition_Ingest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // type is the type of the data ingestion. + // we currently support rest, artifact and builtin. + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + // rest is the rest data ingestion. + // this is only used if the type is rest. + Rest *RestType `protobuf:"bytes,3,opt,name=rest,proto3,oneof" json:"rest,omitempty"` + // builtin is the builtin data ingestion. + Builtin *BuiltinType `protobuf:"bytes,4,opt,name=builtin,proto3,oneof" json:"builtin,omitempty"` + // artifact is the artifact data ingestion. + // artifact currently only applies to artifacts. + Artifact *ArtifactType `protobuf:"bytes,5,opt,name=artifact,proto3,oneof" json:"artifact,omitempty"` + // git is the git data ingestion. + // git currently only applies to repositories. + Git *GitType `protobuf:"bytes,6,opt,name=git,proto3,oneof" json:"git,omitempty"` + // diff is the diff data ingestion. + // diff currently only applies to pull_requests. + Diff *DiffType `protobuf:"bytes,7,opt,name=diff,proto3,oneof" json:"diff,omitempty"` + // deps is the deps data ingestion. + // deps currently only applies to repositories. + Deps *DepsType `protobuf:"bytes,8,opt,name=deps,proto3,oneof" json:"deps,omitempty"` unknownFields protoimpl.UnknownFields - - Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` - Error *string `protobuf:"bytes,2,opt,name=error,proto3,oneof" json:"error,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *RegisterRepoResult_Status) Reset() { - *x = RegisterRepoResult_Status{} - mi := &file_minder_v1_minder_proto_msgTypes[177] +func (x *RuleType_Definition_Ingest) Reset() { + *x = RuleType_Definition_Ingest{} + mi := &file_minder_v1_minder_proto_msgTypes[202] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RegisterRepoResult_Status) String() string { +func (x *RuleType_Definition_Ingest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RegisterRepoResult_Status) ProtoMessage() {} +func (*RuleType_Definition_Ingest) ProtoMessage() {} -func (x *RegisterRepoResult_Status) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[177] +func (x *RuleType_Definition_Ingest) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[202] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11392,105 +12536,106 @@ func (x *RegisterRepoResult_Status) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RegisterRepoResult_Status.ProtoReflect.Descriptor instead. -func (*RegisterRepoResult_Status) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{31, 0} +// Deprecated: Use RuleType_Definition_Ingest.ProtoReflect.Descriptor instead. +func (*RuleType_Definition_Ingest) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{124, 0, 0} } -func (x *RegisterRepoResult_Status) GetSuccess() bool { +func (x *RuleType_Definition_Ingest) GetType() string { if x != nil { - return x.Success - } - return false -} - -func (x *RegisterRepoResult_Status) GetError() string { - if x != nil && x.Error != nil { - return *x.Error + return x.Type } return "" } -type ListEvaluationResultsResponse_EntityProfileEvaluationResults struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // profile_status is the status of the profile - id, name, status, last_updated - ProfileStatus *ProfileStatus `protobuf:"bytes,1,opt,name=profile_status,json=profileStatus,proto3" json:"profile_status,omitempty"` - // Note that some fields like profile_id and entity might be empty - // Eventually we might replace this type with another one that fits the API better - Results []*RuleEvaluationStatus `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"` -} - -func (x *ListEvaluationResultsResponse_EntityProfileEvaluationResults) Reset() { - *x = ListEvaluationResultsResponse_EntityProfileEvaluationResults{} - mi := &file_minder_v1_minder_proto_msgTypes[180] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *RuleType_Definition_Ingest) GetRest() *RestType { + if x != nil { + return x.Rest + } + return nil } -func (x *ListEvaluationResultsResponse_EntityProfileEvaluationResults) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *RuleType_Definition_Ingest) GetBuiltin() *BuiltinType { + if x != nil { + return x.Builtin + } + return nil } -func (*ListEvaluationResultsResponse_EntityProfileEvaluationResults) ProtoMessage() {} - -func (x *ListEvaluationResultsResponse_EntityProfileEvaluationResults) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[180] +func (x *RuleType_Definition_Ingest) GetArtifact() *ArtifactType { if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms + return x.Artifact } - return mi.MessageOf(x) + return nil } -// Deprecated: Use ListEvaluationResultsResponse_EntityProfileEvaluationResults.ProtoReflect.Descriptor instead. -func (*ListEvaluationResultsResponse_EntityProfileEvaluationResults) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{104, 0} +func (x *RuleType_Definition_Ingest) GetGit() *GitType { + if x != nil { + return x.Git + } + return nil } -func (x *ListEvaluationResultsResponse_EntityProfileEvaluationResults) GetProfileStatus() *ProfileStatus { +func (x *RuleType_Definition_Ingest) GetDiff() *DiffType { if x != nil { - return x.ProfileStatus + return x.Diff } return nil } -func (x *ListEvaluationResultsResponse_EntityProfileEvaluationResults) GetResults() []*RuleEvaluationStatus { +func (x *RuleType_Definition_Ingest) GetDeps() *DepsType { if x != nil { - return x.Results + return x.Deps } return nil } -type ListEvaluationResultsResponse_EntityEvaluationResults struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// Eval defines the data evaluation definition. +// This pertains to the way we traverse data from the upstream +// endpoint and how we compare it to the rule. +type RuleType_Definition_Eval struct { + state protoimpl.MessageState `protogen:"open.v1"` + // type is the type of the data evaluation. + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + // jq is only used if the `jq` type is selected. + // It defines the comparisons that are made between + // the ingested data and the profile rule. + Jq []*RuleType_Definition_Eval_JQComparison `protobuf:"bytes,2,rep,name=jq,proto3" json:"jq,omitempty"` + // rego is only used if the `rego` type is selected. + Rego *RuleType_Definition_Eval_Rego `protobuf:"bytes,3,opt,name=rego,proto3,oneof" json:"rego,omitempty"` + // vulncheck is only used if the `vulncheck` type is selected. + Vulncheck *RuleType_Definition_Eval_Vulncheck `protobuf:"bytes,4,opt,name=vulncheck,proto3,oneof" json:"vulncheck,omitempty"` + // The trusty type is no longer used, but is still here for backwards + // compatibility with existing stored rules + Trusty *RuleType_Definition_Eval_Trusty `protobuf:"bytes,5,opt,name=trusty,proto3,oneof" json:"trusty,omitempty"` + // homoglyphs is only used if the `homoglyphs` type is selected. + Homoglyphs *RuleType_Definition_Eval_Homoglyphs `protobuf:"bytes,6,opt,name=homoglyphs,proto3,oneof" json:"homoglyphs,omitempty"` + // Data sources that the rule refers to. These are used to + // instantiate the relevant data sources for the rule and keep + // track of them as dependencies. + // + // Note that the data source must exist in the project hierarchy + // in order to be used in the rule. + DataSources []*DataSourceReference `protobuf:"bytes,7,rep,name=data_sources,json=dataSources,proto3" json:"data_sources,omitempty"` unknownFields protoimpl.UnknownFields - - Entity *EntityTypedId `protobuf:"bytes,1,opt,name=entity,proto3" json:"entity,omitempty"` - Profiles []*ListEvaluationResultsResponse_EntityProfileEvaluationResults `protobuf:"bytes,2,rep,name=profiles,proto3" json:"profiles,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *ListEvaluationResultsResponse_EntityEvaluationResults) Reset() { - *x = ListEvaluationResultsResponse_EntityEvaluationResults{} - mi := &file_minder_v1_minder_proto_msgTypes[181] +func (x *RuleType_Definition_Eval) Reset() { + *x = RuleType_Definition_Eval{} + mi := &file_minder_v1_minder_proto_msgTypes[203] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListEvaluationResultsResponse_EntityEvaluationResults) String() string { +func (x *RuleType_Definition_Eval) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListEvaluationResultsResponse_EntityEvaluationResults) ProtoMessage() {} +func (*RuleType_Definition_Eval) ProtoMessage() {} -func (x *ListEvaluationResultsResponse_EntityEvaluationResults) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[181] +func (x *RuleType_Definition_Eval) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[203] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11501,49 +12646,85 @@ func (x *ListEvaluationResultsResponse_EntityEvaluationResults) ProtoReflect() p return mi.MessageOf(x) } -// Deprecated: Use ListEvaluationResultsResponse_EntityEvaluationResults.ProtoReflect.Descriptor instead. -func (*ListEvaluationResultsResponse_EntityEvaluationResults) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{104, 1} +// Deprecated: Use RuleType_Definition_Eval.ProtoReflect.Descriptor instead. +func (*RuleType_Definition_Eval) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{124, 0, 1} } -func (x *ListEvaluationResultsResponse_EntityEvaluationResults) GetEntity() *EntityTypedId { +func (x *RuleType_Definition_Eval) GetType() string { if x != nil { - return x.Entity + return x.Type + } + return "" +} + +func (x *RuleType_Definition_Eval) GetJq() []*RuleType_Definition_Eval_JQComparison { + if x != nil { + return x.Jq } return nil } -func (x *ListEvaluationResultsResponse_EntityEvaluationResults) GetProfiles() []*ListEvaluationResultsResponse_EntityProfileEvaluationResults { +func (x *RuleType_Definition_Eval) GetRego() *RuleType_Definition_Eval_Rego { if x != nil { - return x.Profiles + return x.Rego } return nil } -type RestType_Fallback struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *RuleType_Definition_Eval) GetVulncheck() *RuleType_Definition_Eval_Vulncheck { + if x != nil { + return x.Vulncheck + } + return nil +} - HttpCode int32 `protobuf:"varint,1,opt,name=http_code,json=httpCode,proto3" json:"http_code,omitempty"` - Body string `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"` +func (x *RuleType_Definition_Eval) GetTrusty() *RuleType_Definition_Eval_Trusty { + if x != nil { + return x.Trusty + } + return nil } -func (x *RestType_Fallback) Reset() { - *x = RestType_Fallback{} - mi := &file_minder_v1_minder_proto_msgTypes[182] +func (x *RuleType_Definition_Eval) GetHomoglyphs() *RuleType_Definition_Eval_Homoglyphs { + if x != nil { + return x.Homoglyphs + } + return nil +} + +func (x *RuleType_Definition_Eval) GetDataSources() []*DataSourceReference { + if x != nil { + return x.DataSources + } + return nil +} + +type RuleType_Definition_Remediate struct { + state protoimpl.MessageState `protogen:"open.v1"` + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Rest *RestType `protobuf:"bytes,2,opt,name=rest,proto3,oneof" json:"rest,omitempty"` + GhBranchProtection *RuleType_Definition_Remediate_GhBranchProtectionType `protobuf:"bytes,3,opt,name=gh_branch_protection,json=ghBranchProtection,proto3,oneof" json:"gh_branch_protection,omitempty"` + PullRequest *RuleType_Definition_Remediate_PullRequestRemediation `protobuf:"bytes,4,opt,name=pull_request,json=pullRequest,proto3,oneof" json:"pull_request,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RuleType_Definition_Remediate) Reset() { + *x = RuleType_Definition_Remediate{} + mi := &file_minder_v1_minder_proto_msgTypes[204] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RestType_Fallback) String() string { +func (x *RuleType_Definition_Remediate) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RestType_Fallback) ProtoMessage() {} +func (*RuleType_Definition_Remediate) ProtoMessage() {} -func (x *RestType_Fallback) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[182] +func (x *RuleType_Definition_Remediate) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[204] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11554,51 +12735,63 @@ func (x *RestType_Fallback) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RestType_Fallback.ProtoReflect.Descriptor instead. -func (*RestType_Fallback) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{105, 0} +// Deprecated: Use RuleType_Definition_Remediate.ProtoReflect.Descriptor instead. +func (*RuleType_Definition_Remediate) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{124, 0, 2} } -func (x *RestType_Fallback) GetHttpCode() int32 { +func (x *RuleType_Definition_Remediate) GetType() string { if x != nil { - return x.HttpCode + return x.Type } - return 0 + return "" } -func (x *RestType_Fallback) GetBody() string { +func (x *RuleType_Definition_Remediate) GetRest() *RestType { if x != nil { - return x.Body + return x.Rest } - return "" + return nil } -type DiffType_Ecosystem struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *RuleType_Definition_Remediate) GetGhBranchProtection() *RuleType_Definition_Remediate_GhBranchProtectionType { + if x != nil { + return x.GhBranchProtection + } + return nil +} - // name is the name of the ecosystem. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // depfile is the file that contains the dependencies for this ecosystem - Depfile string `protobuf:"bytes,2,opt,name=depfile,proto3" json:"depfile,omitempty"` +func (x *RuleType_Definition_Remediate) GetPullRequest() *RuleType_Definition_Remediate_PullRequestRemediation { + if x != nil { + return x.PullRequest + } + return nil } -func (x *DiffType_Ecosystem) Reset() { - *x = DiffType_Ecosystem{} - mi := &file_minder_v1_minder_proto_msgTypes[183] +type RuleType_Definition_Alert struct { + state protoimpl.MessageState `protogen:"open.v1"` + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + SecurityAdvisory *RuleType_Definition_Alert_AlertTypeSA `protobuf:"bytes,2,opt,name=security_advisory,json=securityAdvisory,proto3,oneof" json:"security_advisory,omitempty"` + PullRequestComment *RuleType_Definition_Alert_AlertTypePRComment `protobuf:"bytes,3,opt,name=pull_request_comment,json=pullRequestComment,proto3,oneof" json:"pull_request_comment,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RuleType_Definition_Alert) Reset() { + *x = RuleType_Definition_Alert{} + mi := &file_minder_v1_minder_proto_msgTypes[205] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *DiffType_Ecosystem) String() string { +func (x *RuleType_Definition_Alert) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DiffType_Ecosystem) ProtoMessage() {} +func (*RuleType_Definition_Alert) ProtoMessage() {} -func (x *DiffType_Ecosystem) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[183] +func (x *RuleType_Definition_Alert) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[205] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11609,60 +12802,61 @@ func (x *DiffType_Ecosystem) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DiffType_Ecosystem.ProtoReflect.Descriptor instead. -func (*DiffType_Ecosystem) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{109, 0} +// Deprecated: Use RuleType_Definition_Alert.ProtoReflect.Descriptor instead. +func (*RuleType_Definition_Alert) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{124, 0, 3} } -func (x *DiffType_Ecosystem) GetName() string { +func (x *RuleType_Definition_Alert) GetType() string { if x != nil { - return x.Name + return x.Type } return "" } -func (x *DiffType_Ecosystem) GetDepfile() string { +func (x *RuleType_Definition_Alert) GetSecurityAdvisory() *RuleType_Definition_Alert_AlertTypeSA { if x != nil { - return x.Depfile + return x.SecurityAdvisory } - return "" + return nil } -// Definition defines the rule type. It encompases the schema and the data evaluation. -type RuleType_Definition struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *RuleType_Definition_Alert) GetPullRequestComment() *RuleType_Definition_Alert_AlertTypePRComment { + if x != nil { + return x.PullRequestComment + } + return nil +} - // in_entity is the entity in which the rule is evaluated. - // This can be repository, build_environment or artifact. - InEntity string `protobuf:"bytes,1,opt,name=in_entity,json=inEntity,proto3" json:"in_entity,omitempty"` - // rule_schema is the schema of the rule. This is expressed in JSON Schema. - RuleSchema *structpb.Struct `protobuf:"bytes,2,opt,name=rule_schema,json=ruleSchema,proto3" json:"rule_schema,omitempty"` - // param_schema is the schema of the parameters that are passed to the rule. - // This is expressed in JSON Schema. - ParamSchema *structpb.Struct `protobuf:"bytes,3,opt,name=param_schema,json=paramSchema,proto3,oneof" json:"param_schema,omitempty"` - Ingest *RuleType_Definition_Ingest `protobuf:"bytes,4,opt,name=ingest,proto3" json:"ingest,omitempty"` - Eval *RuleType_Definition_Eval `protobuf:"bytes,5,opt,name=eval,proto3" json:"eval,omitempty"` - Remediate *RuleType_Definition_Remediate `protobuf:"bytes,6,opt,name=remediate,proto3" json:"remediate,omitempty"` - Alert *RuleType_Definition_Alert `protobuf:"bytes,7,opt,name=alert,proto3" json:"alert,omitempty"` +type RuleType_Definition_Eval_JQComparison struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Ingested points to the data retrieved in the `ingest` section + Ingested *RuleType_Definition_Eval_JQComparison_Operator `protobuf:"bytes,1,opt,name=ingested,proto3" json:"ingested,omitempty"` + // Profile points to the profile itself. + // This is mutually exclusive with the `constant` field. + Profile *RuleType_Definition_Eval_JQComparison_Operator `protobuf:"bytes,2,opt,name=profile,proto3" json:"profile,omitempty"` + // Constant points to a constant value. + // This is mutually exclusive with the `profile` field. + Constant *structpb.Value `protobuf:"bytes,3,opt,name=constant,proto3" json:"constant,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *RuleType_Definition) Reset() { - *x = RuleType_Definition{} - mi := &file_minder_v1_minder_proto_msgTypes[184] +func (x *RuleType_Definition_Eval_JQComparison) Reset() { + *x = RuleType_Definition_Eval_JQComparison{} + mi := &file_minder_v1_minder_proto_msgTypes[206] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RuleType_Definition) String() string { +func (x *RuleType_Definition_Eval_JQComparison) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RuleType_Definition) ProtoMessage() {} +func (*RuleType_Definition_Eval_JQComparison) ProtoMessage() {} -func (x *RuleType_Definition) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[184] +func (x *RuleType_Definition_Eval_JQComparison) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[206] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11673,97 +12867,71 @@ func (x *RuleType_Definition) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RuleType_Definition.ProtoReflect.Descriptor instead. -func (*RuleType_Definition) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{111, 0} -} - -func (x *RuleType_Definition) GetInEntity() string { - if x != nil { - return x.InEntity - } - return "" -} - -func (x *RuleType_Definition) GetRuleSchema() *structpb.Struct { - if x != nil { - return x.RuleSchema - } - return nil -} - -func (x *RuleType_Definition) GetParamSchema() *structpb.Struct { - if x != nil { - return x.ParamSchema - } - return nil -} - -func (x *RuleType_Definition) GetIngest() *RuleType_Definition_Ingest { - if x != nil { - return x.Ingest - } - return nil +// Deprecated: Use RuleType_Definition_Eval_JQComparison.ProtoReflect.Descriptor instead. +func (*RuleType_Definition_Eval_JQComparison) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{124, 0, 1, 0} } -func (x *RuleType_Definition) GetEval() *RuleType_Definition_Eval { +func (x *RuleType_Definition_Eval_JQComparison) GetIngested() *RuleType_Definition_Eval_JQComparison_Operator { if x != nil { - return x.Eval + return x.Ingested } return nil } -func (x *RuleType_Definition) GetRemediate() *RuleType_Definition_Remediate { +func (x *RuleType_Definition_Eval_JQComparison) GetProfile() *RuleType_Definition_Eval_JQComparison_Operator { if x != nil { - return x.Remediate + return x.Profile } return nil } -func (x *RuleType_Definition) GetAlert() *RuleType_Definition_Alert { +func (x *RuleType_Definition_Eval_JQComparison) GetConstant() *structpb.Value { if x != nil { - return x.Alert + return x.Constant } return nil } -// Ingest defines how the data is ingested. -type RuleType_Definition_Ingest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // type is the type of the data ingestion. - // we currently support rest, artifact and builtin. +type RuleType_Definition_Eval_Rego struct { + state protoimpl.MessageState `protogen:"open.v1"` + // type is the type of evaluation engine to use + // for rego. We currently have two modes of operation: + // - deny-by-default: this is the default mode of operation + // where we deny access by default and allow access only + // if the profile explicitly allows it. It expects the + // profile to set an `allow` variable to true or false. + // - constraints: this is the mode of operation where we + // allow access by default and deny access only if a + // violation is found. It expects the profile to set a + // `violations` variable with a "msg" field. Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - // rest is the rest data ingestion. - // this is only used if the type is rest. - Rest *RestType `protobuf:"bytes,3,opt,name=rest,proto3,oneof" json:"rest,omitempty"` - // builtin is the builtin data ingestion. - Builtin *BuiltinType `protobuf:"bytes,4,opt,name=builtin,proto3,oneof" json:"builtin,omitempty"` - // artifact is the artifact data ingestion. - Artifact *ArtifactType `protobuf:"bytes,5,opt,name=artifact,proto3,oneof" json:"artifact,omitempty"` - // git is the git data ingestion. - Git *GitType `protobuf:"bytes,6,opt,name=git,proto3,oneof" json:"git,omitempty"` - // diff is the diff data ingestion. - Diff *DiffType `protobuf:"bytes,7,opt,name=diff,proto3,oneof" json:"diff,omitempty"` + // def is the definition of the rego profile. + Def string `protobuf:"bytes,2,opt,name=def,proto3" json:"def,omitempty"` + // how are violations reported. This is only used if the + // `constraints` type is selected. The default is `text` + // which returns human-readable text. The other option is + // `json` which returns a JSON array containing the violations. + ViolationFormat *string `protobuf:"bytes,3,opt,name=violation_format,json=violationFormat,proto3,oneof" json:"violation_format,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *RuleType_Definition_Ingest) Reset() { - *x = RuleType_Definition_Ingest{} - mi := &file_minder_v1_minder_proto_msgTypes[185] +func (x *RuleType_Definition_Eval_Rego) Reset() { + *x = RuleType_Definition_Eval_Rego{} + mi := &file_minder_v1_minder_proto_msgTypes[207] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RuleType_Definition_Ingest) String() string { +func (x *RuleType_Definition_Eval_Rego) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RuleType_Definition_Ingest) ProtoMessage() {} +func (*RuleType_Definition_Eval_Rego) ProtoMessage() {} -func (x *RuleType_Definition_Ingest) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[185] +func (x *RuleType_Definition_Eval_Rego) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[207] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11774,94 +12942,53 @@ func (x *RuleType_Definition_Ingest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RuleType_Definition_Ingest.ProtoReflect.Descriptor instead. -func (*RuleType_Definition_Ingest) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{111, 0, 0} +// Deprecated: Use RuleType_Definition_Eval_Rego.ProtoReflect.Descriptor instead. +func (*RuleType_Definition_Eval_Rego) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{124, 0, 1, 1} } -func (x *RuleType_Definition_Ingest) GetType() string { +func (x *RuleType_Definition_Eval_Rego) GetType() string { if x != nil { return x.Type } return "" } -func (x *RuleType_Definition_Ingest) GetRest() *RestType { - if x != nil { - return x.Rest - } - return nil -} - -func (x *RuleType_Definition_Ingest) GetBuiltin() *BuiltinType { - if x != nil { - return x.Builtin - } - return nil -} - -func (x *RuleType_Definition_Ingest) GetArtifact() *ArtifactType { - if x != nil { - return x.Artifact - } - return nil -} - -func (x *RuleType_Definition_Ingest) GetGit() *GitType { +func (x *RuleType_Definition_Eval_Rego) GetDef() string { if x != nil { - return x.Git + return x.Def } - return nil + return "" } -func (x *RuleType_Definition_Ingest) GetDiff() *DiffType { - if x != nil { - return x.Diff +func (x *RuleType_Definition_Eval_Rego) GetViolationFormat() string { + if x != nil && x.ViolationFormat != nil { + return *x.ViolationFormat } - return nil + return "" } -// Eval defines the data evaluation definition. -// This pertains to the way we traverse data from the upstream -// endpoint and how we compare it to the rule. -type RuleType_Definition_Eval struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type RuleType_Definition_Eval_Vulncheck struct { + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields - - // type is the type of the data evaluation. - // Right now only `jq` is supported as a driver - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - // jq is only used if the `jq` type is selected. - // It defines the comparisons that are made between - // the ingested data and the profile rule. - Jq []*RuleType_Definition_Eval_JQComparison `protobuf:"bytes,2,rep,name=jq,proto3" json:"jq,omitempty"` - // rego is only used if the `rego` type is selected. - Rego *RuleType_Definition_Eval_Rego `protobuf:"bytes,3,opt,name=rego,proto3,oneof" json:"rego,omitempty"` - // vulncheck is only used if the `vulncheck` type is selected. - Vulncheck *RuleType_Definition_Eval_Vulncheck `protobuf:"bytes,4,opt,name=vulncheck,proto3,oneof" json:"vulncheck,omitempty"` - // The trusty type is no longer used, but is still here for backwards - // compatibility with existing stored rules - Trusty *RuleType_Definition_Eval_Trusty `protobuf:"bytes,5,opt,name=trusty,proto3,oneof" json:"trusty,omitempty"` - // homoglyphs is only used if the `homoglyphs` type is selected. - Homoglyphs *RuleType_Definition_Eval_Homoglyphs `protobuf:"bytes,6,opt,name=homoglyphs,proto3,oneof" json:"homoglyphs,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *RuleType_Definition_Eval) Reset() { - *x = RuleType_Definition_Eval{} - mi := &file_minder_v1_minder_proto_msgTypes[186] +func (x *RuleType_Definition_Eval_Vulncheck) Reset() { + *x = RuleType_Definition_Eval_Vulncheck{} + mi := &file_minder_v1_minder_proto_msgTypes[208] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RuleType_Definition_Eval) String() string { +func (x *RuleType_Definition_Eval_Vulncheck) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RuleType_Definition_Eval) ProtoMessage() {} +func (*RuleType_Definition_Eval_Vulncheck) ProtoMessage() {} -func (x *RuleType_Definition_Eval) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[186] +func (x *RuleType_Definition_Eval_Vulncheck) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[208] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11872,79 +12999,79 @@ func (x *RuleType_Definition_Eval) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RuleType_Definition_Eval.ProtoReflect.Descriptor instead. -func (*RuleType_Definition_Eval) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{111, 0, 1} +// Deprecated: Use RuleType_Definition_Eval_Vulncheck.ProtoReflect.Descriptor instead. +func (*RuleType_Definition_Eval_Vulncheck) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{124, 0, 1, 2} } -func (x *RuleType_Definition_Eval) GetType() string { - if x != nil { - return x.Type - } - return "" +type RuleType_Definition_Eval_Trusty struct { + state protoimpl.MessageState `protogen:"open.v1"` + // This is no longer used, but is still here for backwards + // compatibility with existing stored rules + Endpoint string `protobuf:"bytes,1,opt,name=endpoint,proto3" json:"endpoint,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *RuleType_Definition_Eval) GetJq() []*RuleType_Definition_Eval_JQComparison { - if x != nil { - return x.Jq - } - return nil +func (x *RuleType_Definition_Eval_Trusty) Reset() { + *x = RuleType_Definition_Eval_Trusty{} + mi := &file_minder_v1_minder_proto_msgTypes[209] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *RuleType_Definition_Eval) GetRego() *RuleType_Definition_Eval_Rego { - if x != nil { - return x.Rego - } - return nil +func (x *RuleType_Definition_Eval_Trusty) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *RuleType_Definition_Eval) GetVulncheck() *RuleType_Definition_Eval_Vulncheck { +func (*RuleType_Definition_Eval_Trusty) ProtoMessage() {} + +func (x *RuleType_Definition_Eval_Trusty) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[209] if x != nil { - return x.Vulncheck + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *RuleType_Definition_Eval) GetTrusty() *RuleType_Definition_Eval_Trusty { - if x != nil { - return x.Trusty - } - return nil +// Deprecated: Use RuleType_Definition_Eval_Trusty.ProtoReflect.Descriptor instead. +func (*RuleType_Definition_Eval_Trusty) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{124, 0, 1, 3} } -func (x *RuleType_Definition_Eval) GetHomoglyphs() *RuleType_Definition_Eval_Homoglyphs { +func (x *RuleType_Definition_Eval_Trusty) GetEndpoint() string { if x != nil { - return x.Homoglyphs + return x.Endpoint } - return nil + return "" } -type RuleType_Definition_Remediate struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type RuleType_Definition_Eval_Homoglyphs struct { + state protoimpl.MessageState `protogen:"open.v1"` + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` unknownFields protoimpl.UnknownFields - - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - Rest *RestType `protobuf:"bytes,2,opt,name=rest,proto3,oneof" json:"rest,omitempty"` - GhBranchProtection *RuleType_Definition_Remediate_GhBranchProtectionType `protobuf:"bytes,3,opt,name=gh_branch_protection,json=ghBranchProtection,proto3,oneof" json:"gh_branch_protection,omitempty"` - PullRequest *RuleType_Definition_Remediate_PullRequestRemediation `protobuf:"bytes,4,opt,name=pull_request,json=pullRequest,proto3,oneof" json:"pull_request,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *RuleType_Definition_Remediate) Reset() { - *x = RuleType_Definition_Remediate{} - mi := &file_minder_v1_minder_proto_msgTypes[187] +func (x *RuleType_Definition_Eval_Homoglyphs) Reset() { + *x = RuleType_Definition_Eval_Homoglyphs{} + mi := &file_minder_v1_minder_proto_msgTypes[210] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RuleType_Definition_Remediate) String() string { +func (x *RuleType_Definition_Eval_Homoglyphs) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RuleType_Definition_Remediate) ProtoMessage() {} +func (*RuleType_Definition_Eval_Homoglyphs) ProtoMessage() {} -func (x *RuleType_Definition_Remediate) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[187] +func (x *RuleType_Definition_Eval_Homoglyphs) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[210] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11955,63 +13082,40 @@ func (x *RuleType_Definition_Remediate) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RuleType_Definition_Remediate.ProtoReflect.Descriptor instead. -func (*RuleType_Definition_Remediate) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{111, 0, 2} +// Deprecated: Use RuleType_Definition_Eval_Homoglyphs.ProtoReflect.Descriptor instead. +func (*RuleType_Definition_Eval_Homoglyphs) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{124, 0, 1, 4} } -func (x *RuleType_Definition_Remediate) GetType() string { +func (x *RuleType_Definition_Eval_Homoglyphs) GetType() string { if x != nil { return x.Type } return "" } -func (x *RuleType_Definition_Remediate) GetRest() *RestType { - if x != nil { - return x.Rest - } - return nil -} - -func (x *RuleType_Definition_Remediate) GetGhBranchProtection() *RuleType_Definition_Remediate_GhBranchProtectionType { - if x != nil { - return x.GhBranchProtection - } - return nil -} - -func (x *RuleType_Definition_Remediate) GetPullRequest() *RuleType_Definition_Remediate_PullRequestRemediation { - if x != nil { - return x.PullRequest - } - return nil -} - -type RuleType_Definition_Alert struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type RuleType_Definition_Eval_JQComparison_Operator struct { + state protoimpl.MessageState `protogen:"open.v1"` + Def string `protobuf:"bytes,1,opt,name=def,proto3" json:"def,omitempty"` unknownFields protoimpl.UnknownFields - - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - SecurityAdvisory *RuleType_Definition_Alert_AlertTypeSA `protobuf:"bytes,2,opt,name=security_advisory,json=securityAdvisory,proto3,oneof" json:"security_advisory,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *RuleType_Definition_Alert) Reset() { - *x = RuleType_Definition_Alert{} - mi := &file_minder_v1_minder_proto_msgTypes[188] +func (x *RuleType_Definition_Eval_JQComparison_Operator) Reset() { + *x = RuleType_Definition_Eval_JQComparison_Operator{} + mi := &file_minder_v1_minder_proto_msgTypes[211] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RuleType_Definition_Alert) String() string { +func (x *RuleType_Definition_Eval_JQComparison_Operator) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RuleType_Definition_Alert) ProtoMessage() {} +func (*RuleType_Definition_Eval_JQComparison_Operator) ProtoMessage() {} -func (x *RuleType_Definition_Alert) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[188] +func (x *RuleType_Definition_Eval_JQComparison_Operator) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[211] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12022,53 +13126,40 @@ func (x *RuleType_Definition_Alert) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RuleType_Definition_Alert.ProtoReflect.Descriptor instead. -func (*RuleType_Definition_Alert) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{111, 0, 3} +// Deprecated: Use RuleType_Definition_Eval_JQComparison_Operator.ProtoReflect.Descriptor instead. +func (*RuleType_Definition_Eval_JQComparison_Operator) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{124, 0, 1, 0, 0} } -func (x *RuleType_Definition_Alert) GetType() string { +func (x *RuleType_Definition_Eval_JQComparison_Operator) GetDef() string { if x != nil { - return x.Type + return x.Def } return "" } -func (x *RuleType_Definition_Alert) GetSecurityAdvisory() *RuleType_Definition_Alert_AlertTypeSA { - if x != nil { - return x.SecurityAdvisory - } - return nil -} - -type RuleType_Definition_Eval_JQComparison struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type RuleType_Definition_Remediate_GhBranchProtectionType struct { + state protoimpl.MessageState `protogen:"open.v1"` + Patch string `protobuf:"bytes,1,opt,name=patch,proto3" json:"patch,omitempty"` unknownFields protoimpl.UnknownFields - - // Ingested points to the data retrieved in the `ingest` section - Ingested *RuleType_Definition_Eval_JQComparison_Operator `protobuf:"bytes,1,opt,name=ingested,proto3" json:"ingested,omitempty"` - // Profile points to the profile itself. - Profile *RuleType_Definition_Eval_JQComparison_Operator `protobuf:"bytes,2,opt,name=profile,proto3" json:"profile,omitempty"` - // Constant points to a constant value - Constant *structpb.Value `protobuf:"bytes,3,opt,name=constant,proto3" json:"constant,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *RuleType_Definition_Eval_JQComparison) Reset() { - *x = RuleType_Definition_Eval_JQComparison{} - mi := &file_minder_v1_minder_proto_msgTypes[189] +func (x *RuleType_Definition_Remediate_GhBranchProtectionType) Reset() { + *x = RuleType_Definition_Remediate_GhBranchProtectionType{} + mi := &file_minder_v1_minder_proto_msgTypes[212] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RuleType_Definition_Eval_JQComparison) String() string { +func (x *RuleType_Definition_Remediate_GhBranchProtectionType) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RuleType_Definition_Eval_JQComparison) ProtoMessage() {} +func (*RuleType_Definition_Remediate_GhBranchProtectionType) ProtoMessage() {} -func (x *RuleType_Definition_Eval_JQComparison) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[189] +func (x *RuleType_Definition_Remediate_GhBranchProtectionType) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[212] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12079,72 +13170,66 @@ func (x *RuleType_Definition_Eval_JQComparison) ProtoReflect() protoreflect.Mess return mi.MessageOf(x) } -// Deprecated: Use RuleType_Definition_Eval_JQComparison.ProtoReflect.Descriptor instead. -func (*RuleType_Definition_Eval_JQComparison) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{111, 0, 1, 0} -} - -func (x *RuleType_Definition_Eval_JQComparison) GetIngested() *RuleType_Definition_Eval_JQComparison_Operator { - if x != nil { - return x.Ingested - } - return nil -} - -func (x *RuleType_Definition_Eval_JQComparison) GetProfile() *RuleType_Definition_Eval_JQComparison_Operator { - if x != nil { - return x.Profile - } - return nil +// Deprecated: Use RuleType_Definition_Remediate_GhBranchProtectionType.ProtoReflect.Descriptor instead. +func (*RuleType_Definition_Remediate_GhBranchProtectionType) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{124, 0, 2, 0} } -func (x *RuleType_Definition_Eval_JQComparison) GetConstant() *structpb.Value { +func (x *RuleType_Definition_Remediate_GhBranchProtectionType) GetPatch() string { if x != nil { - return x.Constant + return x.Patch } - return nil + return "" } -type RuleType_Definition_Eval_Rego struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // type is the type of evaluation engine to use - // for rego. We currently have two modes of operation: - // - deny-by-default: this is the default mode of operation - // where we deny access by default and allow access only - // if the profile explicitly allows it. It expects the - // profile to set an `allow` variable to true or false. - // - constraints: this is the mode of operation where we - // allow access by default and deny access only if a - // violation is found. It expects the profile to set a - // `violations` variable with a "msg" field. - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - // def is the definition of the rego profile. - Def string `protobuf:"bytes,2,opt,name=def,proto3" json:"def,omitempty"` - // how are violations reported. This is only used if the - // `constraints` type is selected. The default is `text` - // which returns human-readable text. The other option is - // `json` which returns a JSON array containing the violations. - ViolationFormat *string `protobuf:"bytes,3,opt,name=violation_format,json=violationFormat,proto3,oneof" json:"violation_format,omitempty"` +// the name stutters a bit but we already use a PullRequest message for handling PR entities +type RuleType_Definition_Remediate_PullRequestRemediation struct { + state protoimpl.MessageState `protogen:"open.v1"` + // the title of the PR + // This is not validated here as it will be validated by the repository provider, i.e. GitHub upon + // creation of the PR. + Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + // the body of the PR + // This is not validated here as it will be validated by the repository provider, i.e. GitHub upon + // creation of the PR. + Body string `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"` + Contents []*RuleType_Definition_Remediate_PullRequestRemediation_Content `protobuf:"bytes,3,rep,name=contents,proto3" json:"contents,omitempty"` + // the method to use to create the PR. For now, these are supported: + // -- minder.content - ensures that the content of the file is exactly as specified + // + // refer to the Content message for more details + // + // -- minder.actions.replace_tags_with_sha - finds any github actions within a workflow + // + // file and replaces the tag with the SHA + // + // -- minder.yq.evaluate - evaluates a yq expression on a file + Method string `protobuf:"bytes,4,opt,name=method,proto3" json:"method,omitempty"` + // params are unstructured parameters passed to the method. These are optional + // and evaluated by the method. + Params *structpb.Struct `protobuf:"bytes,6,opt,name=params,proto3" json:"params,omitempty"` + // If the method is minder.actions.replace_tags_with_sha, this is the configuration + // for that method + ActionsReplaceTagsWithSha *RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha `protobuf:"bytes,5,opt,name=actions_replace_tags_with_sha,json=actionsReplaceTagsWithSha,proto3,oneof" json:"actions_replace_tags_with_sha,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *RuleType_Definition_Eval_Rego) Reset() { - *x = RuleType_Definition_Eval_Rego{} - mi := &file_minder_v1_minder_proto_msgTypes[190] +func (x *RuleType_Definition_Remediate_PullRequestRemediation) Reset() { + *x = RuleType_Definition_Remediate_PullRequestRemediation{} + mi := &file_minder_v1_minder_proto_msgTypes[213] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RuleType_Definition_Eval_Rego) String() string { +func (x *RuleType_Definition_Remediate_PullRequestRemediation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RuleType_Definition_Eval_Rego) ProtoMessage() {} +func (*RuleType_Definition_Remediate_PullRequestRemediation) ProtoMessage() {} -func (x *RuleType_Definition_Eval_Rego) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[190] +func (x *RuleType_Definition_Remediate_PullRequestRemediation) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[213] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12155,53 +13240,85 @@ func (x *RuleType_Definition_Eval_Rego) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RuleType_Definition_Eval_Rego.ProtoReflect.Descriptor instead. -func (*RuleType_Definition_Eval_Rego) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{111, 0, 1, 1} +// Deprecated: Use RuleType_Definition_Remediate_PullRequestRemediation.ProtoReflect.Descriptor instead. +func (*RuleType_Definition_Remediate_PullRequestRemediation) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{124, 0, 2, 1} } -func (x *RuleType_Definition_Eval_Rego) GetType() string { +func (x *RuleType_Definition_Remediate_PullRequestRemediation) GetTitle() string { if x != nil { - return x.Type + return x.Title } return "" } -func (x *RuleType_Definition_Eval_Rego) GetDef() string { +func (x *RuleType_Definition_Remediate_PullRequestRemediation) GetBody() string { if x != nil { - return x.Def + return x.Body } return "" } -func (x *RuleType_Definition_Eval_Rego) GetViolationFormat() string { - if x != nil && x.ViolationFormat != nil { - return *x.ViolationFormat +func (x *RuleType_Definition_Remediate_PullRequestRemediation) GetContents() []*RuleType_Definition_Remediate_PullRequestRemediation_Content { + if x != nil { + return x.Contents + } + return nil +} + +func (x *RuleType_Definition_Remediate_PullRequestRemediation) GetMethod() string { + if x != nil { + return x.Method } return "" } -type RuleType_Definition_Eval_Vulncheck struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +func (x *RuleType_Definition_Remediate_PullRequestRemediation) GetParams() *structpb.Struct { + if x != nil { + return x.Params + } + return nil +} + +func (x *RuleType_Definition_Remediate_PullRequestRemediation) GetActionsReplaceTagsWithSha() *RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha { + if x != nil { + return x.ActionsReplaceTagsWithSha + } + return nil +} + +type RuleType_Definition_Remediate_PullRequestRemediation_Content struct { + state protoimpl.MessageState `protogen:"open.v1"` + // the file to patch + Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` + // how to patch the file. For now, only replace is supported + Action string `protobuf:"bytes,2,opt,name=action,proto3" json:"action,omitempty"` + // the content of the file + Content string `protobuf:"bytes,4,opt,name=content,proto3" json:"content,omitempty"` + // the GIT mode of the file. Not UNIX mode! String because the GH API also uses strings + // the usual modes are: 100644 for regular files, 100755 for executable files and + // 040000 for submodules (which we don't use but now you know the meaning of the 1 in 100644) + // see e.g. https://github.com/go-git/go-git/blob/32e0172851c35ae2fac495069c923330040903d2/plumbing/filemode/filemode.go#L16 + Mode *string `protobuf:"bytes,3,opt,name=mode,proto3,oneof" json:"mode,omitempty"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *RuleType_Definition_Eval_Vulncheck) Reset() { - *x = RuleType_Definition_Eval_Vulncheck{} - mi := &file_minder_v1_minder_proto_msgTypes[191] +func (x *RuleType_Definition_Remediate_PullRequestRemediation_Content) Reset() { + *x = RuleType_Definition_Remediate_PullRequestRemediation_Content{} + mi := &file_minder_v1_minder_proto_msgTypes[214] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RuleType_Definition_Eval_Vulncheck) String() string { +func (x *RuleType_Definition_Remediate_PullRequestRemediation_Content) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RuleType_Definition_Eval_Vulncheck) ProtoMessage() {} +func (*RuleType_Definition_Remediate_PullRequestRemediation_Content) ProtoMessage() {} -func (x *RuleType_Definition_Eval_Vulncheck) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[191] +func (x *RuleType_Definition_Remediate_PullRequestRemediation_Content) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[214] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12212,36 +13329,63 @@ func (x *RuleType_Definition_Eval_Vulncheck) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use RuleType_Definition_Eval_Vulncheck.ProtoReflect.Descriptor instead. -func (*RuleType_Definition_Eval_Vulncheck) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{111, 0, 1, 2} +// Deprecated: Use RuleType_Definition_Remediate_PullRequestRemediation_Content.ProtoReflect.Descriptor instead. +func (*RuleType_Definition_Remediate_PullRequestRemediation_Content) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{124, 0, 2, 1, 0} } -type RuleType_Definition_Eval_Trusty struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *RuleType_Definition_Remediate_PullRequestRemediation_Content) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +func (x *RuleType_Definition_Remediate_PullRequestRemediation_Content) GetAction() string { + if x != nil { + return x.Action + } + return "" +} + +func (x *RuleType_Definition_Remediate_PullRequestRemediation_Content) GetContent() string { + if x != nil { + return x.Content + } + return "" +} + +func (x *RuleType_Definition_Remediate_PullRequestRemediation_Content) GetMode() string { + if x != nil && x.Mode != nil { + return *x.Mode + } + return "" +} - // This is no longer used, but is still here for backwards - // compatibility with existing stored rules - Endpoint string `protobuf:"bytes,1,opt,name=endpoint,proto3" json:"endpoint,omitempty"` +type RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha struct { + state protoimpl.MessageState `protogen:"open.v1"` + // List of actions to exclude from the replacement + Exclude []string `protobuf:"bytes,1,rep,name=exclude,proto3" json:"exclude,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *RuleType_Definition_Eval_Trusty) Reset() { - *x = RuleType_Definition_Eval_Trusty{} - mi := &file_minder_v1_minder_proto_msgTypes[192] +func (x *RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha) Reset() { + *x = RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha{} + mi := &file_minder_v1_minder_proto_msgTypes[215] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RuleType_Definition_Eval_Trusty) String() string { +func (x *RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RuleType_Definition_Eval_Trusty) ProtoMessage() {} +func (*RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha) ProtoMessage() { +} -func (x *RuleType_Definition_Eval_Trusty) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[192] +func (x *RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[215] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12252,41 +13396,40 @@ func (x *RuleType_Definition_Eval_Trusty) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RuleType_Definition_Eval_Trusty.ProtoReflect.Descriptor instead. -func (*RuleType_Definition_Eval_Trusty) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{111, 0, 1, 3} +// Deprecated: Use RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha.ProtoReflect.Descriptor instead. +func (*RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{124, 0, 2, 1, 1} } -func (x *RuleType_Definition_Eval_Trusty) GetEndpoint() string { +func (x *RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha) GetExclude() []string { if x != nil { - return x.Endpoint + return x.Exclude } - return "" + return nil } -type RuleType_Definition_Eval_Homoglyphs struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type RuleType_Definition_Alert_AlertTypeSA struct { + state protoimpl.MessageState `protogen:"open.v1"` + Severity string `protobuf:"bytes,1,opt,name=severity,proto3" json:"severity,omitempty"` unknownFields protoimpl.UnknownFields - - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *RuleType_Definition_Eval_Homoglyphs) Reset() { - *x = RuleType_Definition_Eval_Homoglyphs{} - mi := &file_minder_v1_minder_proto_msgTypes[193] +func (x *RuleType_Definition_Alert_AlertTypeSA) Reset() { + *x = RuleType_Definition_Alert_AlertTypeSA{} + mi := &file_minder_v1_minder_proto_msgTypes[216] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RuleType_Definition_Eval_Homoglyphs) String() string { +func (x *RuleType_Definition_Alert_AlertTypeSA) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RuleType_Definition_Eval_Homoglyphs) ProtoMessage() {} +func (*RuleType_Definition_Alert_AlertTypeSA) ProtoMessage() {} -func (x *RuleType_Definition_Eval_Homoglyphs) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[193] +func (x *RuleType_Definition_Alert_AlertTypeSA) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[216] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12297,41 +13440,40 @@ func (x *RuleType_Definition_Eval_Homoglyphs) ProtoReflect() protoreflect.Messag return mi.MessageOf(x) } -// Deprecated: Use RuleType_Definition_Eval_Homoglyphs.ProtoReflect.Descriptor instead. -func (*RuleType_Definition_Eval_Homoglyphs) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{111, 0, 1, 4} +// Deprecated: Use RuleType_Definition_Alert_AlertTypeSA.ProtoReflect.Descriptor instead. +func (*RuleType_Definition_Alert_AlertTypeSA) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{124, 0, 3, 0} } -func (x *RuleType_Definition_Eval_Homoglyphs) GetType() string { +func (x *RuleType_Definition_Alert_AlertTypeSA) GetSeverity() string { if x != nil { - return x.Type + return x.Severity } return "" } -type RuleType_Definition_Eval_JQComparison_Operator struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type RuleType_Definition_Alert_AlertTypePRComment struct { + state protoimpl.MessageState `protogen:"open.v1"` + ReviewMessage string `protobuf:"bytes,1,opt,name=review_message,json=reviewMessage,proto3" json:"review_message,omitempty"` unknownFields protoimpl.UnknownFields - - Def string `protobuf:"bytes,1,opt,name=def,proto3" json:"def,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *RuleType_Definition_Eval_JQComparison_Operator) Reset() { - *x = RuleType_Definition_Eval_JQComparison_Operator{} - mi := &file_minder_v1_minder_proto_msgTypes[194] +func (x *RuleType_Definition_Alert_AlertTypePRComment) Reset() { + *x = RuleType_Definition_Alert_AlertTypePRComment{} + mi := &file_minder_v1_minder_proto_msgTypes[217] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RuleType_Definition_Eval_JQComparison_Operator) String() string { +func (x *RuleType_Definition_Alert_AlertTypePRComment) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RuleType_Definition_Eval_JQComparison_Operator) ProtoMessage() {} +func (*RuleType_Definition_Alert_AlertTypePRComment) ProtoMessage() {} -func (x *RuleType_Definition_Eval_JQComparison_Operator) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[194] +func (x *RuleType_Definition_Alert_AlertTypePRComment) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[217] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12342,41 +13484,50 @@ func (x *RuleType_Definition_Eval_JQComparison_Operator) ProtoReflect() protoref return mi.MessageOf(x) } -// Deprecated: Use RuleType_Definition_Eval_JQComparison_Operator.ProtoReflect.Descriptor instead. -func (*RuleType_Definition_Eval_JQComparison_Operator) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{111, 0, 1, 0, 0} +// Deprecated: Use RuleType_Definition_Alert_AlertTypePRComment.ProtoReflect.Descriptor instead. +func (*RuleType_Definition_Alert_AlertTypePRComment) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{124, 0, 3, 1} } -func (x *RuleType_Definition_Eval_JQComparison_Operator) GetDef() string { +func (x *RuleType_Definition_Alert_AlertTypePRComment) GetReviewMessage() string { if x != nil { - return x.Def + return x.ReviewMessage } return "" } -type RuleType_Definition_Remediate_GhBranchProtectionType struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// Rule defines the individual call of a certain rule type. +type Profile_Rule struct { + state protoimpl.MessageState `protogen:"open.v1"` + // type is the type of the rule to be instantiated. + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + // params are the parameters that are passed to the rule. + // This is optional and depends on the rule type. + Params *structpb.Struct `protobuf:"bytes,2,opt,name=params,proto3" json:"params,omitempty"` + // def is the definition of the rule. + // This depends on the rule type. + Def *structpb.Struct `protobuf:"bytes,3,opt,name=def,proto3" json:"def,omitempty"` + // name is the descriptive name of the rule, not to be confused with type + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` unknownFields protoimpl.UnknownFields - - Patch string `protobuf:"bytes,1,opt,name=patch,proto3" json:"patch,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *RuleType_Definition_Remediate_GhBranchProtectionType) Reset() { - *x = RuleType_Definition_Remediate_GhBranchProtectionType{} - mi := &file_minder_v1_minder_proto_msgTypes[195] +func (x *Profile_Rule) Reset() { + *x = Profile_Rule{} + mi := &file_minder_v1_minder_proto_msgTypes[218] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RuleType_Definition_Remediate_GhBranchProtectionType) String() string { +func (x *Profile_Rule) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RuleType_Definition_Remediate_GhBranchProtectionType) ProtoMessage() {} +func (*Profile_Rule) ProtoMessage() {} -func (x *RuleType_Definition_Remediate_GhBranchProtectionType) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[195] +func (x *Profile_Rule) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[218] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12387,58 +13538,68 @@ func (x *RuleType_Definition_Remediate_GhBranchProtectionType) ProtoReflect() pr return mi.MessageOf(x) } -// Deprecated: Use RuleType_Definition_Remediate_GhBranchProtectionType.ProtoReflect.Descriptor instead. -func (*RuleType_Definition_Remediate_GhBranchProtectionType) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{111, 0, 2, 0} +// Deprecated: Use Profile_Rule.ProtoReflect.Descriptor instead. +func (*Profile_Rule) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{125, 0} } -func (x *RuleType_Definition_Remediate_GhBranchProtectionType) GetPatch() string { +func (x *Profile_Rule) GetType() string { if x != nil { - return x.Patch + return x.Type } return "" } -// the name stutters a bit but we already use a PullRequest message for handling PR entities -type RuleType_Definition_Remediate_PullRequestRemediation struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *Profile_Rule) GetParams() *structpb.Struct { + if x != nil { + return x.Params + } + return nil +} - // the title of the PR - Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` - // the body of the PR - Body string `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"` - Contents []*RuleType_Definition_Remediate_PullRequestRemediation_Content `protobuf:"bytes,3,rep,name=contents,proto3" json:"contents,omitempty"` - // the method to use to create the PR. For now, these are supported: - // -- minder.content - ensures that the content of the file is exactly as specified - // - // refer to the Content message for more details - // - // -- minder.actions.replace_tags_with_sha - finds any github actions within a workflow - // - // file and replaces the tag with the SHA - Method string `protobuf:"bytes,4,opt,name=method,proto3" json:"method,omitempty"` - // If the method is minder.actions.replace_tags_with_sha, this is the configuration - // for that method - ActionsReplaceTagsWithSha *RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha `protobuf:"bytes,5,opt,name=actions_replace_tags_with_sha,json=actionsReplaceTagsWithSha,proto3,oneof" json:"actions_replace_tags_with_sha,omitempty"` +func (x *Profile_Rule) GetDef() *structpb.Struct { + if x != nil { + return x.Def + } + return nil } -func (x *RuleType_Definition_Remediate_PullRequestRemediation) Reset() { - *x = RuleType_Definition_Remediate_PullRequestRemediation{} - mi := &file_minder_v1_minder_proto_msgTypes[196] +func (x *Profile_Rule) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type Profile_Selector struct { + state protoimpl.MessageState `protogen:"open.v1"` + // id is optional and use for updates to match upserts as well as read operations. It is ignored for creates. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // entity is the entity to select. + Entity string `protobuf:"bytes,2,opt,name=entity,proto3" json:"entity,omitempty"` + // expr is the expression to select the entity. + Selector string `protobuf:"bytes,4,opt,name=selector,proto3" json:"selector,omitempty"` + // description is the human-readable description of the selector. + Description string `protobuf:"bytes,6,opt,name=description,proto3" json:"description,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Profile_Selector) Reset() { + *x = Profile_Selector{} + mi := &file_minder_v1_minder_proto_msgTypes[219] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RuleType_Definition_Remediate_PullRequestRemediation) String() string { +func (x *Profile_Selector) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RuleType_Definition_Remediate_PullRequestRemediation) ProtoMessage() {} +func (*Profile_Selector) ProtoMessage() {} -func (x *RuleType_Definition_Remediate_PullRequestRemediation) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[196] +func (x *Profile_Selector) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[219] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12449,79 +13610,62 @@ func (x *RuleType_Definition_Remediate_PullRequestRemediation) ProtoReflect() pr return mi.MessageOf(x) } -// Deprecated: Use RuleType_Definition_Remediate_PullRequestRemediation.ProtoReflect.Descriptor instead. -func (*RuleType_Definition_Remediate_PullRequestRemediation) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{111, 0, 2, 1} +// Deprecated: Use Profile_Selector.ProtoReflect.Descriptor instead. +func (*Profile_Selector) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{125, 1} } -func (x *RuleType_Definition_Remediate_PullRequestRemediation) GetTitle() string { +func (x *Profile_Selector) GetId() string { if x != nil { - return x.Title + return x.Id } return "" } -func (x *RuleType_Definition_Remediate_PullRequestRemediation) GetBody() string { +func (x *Profile_Selector) GetEntity() string { if x != nil { - return x.Body + return x.Entity } return "" } -func (x *RuleType_Definition_Remediate_PullRequestRemediation) GetContents() []*RuleType_Definition_Remediate_PullRequestRemediation_Content { - if x != nil { - return x.Contents - } - return nil -} - -func (x *RuleType_Definition_Remediate_PullRequestRemediation) GetMethod() string { +func (x *Profile_Selector) GetSelector() string { if x != nil { - return x.Method + return x.Selector } return "" } -func (x *RuleType_Definition_Remediate_PullRequestRemediation) GetActionsReplaceTagsWithSha() *RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha { +func (x *Profile_Selector) GetDescription() string { if x != nil { - return x.ActionsReplaceTagsWithSha + return x.Description } - return nil + return "" } -type RuleType_Definition_Remediate_PullRequestRemediation_Content struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type StructDataSource_Def struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Path is the path specification for the structured data source. + Path *StructDataSource_Def_Path `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` unknownFields protoimpl.UnknownFields - - // the file to patch - Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` - // how to patch the file. For now, only replace is supported - Action string `protobuf:"bytes,2,opt,name=action,proto3" json:"action,omitempty"` - // the content of the file - Content string `protobuf:"bytes,4,opt,name=content,proto3" json:"content,omitempty"` - // the GIT mode of the file. Not UNIX mode! String because the GH API also uses strings - // the usual modes are: 100644 for regular files, 100755 for executable files and - // 040000 for submodules (which we don't use but now you know the meaning of the 1 in 100644) - // see e.g. https://github.com/go-git/go-git/blob/32e0172851c35ae2fac495069c923330040903d2/plumbing/filemode/filemode.go#L16 - Mode *string `protobuf:"bytes,3,opt,name=mode,proto3,oneof" json:"mode,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *RuleType_Definition_Remediate_PullRequestRemediation_Content) Reset() { - *x = RuleType_Definition_Remediate_PullRequestRemediation_Content{} - mi := &file_minder_v1_minder_proto_msgTypes[197] +func (x *StructDataSource_Def) Reset() { + *x = StructDataSource_Def{} + mi := &file_minder_v1_minder_proto_msgTypes[220] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RuleType_Definition_Remediate_PullRequestRemediation_Content) String() string { +func (x *StructDataSource_Def) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RuleType_Definition_Remediate_PullRequestRemediation_Content) ProtoMessage() {} +func (*StructDataSource_Def) ProtoMessage() {} -func (x *RuleType_Definition_Remediate_PullRequestRemediation_Content) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[197] +func (x *StructDataSource_Def) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[220] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12532,64 +13676,41 @@ func (x *RuleType_Definition_Remediate_PullRequestRemediation_Content) ProtoRefl return mi.MessageOf(x) } -// Deprecated: Use RuleType_Definition_Remediate_PullRequestRemediation_Content.ProtoReflect.Descriptor instead. -func (*RuleType_Definition_Remediate_PullRequestRemediation_Content) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{111, 0, 2, 1, 0} +// Deprecated: Use StructDataSource_Def.ProtoReflect.Descriptor instead. +func (*StructDataSource_Def) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{189, 0} } -func (x *RuleType_Definition_Remediate_PullRequestRemediation_Content) GetPath() string { +func (x *StructDataSource_Def) GetPath() *StructDataSource_Def_Path { if x != nil { return x.Path } - return "" -} - -func (x *RuleType_Definition_Remediate_PullRequestRemediation_Content) GetAction() string { - if x != nil { - return x.Action - } - return "" -} - -func (x *RuleType_Definition_Remediate_PullRequestRemediation_Content) GetContent() string { - if x != nil { - return x.Content - } - return "" -} - -func (x *RuleType_Definition_Remediate_PullRequestRemediation_Content) GetMode() string { - if x != nil && x.Mode != nil { - return *x.Mode - } - return "" + return nil } -type RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type StructDataSource_Def_Path struct { + state protoimpl.MessageState `protogen:"open.v1"` + FileName string `protobuf:"bytes,1,opt,name=file_name,json=fileName,proto3" json:"file_name,omitempty"` + Alternatives []string `protobuf:"bytes,2,rep,name=alternatives,proto3" json:"alternatives,omitempty"` unknownFields protoimpl.UnknownFields - - // List of actions to exclude from the replacement - Exclude []string `protobuf:"bytes,1,rep,name=exclude,proto3" json:"exclude,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha) Reset() { - *x = RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha{} - mi := &file_minder_v1_minder_proto_msgTypes[198] +func (x *StructDataSource_Def_Path) Reset() { + *x = StructDataSource_Def_Path{} + mi := &file_minder_v1_minder_proto_msgTypes[222] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha) String() string { +func (x *StructDataSource_Def_Path) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha) ProtoMessage() { -} +func (*StructDataSource_Def_Path) ProtoMessage() {} -func (x *RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[198] +func (x *StructDataSource_Def_Path) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[222] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12600,41 +13721,76 @@ func (x *RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTags return mi.MessageOf(x) } -// Deprecated: Use RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha.ProtoReflect.Descriptor instead. -func (*RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{111, 0, 2, 1, 1} +// Deprecated: Use StructDataSource_Def_Path.ProtoReflect.Descriptor instead. +func (*StructDataSource_Def_Path) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{189, 0, 0} +} + +func (x *StructDataSource_Def_Path) GetFileName() string { + if x != nil { + return x.FileName + } + return "" } -func (x *RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha) GetExclude() []string { +func (x *StructDataSource_Def_Path) GetAlternatives() []string { if x != nil { - return x.Exclude + return x.Alternatives } return nil } -type RuleType_Definition_Alert_AlertTypeSA struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type RestDataSource_Def struct { + state protoimpl.MessageState `protogen:"open.v1"` + // endpoint is the URL of the REST API. Note that endpoints are + // templates that can be parameterized with variables. Parametrization + // is done using RFC 6570. + Endpoint string `protobuf:"bytes,1,opt,name=endpoint,proto3" json:"endpoint,omitempty"` + // method is the HTTP method to use for the request. + // If left unset, it will default to "GET". + Method string `protobuf:"bytes,2,opt,name=method,proto3" json:"method,omitempty"` + // headers is a map of headers to send with the request. + Headers map[string]string `protobuf:"bytes,3,rep,name=headers,proto3" json:"headers,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Types that are valid to be assigned to Body: + // + // *RestDataSource_Def_Bodyobj + // *RestDataSource_Def_Bodystr + // *RestDataSource_Def_BodyFromField + Body isRestDataSource_Def_Body `protobuf_oneof:"body"` + // parse is the parse configuration for the response. + // This allows us to serialize the response into a structured format, + // or not. + // If left unset, the response will be treated as a string. + // If set to "json", the response will be parsed as JSON. + Parse string `protobuf:"bytes,6,opt,name=parse,proto3" json:"parse,omitempty"` + // fallback is the fallback configuration for the response in case + // of an unexpected status code. + Fallback []*RestDataSource_Def_Fallback `protobuf:"bytes,7,rep,name=fallback,proto3" json:"fallback,omitempty"` + // expected_status is the expected status code for the response. + // This may be repeated to allow for multiple expected status codes. + // If left unset, it will default to 200. + ExpectedStatus []int32 `protobuf:"varint,8,rep,packed,name=expected_status,json=expectedStatus,proto3" json:"expected_status,omitempty"` + // input_schema is the schema for the input to the REST API. + InputSchema *structpb.Struct `protobuf:"bytes,9,opt,name=input_schema,json=inputSchema,proto3" json:"input_schema,omitempty"` unknownFields protoimpl.UnknownFields - - Severity string `protobuf:"bytes,1,opt,name=severity,proto3" json:"severity,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *RuleType_Definition_Alert_AlertTypeSA) Reset() { - *x = RuleType_Definition_Alert_AlertTypeSA{} - mi := &file_minder_v1_minder_proto_msgTypes[199] +func (x *RestDataSource_Def) Reset() { + *x = RestDataSource_Def{} + mi := &file_minder_v1_minder_proto_msgTypes[223] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RuleType_Definition_Alert_AlertTypeSA) String() string { +func (x *RestDataSource_Def) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RuleType_Definition_Alert_AlertTypeSA) ProtoMessage() {} +func (*RestDataSource_Def) ProtoMessage() {} -func (x *RuleType_Definition_Alert_AlertTypeSA) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[199] +func (x *RestDataSource_Def) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[223] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12645,124 +13801,145 @@ func (x *RuleType_Definition_Alert_AlertTypeSA) ProtoReflect() protoreflect.Mess return mi.MessageOf(x) } -// Deprecated: Use RuleType_Definition_Alert_AlertTypeSA.ProtoReflect.Descriptor instead. -func (*RuleType_Definition_Alert_AlertTypeSA) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{111, 0, 3, 0} +// Deprecated: Use RestDataSource_Def.ProtoReflect.Descriptor instead. +func (*RestDataSource_Def) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{190, 0} } -func (x *RuleType_Definition_Alert_AlertTypeSA) GetSeverity() string { +func (x *RestDataSource_Def) GetEndpoint() string { if x != nil { - return x.Severity + return x.Endpoint } return "" } -// Rule defines the individual call of a certain rule type. -type Profile_Rule struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // type is the type of the rule to be instantiated. - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - // params are the parameters that are passed to the rule. - // This is optional and depends on the rule type. - Params *structpb.Struct `protobuf:"bytes,2,opt,name=params,proto3" json:"params,omitempty"` - // def is the definition of the rule. - // This depends on the rule type. - Def *structpb.Struct `protobuf:"bytes,3,opt,name=def,proto3" json:"def,omitempty"` - // name is the descriptive name of the rule, not to be confused with type - Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` +func (x *RestDataSource_Def) GetMethod() string { + if x != nil { + return x.Method + } + return "" } -func (x *Profile_Rule) Reset() { - *x = Profile_Rule{} - mi := &file_minder_v1_minder_proto_msgTypes[200] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *RestDataSource_Def) GetHeaders() map[string]string { + if x != nil { + return x.Headers + } + return nil } -func (x *Profile_Rule) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *RestDataSource_Def) GetBody() isRestDataSource_Def_Body { + if x != nil { + return x.Body + } + return nil } -func (*Profile_Rule) ProtoMessage() {} +func (x *RestDataSource_Def) GetBodyobj() *structpb.Struct { + if x != nil { + if x, ok := x.Body.(*RestDataSource_Def_Bodyobj); ok { + return x.Bodyobj + } + } + return nil +} -func (x *Profile_Rule) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[200] +func (x *RestDataSource_Def) GetBodystr() string { if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) + if x, ok := x.Body.(*RestDataSource_Def_Bodystr); ok { + return x.Bodystr } - return ms } - return mi.MessageOf(x) + return "" } -// Deprecated: Use Profile_Rule.ProtoReflect.Descriptor instead. -func (*Profile_Rule) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{112, 0} +func (x *RestDataSource_Def) GetBodyFromField() string { + if x != nil { + if x, ok := x.Body.(*RestDataSource_Def_BodyFromField); ok { + return x.BodyFromField + } + } + return "" } -func (x *Profile_Rule) GetType() string { +func (x *RestDataSource_Def) GetParse() string { if x != nil { - return x.Type + return x.Parse } return "" } -func (x *Profile_Rule) GetParams() *structpb.Struct { +func (x *RestDataSource_Def) GetFallback() []*RestDataSource_Def_Fallback { if x != nil { - return x.Params + return x.Fallback } return nil } -func (x *Profile_Rule) GetDef() *structpb.Struct { +func (x *RestDataSource_Def) GetExpectedStatus() []int32 { if x != nil { - return x.Def + return x.ExpectedStatus } return nil } -func (x *Profile_Rule) GetName() string { +func (x *RestDataSource_Def) GetInputSchema() *structpb.Struct { if x != nil { - return x.Name + return x.InputSchema } - return "" + return nil } -type Profile_Selector struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +type isRestDataSource_Def_Body interface { + isRestDataSource_Def_Body() +} - // id is optional and use for updates to match upserts as well as read operations. It is ignored for creates. - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - // entity is the entity to select. - Entity string `protobuf:"bytes,2,opt,name=entity,proto3" json:"entity,omitempty"` - // expr is the expression to select the entity. - Selector string `protobuf:"bytes,4,opt,name=selector,proto3" json:"selector,omitempty"` - // description is the human-readable description of the selector. - Description string `protobuf:"bytes,6,opt,name=description,proto3" json:"description,omitempty"` +type RestDataSource_Def_Bodyobj struct { + // body is the body of the request. + Bodyobj *structpb.Struct `protobuf:"bytes,4,opt,name=bodyobj,proto3,oneof"` } -func (x *Profile_Selector) Reset() { - *x = Profile_Selector{} - mi := &file_minder_v1_minder_proto_msgTypes[201] +type RestDataSource_Def_Bodystr struct { + // bodystr is the body of the request as a string. + Bodystr string `protobuf:"bytes,5,opt,name=bodystr,proto3,oneof"` +} + +type RestDataSource_Def_BodyFromField struct { + // body_from_field is the field in the input to use as the body. + // If the value is an string, it will be used as the body, as is. + // If the value is an object, it will be serialized as JSON. + // If the value is not found in the input, the request will fail. + BodyFromField string `protobuf:"bytes,10,opt,name=body_from_field,json=bodyFromField,proto3,oneof"` +} + +func (*RestDataSource_Def_Bodyobj) isRestDataSource_Def_Body() {} + +func (*RestDataSource_Def_Bodystr) isRestDataSource_Def_Body() {} + +func (*RestDataSource_Def_BodyFromField) isRestDataSource_Def_Body() {} + +type RestDataSource_Def_Fallback struct { + state protoimpl.MessageState `protogen:"open.v1"` + HttpStatus int32 `protobuf:"varint,1,opt,name=http_status,json=httpStatus,proto3" json:"http_status,omitempty"` + Body string `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RestDataSource_Def_Fallback) Reset() { + *x = RestDataSource_Def_Fallback{} + mi := &file_minder_v1_minder_proto_msgTypes[226] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *Profile_Selector) String() string { +func (x *RestDataSource_Def_Fallback) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Profile_Selector) ProtoMessage() {} +func (*RestDataSource_Def_Fallback) ProtoMessage() {} -func (x *Profile_Selector) ProtoReflect() protoreflect.Message { - mi := &file_minder_v1_minder_proto_msgTypes[201] +func (x *RestDataSource_Def_Fallback) ProtoReflect() protoreflect.Message { + mi := &file_minder_v1_minder_proto_msgTypes[226] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12773,35 +13950,21 @@ func (x *Profile_Selector) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Profile_Selector.ProtoReflect.Descriptor instead. -func (*Profile_Selector) Descriptor() ([]byte, []int) { - return file_minder_v1_minder_proto_rawDescGZIP(), []int{112, 1} -} - -func (x *Profile_Selector) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *Profile_Selector) GetEntity() string { - if x != nil { - return x.Entity - } - return "" +// Deprecated: Use RestDataSource_Def_Fallback.ProtoReflect.Descriptor instead. +func (*RestDataSource_Def_Fallback) Descriptor() ([]byte, []int) { + return file_minder_v1_minder_proto_rawDescGZIP(), []int{190, 0, 1} } -func (x *Profile_Selector) GetSelector() string { +func (x *RestDataSource_Def_Fallback) GetHttpStatus() int32 { if x != nil { - return x.Selector + return x.HttpStatus } - return "" + return 0 } -func (x *Profile_Selector) GetDescription() string { +func (x *RestDataSource_Def_Fallback) GetBody() string { if x != nil { - return x.Description + return x.Body } return "" } @@ -12844,73 +14007,85 @@ var file_minder_v1_minder_proto_rawDesc = []byte{ 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, + 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb0, 0x01, 0x0a, 0x0a, 0x52, 0x70, 0x63, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6e, 0x6f, 0x5f, 0x6c, 0x6f, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x6e, 0x6f, 0x4c, 0x6f, 0x67, 0x12, 0x42, 0x0a, 0x0f, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0e, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x2f, - 0x0a, 0x08, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4a, - 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04, 0x10, - 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x22, 0x34, 0x0a, 0x06, 0x43, 0x75, 0x72, 0x73, 0x6f, - 0x72, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x7f, 0x0a, - 0x0a, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, - 0x12, 0x25, 0x0a, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x75, 0x72, 0x73, 0x6f, - 0x72, 0x52, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x12, 0x25, 0x0a, 0x04, 0x70, 0x72, 0x65, 0x76, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x52, 0x04, 0x70, 0x72, 0x65, 0x76, 0x22, 0x7a, - 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x66, 0x72, 0x6f, 0x6d, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x46, 0x0a, 0x15, 0x4c, 0x69, - 0x73, 0x74, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x22, 0xca, 0x02, 0x0a, 0x08, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, - 0x1f, 0x0a, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x5f, 0x70, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x50, 0x6b, + 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0xb0, 0x01, 0x0a, 0x0a, 0x52, 0x70, 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6e, 0x6f, 0x5f, 0x6c, 0x6f, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x6e, 0x6f, 0x4c, 0x6f, 0x67, 0x12, 0x42, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x19, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0e, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x2f, 0x0a, 0x08, + 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, + 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x04, 0x08, + 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, + 0x04, 0x08, 0x05, 0x10, 0x06, 0x22, 0x5c, 0x0a, 0x06, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, + 0x30, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x18, 0xba, 0x48, 0x15, 0x72, 0x13, 0x18, 0xc8, 0x01, 0x32, 0x0e, 0x5e, 0x5b, 0x5b, 0x3a, 0x77, + 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x3d, 0x5d, 0x2a, 0x24, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, + 0x72, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x42, + 0x0c, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x06, 0x2a, 0x04, 0x18, 0x64, 0x28, 0x00, 0x52, 0x04, 0x73, + 0x69, 0x7a, 0x65, 0x22, 0x7f, 0x0a, 0x0a, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x50, 0x61, 0x67, + 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, + 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, + 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x25, 0x0a, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x52, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x12, 0x25, 0x0a, + 0x04, 0x70, 0x72, 0x65, 0x76, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x52, 0x04, + 0x70, 0x72, 0x65, 0x76, 0x22, 0xa9, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x72, 0x74, + 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, + 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x2c, 0x0a, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x3d, 0x0a, 0x04, 0x66, + 0x72, 0x6f, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xba, 0x48, 0x26, 0xd8, 0x01, + 0x02, 0x72, 0x21, 0x18, 0xc8, 0x01, 0x32, 0x1c, 0x5e, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, + 0x3a, 0x5d, 0x5d, 0x2b, 0x3d, 0x5b, 0x2d, 0x2c, 0x2f, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, + 0x5d, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, + 0x22, 0x4b, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x07, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, + 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x42, + 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xe3, 0x02, + 0x0a, 0x08, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x24, 0x0a, 0x0b, 0x61, 0x72, + 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x5f, 0x70, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x50, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1e, - 0x0a, 0x0a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1e, - 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x36, - 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x72, 0x74, - 0x69, 0x66, 0x61, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, - 0xc6, 0x01, 0x0a, 0x0f, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x17, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, + 0x41, 0x02, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0a, 0x76, 0x69, 0x73, 0x69, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, + 0x02, 0x52, 0x0a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a, + 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x36, 0x0a, + 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x22, 0xd2, 0x01, 0x0a, 0x0f, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x0a, 0xba, 0x48, 0x07, + 0xd8, 0x01, 0x02, 0x22, 0x02, 0x28, 0x01, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, @@ -12920,640 +14095,755 @@ var file_minder_v1_minder_proto_rawDesc = []byte{ 0x64, 0x41, 0x74, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x52, 0x0f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x16, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x78, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x41, - 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x52, 0x0f, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x03, 0x74, - 0x61, 0x67, 0x22, 0x82, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, - 0x63, 0x74, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x88, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, + 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x0e, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x08, 0xd8, 0x01, 0x02, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x52, 0x0f, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x03, + 0x74, 0x61, 0x67, 0x22, 0x87, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x34, 0x0a, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x72, + 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x61, 0x72, 0x74, + 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x36, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa0, 0x01, + 0x0a, 0x18, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x42, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x20, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x1a, + 0xd8, 0x01, 0x02, 0x72, 0x15, 0x18, 0xc8, 0x01, 0x32, 0x10, 0x5e, 0x5b, 0x2d, 0x2e, 0x2f, 0x5b, + 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4a, 0x04, + 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x52, 0x0f, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x03, 0x74, 0x61, 0x67, + 0x22, 0x89, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, + 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x72, 0x74, - 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, - 0x36, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x72, - 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x7e, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x41, 0x72, - 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, - 0x04, 0x52, 0x0f, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x03, 0x74, 0x61, 0x67, 0x22, 0x84, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x41, - 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x08, 0x61, 0x72, - 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x36, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb8, - 0x03, 0x0a, 0x0b, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, - 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, - 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x68, 0x61, 0x12, - 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x5f, - 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x70, - 0x6f, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x70, 0x6f, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x49, 0x64, - 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, - 0x24, 0x0a, 0x0e, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6c, 0x6f, - 0x6e, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, - 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x55, 0x72, 0x6c, 0x12, - 0x19, 0x0a, 0x08, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x66, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x66, 0x22, 0x09, 0x0a, 0x07, 0x52, 0x65, 0x6c, - 0x65, 0x61, 0x73, 0x65, 0x22, 0x0d, 0x0a, 0x0b, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x52, 0x75, 0x6e, 0x22, 0x09, 0x0a, 0x07, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6e, 0x22, 0x07, - 0x0a, 0x05, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x22, 0x3c, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x49, 0x6e, - 0x76, 0x69, 0x74, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x52, 0x07, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0xc1, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x76, - 0x69, 0x74, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x64, 0x69, - 0x73, 0x70, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x73, - 0x70, 0x6c, 0x61, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, - 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, - 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x22, 0x14, 0x0a, 0x12, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x2d, 0x0a, 0x13, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xb2, - 0x02, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, - 0x03, 0x63, 0x6c, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x63, 0x6c, 0x69, 0x12, - 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, - 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x2c, - 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x26, 0x0a, 0x0c, - 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x55, 0x72, - 0x6c, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x42, 0x08, 0x0a, 0x06, - 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x65, 0x64, 0x69, 0x72, - 0x65, 0x63, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, - 0x02, 0x10, 0x03, 0x22, 0x45, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x75, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x19, 0x53, - 0x74, 0x6f, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x19, 0x0a, 0x05, 0x6f, - 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x6f, 0x77, - 0x6e, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x4a, 0x04, - 0x08, 0x02, 0x10, 0x03, 0x22, 0x1c, 0x0a, 0x1a, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0xf7, 0x01, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1d, - 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, - 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, - 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, - 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x7f, 0x0a, 0x29, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, - 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, + 0x69, 0x66, 0x61, 0x63, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x61, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x12, 0x36, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x09, 0x0a, 0x07, + 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x22, 0x0d, 0x0a, 0x0b, 0x50, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x52, 0x75, 0x6e, 0x22, 0x09, 0x0a, 0x07, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, + 0x6e, 0x22, 0x07, 0x0a, 0x05, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x22, 0x5b, 0x0a, 0x17, 0x47, 0x65, + 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x1d, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x17, 0x72, 0x15, 0x32, 0x10, 0x5e, + 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x98, + 0x01, 0x40, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x52, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0xd5, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x76, 0x69, 0x74, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, + 0x41, 0x02, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x12, 0x2c, 0x0a, 0x0f, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x6f, 0x72, 0x5f, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, + 0x52, 0x0e, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x12, 0x3e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, + 0x12, 0x1d, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x22, + 0x14, 0x0a, 0x12, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x32, 0x0a, 0x13, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, + 0x02, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x9a, 0x03, 0x0a, 0x1a, 0x47, 0x65, + 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x52, + 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x6c, 0x69, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x63, 0x6c, 0x69, 0x12, 0x3e, 0x0a, 0x05, 0x6f, 0x77, + 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xba, 0x48, 0x20, 0xd8, 0x01, + 0x02, 0x72, 0x1b, 0x18, 0xc8, 0x01, 0x32, 0x16, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, + 0x5d, 0x5b, 0x2d, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, 0x24, 0x48, 0x00, + 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x36, 0x0a, 0x0c, 0x72, 0x65, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0e, + 0xba, 0x48, 0x0b, 0xd8, 0x01, 0x02, 0x72, 0x06, 0x18, 0xd8, 0x04, 0x88, 0x01, 0x01, 0x48, 0x01, + 0x52, 0x0b, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, + 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x4a, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xba, 0x48, 0x20, 0xd8, 0x01, + 0x02, 0x72, 0x1b, 0x18, 0xc8, 0x01, 0x32, 0x16, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, + 0x5d, 0x5b, 0x2d, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, 0x24, 0x52, 0x0d, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x42, 0x08, 0x0a, + 0x06, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x65, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, + 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, + 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x4f, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x15, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xfd, 0x01, 0x0a, 0x19, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x42, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1f, 0xe0, 0x41, 0x02, + 0xba, 0x48, 0x19, 0x72, 0x17, 0x10, 0x0a, 0x18, 0xc8, 0x01, 0x32, 0x10, 0x5e, 0x5b, 0x61, 0x2d, + 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x2d, 0x5f, 0x5d, 0x2b, 0x24, 0x52, 0x0b, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x3e, 0x0a, 0x05, 0x6f, 0x77, 0x6e, + 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xba, 0x48, 0x20, 0xd8, 0x01, 0x02, + 0x72, 0x1b, 0x18, 0xc8, 0x01, 0x32, 0x16, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x5d, + 0x5b, 0x2d, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, 0x24, 0x48, 0x00, 0x52, + 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0xad, 0x01, - 0x0a, 0x2a, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x07, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, - 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x66, 0x52, - 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x43, 0x0a, 0x08, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x69, 0x6e, - 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x52, 0x65, 0x66, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0x74, 0x0a, - 0x1c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x70, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x66, 0x12, 0x34, 0x0a, - 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x66, 0x52, 0x06, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x65, 0x64, 0x22, 0xa8, 0x01, 0x0a, 0x15, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x66, 0x12, 0x14, 0x0a, - 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77, - 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6f, 0x5f, - 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x72, 0x65, 0x70, 0x6f, 0x49, 0x64, - 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6f, 0x77, 0x6e, 0x65, + 0x72, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x1c, 0x0a, 0x1a, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8b, 0x02, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x3e, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x3e, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0x7f, 0x0a, 0x29, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, + 0x6d, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1e, - 0x0a, 0x0a, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0a, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x22, 0xab, - 0x05, 0x0a, 0x0a, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x13, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x88, - 0x01, 0x01, 0x12, 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x48, 0x01, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x17, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x06, 0x72, 0x65, 0x70, 0x6f, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x68, 0x6f, 0x6f, 0x6b, - 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x68, 0x6f, 0x6f, 0x6b, 0x49, - 0x64, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x6f, 0x6f, 0x6b, 0x55, 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, - 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x63, - 0x6c, 0x6f, 0x6e, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x68, 0x6f, 0x6f, 0x6b, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x6f, - 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x6f, 0x6b, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x6f, 0x6b, 0x55, 0x75, 0x69, 0x64, 0x12, - 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x17, - 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x6b, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x69, 0x73, 0x46, 0x6f, 0x72, 0x6b, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x25, 0x0a, - 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, - 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x72, - 0x61, 0x6e, 0x63, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x18, - 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, 0x37, - 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x14, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0a, 0x70, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x64, 0x42, 0x0a, - 0x0a, 0x08, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4a, 0x04, 0x08, 0x0f, 0x10, 0x10, - 0x52, 0x0a, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x22, 0xe7, 0x01, 0x0a, - 0x19, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, - 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0a, 0x72, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4a, 0x04, + 0x08, 0x02, 0x10, 0x03, 0x22, 0xb7, 0x01, 0x0a, 0x2a, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x46, + 0x72, 0x6f, 0x6d, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x6f, 0x72, 0x79, 0x52, 0x65, 0x66, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x12, 0x48, 0x0a, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x70, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x66, 0x42, + 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0x79, + 0x0a, 0x1c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x70, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x66, 0x12, 0x39, + 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x66, - 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x07, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x34, 0x0a, 0x06, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6e, - 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x66, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0xd2, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x35, 0x0a, - 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x6f, 0x72, 0x79, 0x12, 0x3c, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x1a, 0x47, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, - 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x53, 0x0a, 0x1a, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x06, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x69, 0x6e, 0x64, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x22, 0x6d, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x79, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, - 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x49, - 0x64, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x65, 0x61, 0x6d, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x66, 0x42, 0x03, 0xe0, 0x41, + 0x02, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x72, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x22, 0xfc, 0x01, 0x0a, 0x15, 0x55, 0x70, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, + 0x52, 0x65, 0x66, 0x12, 0x39, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x23, 0xba, 0x48, 0x20, 0xd8, 0x01, 0x02, 0x72, 0x1b, 0x18, 0xc8, 0x01, 0x32, + 0x16, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x5b, 0x3a, 0x77, 0x6f, + 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, 0x24, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x35, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x21, 0xe0, 0x41, + 0x02, 0xba, 0x48, 0x1b, 0xd8, 0x01, 0x02, 0x72, 0x16, 0x18, 0xc8, 0x01, 0x32, 0x11, 0x5e, 0x5b, + 0x2d, 0x2e, 0x5b, 0x3a, 0x61, 0x6c, 0x6e, 0x75, 0x6d, 0x3a, 0x5d, 0x5f, 0x5d, 0x2b, 0x24, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x69, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x0a, 0xba, 0x48, 0x07, 0xd8, 0x01, 0x02, 0x22, 0x02, + 0x28, 0x01, 0x52, 0x06, 0x72, 0x65, 0x70, 0x6f, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x72, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x22, 0xc4, 0x05, 0x0a, 0x0a, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, - 0x52, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, - 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0a, - 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x22, 0x70, 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x43, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x22, 0x84, 0x01, 0x0a, 0x1a, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x4e, 0x61, - 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, - 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, - 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4a, 0x04, 0x08, 0x02, 0x10, - 0x03, 0x22, 0x54, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x48, 0x01, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, + 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, + 0x41, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6f, + 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x72, 0x65, 0x70, 0x6f, 0x49, + 0x64, 0x12, 0x17, 0x0a, 0x07, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x06, 0x68, 0x6f, 0x6f, 0x6b, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x6f, + 0x6f, 0x6b, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x6f, + 0x6f, 0x6b, 0x55, 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x5f, + 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x5f, 0x75, 0x72, + 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x55, 0x72, + 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x6f, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, + 0x0a, 0x09, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x68, 0x6f, 0x6f, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x68, + 0x6f, 0x6f, 0x6b, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x68, 0x6f, 0x6f, 0x6b, 0x55, 0x75, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, + 0x02, 0x52, 0x09, 0x69, 0x73, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x07, + 0x69, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x6b, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, + 0x41, 0x02, 0x52, 0x06, 0x69, 0x73, 0x46, 0x6f, 0x72, 0x6b, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x62, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, + 0x73, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, + 0x65, 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0a, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, + 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4a, 0x04, 0x08, + 0x0f, 0x10, 0x10, 0x52, 0x0a, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x22, + 0xe7, 0x01, 0x0a, 0x19, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, + 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x40, 0x0a, + 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, + 0x52, 0x65, 0x66, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, + 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x34, 0x0a, + 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x66, 0x52, 0x06, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0xd7, 0x01, 0x0a, 0x12, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x35, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x0a, 0x72, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x87, 0x01, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x41, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x03, 0xe0, + 0x41, 0x02, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x47, 0x0a, 0x06, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x19, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0x58, 0x0a, 0x1a, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x7a, 0x0a, + 0x18, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, + 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x0d, 0x72, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x0b, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x0c, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, + 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x57, 0x0a, 0x19, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, + 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, + 0x72, 0x79, 0x22, 0x7d, 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x30, 0x0a, 0x0d, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x05, + 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x22, 0x48, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0c, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x22, 0xae, 0x01, 0x0a, 0x1a, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, + 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x22, + 0xd8, 0x01, 0x02, 0x72, 0x1d, 0x18, 0xc8, 0x01, 0x32, 0x18, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, + 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x2e, 0x2f, 0x5d, + 0x2a, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x59, 0x0a, 0x1b, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0a, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x72, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0xb1, 0x01, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, - 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, - 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4a, 0x04, 0x08, 0x02, 0x10, - 0x03, 0x22, 0x34, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, - 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, - 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x4a, - 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x52, 0x0a, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, - 0x63, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, - 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, - 0x72, 0x73, 0x6f, 0x72, 0x22, 0x6a, 0x0a, 0x22, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, - 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, - 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, - 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x22, 0x25, 0x0a, 0x23, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x45, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xae, 0x01, 0x0a, 0x1e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, - 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, - 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x22, 0xd8, + 0x01, 0x02, 0x72, 0x1d, 0x18, 0xc8, 0x01, 0x32, 0x18, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, + 0x7a, 0x5d, 0x5b, 0x2d, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x2e, 0x2f, 0x5d, 0x2a, + 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x39, 0x0a, 0x1e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, + 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xda, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x42, 0x09, 0xba, 0x48, 0x06, 0x22, 0x04, 0x18, 0x64, 0x28, 0x00, 0x52, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x12, 0x30, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x18, 0xba, 0x48, 0x15, 0x72, 0x13, 0x18, 0xc8, 0x01, 0x32, 0x0e, 0x5e, 0x5b, 0x5b, + 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x3d, 0x5d, 0x2a, 0x24, 0x52, 0x06, 0x63, 0x75, 0x72, + 0x73, 0x6f, 0x72, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x52, + 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x52, 0x06, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x22, 0x68, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x34, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x8d, 0x01, + 0x0a, 0x22, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x39, 0x0a, 0x1f, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, - 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x22, 0x7a, 0x0a, 0x1f, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, - 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x22, - 0x61, 0x0a, 0x20, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, - 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x10, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x74, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x21, - 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x22, 0x13, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xd6, 0x02, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, - 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x10, 0x6f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x69, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, - 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x78, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x21, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x1b, 0x72, 0x19, 0x10, 0x01, 0x18, 0xc8, + 0x01, 0x32, 0x12, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x5d, 0x2b, 0x28, 0x5f, 0x5b, 0x61, 0x2d, 0x7a, + 0x5d, 0x2b, 0x29, 0x2a, 0x24, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x25, 0x0a, + 0x23, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xae, 0x01, 0x0a, 0x1e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x72, 0x6f, 0x6d, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x08, 0x20, 0x01, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, - 0x19, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0xd4, 0x01, 0x0a, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x29, 0x0a, 0x10, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x75, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x60, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, - 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x16, 0x0a, 0x0e, 0x47, 0x65, 0x74, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4a, 0x04, 0x08, 0x01, 0x10, - 0x02, 0x22, 0xbb, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x48, 0x00, 0x52, 0x04, 0x75, 0x73, - 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x02, 0x18, 0x01, 0x52, - 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x3b, 0x0a, 0x0d, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x22, - 0x4a, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4a, + 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x3e, 0x0a, 0x1f, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x72, 0x6f, 0x6d, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x1f, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, + 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x48, 0x0a, 0x10, 0x65, 0x6e, 0x72, 0x6f, 0x6c, + 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x1d, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x17, 0x72, 0x15, 0x32, 0x10, 0x5e, 0x5b, 0x41, + 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x98, 0x01, 0x36, + 0x52, 0x0f, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x6e, 0x63, + 0x65, 0x22, 0x66, 0x0a, 0x20, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x13, 0x0a, 0x11, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xf3, + 0x02, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x0f, 0x6f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x10, 0x6f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, + 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0c, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x10, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x73, + 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, + 0x02, 0x52, 0x0f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x75, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x12, 0x3e, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x30, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x22, 0x19, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, + 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xe8, 0x01, 0x0a, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, + 0x63, 0x6f, 0x72, 0x64, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x10, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x3e, 0x0a, 0x0a, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3e, 0x0a, 0x0a, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, + 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, + 0x22, 0x6a, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, + 0x28, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, + 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x03, + 0xe0, 0x41, 0x02, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, + 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x03, + 0xe0, 0x41, 0x02, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x16, 0x0a, 0x0e, + 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4a, 0x04, + 0x08, 0x01, 0x10, 0x02, 0x22, 0xc5, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x42, 0x03, 0xe0, + 0x41, 0x02, 0x48, 0x00, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, + 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x12, 0x40, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x6f, 0x6c, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x22, 0x51, 0x0a, 0x17, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, + 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, + 0x52, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x64, + 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x22, 0x64, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x56, 0x32, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, + 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, + 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x53, 0x0a, 0x19, 0x47, 0x65, 0x74, + 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x85, + 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x56, 0x32, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x37, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xe0, 0x41, 0x02, + 0xba, 0x48, 0x1d, 0x72, 0x1b, 0x18, 0xc8, 0x01, 0x32, 0x16, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, + 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, 0x24, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x55, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, + 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, + 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x48, 0x0a, + 0x16, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x56, 0x32, 0x52, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x53, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x44, + 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, + 0x0b, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x51, 0x0a, 0x17, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, + 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, + 0x52, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x64, + 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x22, 0x67, 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x56, 0x32, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, + 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2e, 0x0a, 0x1c, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x88, 0x01, 0x0a, + 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, + 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x56, 0x32, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x37, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xe0, 0x41, + 0x02, 0xba, 0x48, 0x1d, 0x72, 0x1b, 0x18, 0xc8, 0x01, 0x32, 0x16, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, + 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, + 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x34, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x79, 0x4e, 0x61, 0x6d, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4f, 0x0a, + 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, + 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x4a, + 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x07, 0x70, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x45, 0x0a, 0x15, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x03, 0xe0, 0x41, + 0x02, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x22, 0x4f, 0x0a, 0x14, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x31, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x70, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x4a, 0x0a, 0x15, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, + 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x13, 0x50, 0x61, 0x74, 0x63, + 0x68, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1b, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe0, 0x41, 0x02, 0xba, 0x48, + 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x28, 0x0a, 0x05, 0x70, 0x61, + 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x70, + 0x61, 0x74, 0x63, 0x68, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, + 0x61, 0x73, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, + 0x6b, 0x22, 0x49, 0x0a, 0x14, 0x50, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x70, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, + 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x03, + 0xe0, 0x41, 0x02, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x22, 0x61, 0x0a, 0x14, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x22, 0x4a, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x70, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, - 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, - 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x45, - 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x07, 0x70, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x22, 0xba, 0x01, 0x0a, 0x13, 0x50, 0x61, 0x74, 0x63, 0x68, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, - 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x28, 0x0a, 0x05, 0x70, - 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, - 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x05, - 0x70, 0x61, 0x74, 0x63, 0x68, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, - 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, - 0x73, 0x6b, 0x22, 0x44, 0x0a, 0x14, 0x50, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x70, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, - 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, - 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x22, 0x54, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x12, 0x1b, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, + 0xe0, 0x41, 0x02, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, + 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8b, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, + 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x17, - 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x66, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, - 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x21, 0x0a, 0x0c, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, - 0x46, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x70, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x55, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x46, + 0x0a, 0x0c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xba, 0x48, 0x20, 0xd8, 0x01, 0x02, 0x72, 0x1b, 0x18, 0xc8, + 0x01, 0x32, 0x16, 0x5e, 0x28, 0x5c, 0x2a, 0x7c, 0x5b, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x61, 0x2d, + 0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x5d, 0x2a, 0x29, 0x24, 0x52, 0x0b, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x4b, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, + 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x22, 0x62, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1b, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x05, 0x72, 0x03, + 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x4b, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x31, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x70, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x46, - 0x0a, 0x16, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x79, 0x49, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x07, 0x70, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x22, 0x5b, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x48, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x2c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x22, 0xe9, 0x01, - 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, - 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, - 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x94, 0x01, 0x0a, 0x0f, 0x45, 0x76, - 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x10, - 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, - 0x22, 0x83, 0x08, 0x0a, 0x14, 0x52, 0x75, 0x6c, 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x38, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x24, 0xe0, 0x41, + 0x02, 0xba, 0x48, 0x1e, 0x72, 0x1c, 0x18, 0xc8, 0x01, 0x32, 0x17, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, + 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x2f, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, + 0x2a, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, + 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x22, 0xee, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, - 0x64, 0x12, 0x1f, 0x0a, 0x09, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x72, 0x75, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x3d, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x50, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, - 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x6e, - 0x66, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1a, 0x0a, - 0x08, 0x67, 0x75, 0x69, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x67, 0x75, 0x69, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x6d, - 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x59, 0x0a, 0x18, 0x72, 0x65, 0x6d, 0x65, - 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x0e, 0x70, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x94, 0x01, 0x0a, 0x0f, 0x45, 0x76, 0x61, + 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x16, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x13, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x12, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x75, - 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x72, 0x75, - 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x75, 0x6c, 0x65, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, - 0x0a, 0x05, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x52, 0x05, 0x61, 0x6c, 0x65, 0x72, 0x74, - 0x12, 0x2f, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x10, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, - 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, - 0x75, 0x6c, 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, - 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, - 0x72, 0x6c, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x72, 0x75, 0x6c, 0x65, - 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x13, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x75, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x0d, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, - 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x6d, 0x69, - 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x50, 0x68, 0x61, 0x73, 0x65, 0x52, 0x0c, 0x72, 0x65, - 0x6c, 0x65, 0x61, 0x73, 0x65, 0x50, 0x68, 0x61, 0x73, 0x65, 0x1a, 0x3d, 0x0a, 0x0f, 0x45, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x72, 0x65, - 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x22, 0x46, 0x0a, 0x0d, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x54, 0x79, 0x70, 0x65, 0x64, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0xf7, - 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x10, 0x0a, + 0x03, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, + 0x9c, 0x08, 0x0a, 0x14, 0x52, 0x75, 0x6c, 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x72, + 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x09, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x72, 0x75, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x3d, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, + 0x50, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x66, 0x6f, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x67, + 0x75, 0x69, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, + 0x75, 0x69, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x6d, 0x65, 0x64, + 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x59, 0x0a, 0x18, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x16, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x2f, 0x0a, 0x13, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, + 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x12, 0x29, 0x0a, 0x0e, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, + 0x0c, 0x72, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a, + 0x15, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x75, + 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x30, 0x0a, 0x05, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x61, + 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x52, 0x05, 0x61, 0x6c, + 0x65, 0x72, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, + 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, + 0x72, 0x69, 0x74, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x65, 0x76, 0x61, + 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x72, 0x75, 0x6c, 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x6d, + 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x72, + 0x75, 0x6c, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x75, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x49, 0x0a, 0x0d, 0x72, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x5f, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, + 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x50, 0x68, 0x61, 0x73, 0x65, 0x42, + 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x50, 0x68, 0x61, + 0x73, 0x65, 0x1a, 0x3d, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x66, 0x6f, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x22, 0x58, + 0x0a, 0x0d, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x64, 0x49, 0x64, 0x12, + 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, + 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x05, 0x72, + 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0xee, 0x02, 0x0a, 0x1d, 0x47, 0x65, 0x74, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x38, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x24, 0xba, 0x48, 0x21, 0xd8, 0x01, 0x02, 0x72, 0x1c, + 0x18, 0xc8, 0x01, 0x32, 0x17, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, + 0x2f, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x64, 0x49, 0x64, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x16, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x12, 0x1b, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x09, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, - 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x72, 0x75, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb8, 0x01, 0x0a, 0x1e, 0x47, 0x65, 0x74, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x79, 0x4e, - 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0e, 0x70, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0d, 0x70, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x55, 0x0a, 0x16, - 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6d, - 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x45, 0x76, 0x61, - 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x14, 0x72, + 0x09, 0x42, 0x24, 0xba, 0x48, 0x21, 0xd8, 0x01, 0x02, 0x72, 0x1c, 0x18, 0xc8, 0x01, 0x32, 0x17, + 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x2f, 0x5b, 0x3a, 0x77, 0x6f, + 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, 0x24, 0x52, 0x08, 0x72, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x46, 0x0a, 0x09, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xba, 0x48, 0x26, 0xd8, 0x01, 0x02, 0x72, 0x21, 0x18, 0xc8, + 0x01, 0x32, 0x1c, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x2f, 0x27, + 0x28, 0x29, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x20, 0x3a, 0x5d, 0x2a, 0x24, 0x52, + 0x08, 0x72, 0x75, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xbd, 0x01, 0x0a, 0x1e, 0x47, 0x65, + 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x79, + 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x0e, + 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x03, + 0xe0, 0x41, 0x02, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x55, 0x0a, 0x16, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x75, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x22, 0x50, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x79, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x64, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x79, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0e, 0x70, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0d, 0x70, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x49, 0x0a, 0x1c, 0x45, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x41, 0x75, 0x74, 0x6f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1d, 0x0a, 0x07, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0xbf, 0x01, 0x0a, 0x10, 0x41, 0x75, 0x74, 0x6f, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x45, 0x0a, 0x08, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, - 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, - 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, + 0x74, 0x75, 0x73, 0x52, 0x14, 0x72, 0x75, 0x6c, 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x50, 0x0a, 0x20, 0x47, 0x65, 0x74, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x79, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x69, 0x0a, 0x21, 0x47, + 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, + 0x79, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x44, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x49, 0x0a, 0x1c, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x41, 0x75, 0x74, 0x6f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1d, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x22, 0xc4, 0x01, 0x0a, 0x10, 0x41, 0x75, 0x74, 0x6f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x64, 0x0a, 0x0d, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, @@ -13597,1715 +14887,2129 @@ var file_minder_v1_minder_proto_rawDesc = []byte{ 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x21, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, - 0x0a, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0xb3, 0x01, 0x0a, 0x07, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x14, 0x72, 0x65, 0x74, 0x69, 0x72, - 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x13, 0x72, 0x65, 0x74, 0x69, 0x72, 0x65, 0x64, - 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, - 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x42, 0x0a, 0x0a, 0x08, - 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x72, 0x65, 0x74, + 0x0a, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0xe5, 0x01, 0x0a, 0x07, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x44, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xba, 0x48, 0x20, 0xd8, 0x01, + 0x02, 0x72, 0x1b, 0x18, 0xc8, 0x01, 0x32, 0x16, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, + 0x5d, 0x5b, 0x2d, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, 0x24, 0x48, 0x00, + 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, + 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, + 0xba, 0x48, 0x08, 0xd8, 0x01, 0x02, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x48, 0x01, 0x52, 0x07, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x14, 0x72, 0x65, 0x74, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x46, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x56, 0x32, 0x12, 0x1d, - 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, - 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x44, 0x0a, 0x14, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, - 0x4b, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x0a, 0x72, 0x75, 0x6c, 0x65, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, - 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x09, 0x72, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x5c, 0x0a, 0x18, - 0x47, 0x65, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x79, 0x4e, 0x61, 0x6d, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x19, 0x47, 0x65, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x13, 0x72, 0x65, 0x74, 0x69, 0x72, + 0x65, 0x64, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, + 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x42, 0x0a, + 0x0a, 0x08, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x72, + 0x65, 0x74, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x78, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x56, 0x32, + 0x12, 0x2a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xba, 0x48, 0x08, 0xd8, 0x01, 0x02, 0x72, 0x03, 0xb0, 0x01, + 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x3f, 0x0a, 0x08, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, + 0xba, 0x48, 0x20, 0xd8, 0x01, 0x02, 0x72, 0x1b, 0x18, 0xc8, 0x01, 0x32, 0x16, 0x5e, 0x5b, 0x41, + 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, + 0x5d, 0x2a, 0x24, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x44, 0x0a, + 0x14, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x22, 0x50, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0a, + 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, 0x72, 0x75, 0x6c, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6c, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x12, 0x38, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x24, + 0xba, 0x48, 0x21, 0xd8, 0x01, 0x02, 0x72, 0x1c, 0x18, 0xc8, 0x01, 0x32, 0x17, 0x5e, 0x5b, 0x41, + 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x2f, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, + 0x5d, 0x5d, 0x2a, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x52, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x09, 0x72, 0x75, 0x6c, 0x65, 0x5f, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, - 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x08, 0x72, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x56, 0x0a, 0x16, 0x47, 0x65, 0x74, - 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x22, 0x4b, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x09, + 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, + 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x72, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x63, + 0x0a, 0x16, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x79, 0x49, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1b, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x0b, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, + 0x02, 0x69, 0x64, 0x22, 0x50, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, + 0x0a, 0x09, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, + 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x72, 0x75, 0x6c, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x54, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, + 0x0a, 0x09, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, + 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x72, 0x75, 0x6c, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x4f, 0x0a, 0x16, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x03, 0xe0, + 0x41, 0x02, 0x52, 0x08, 0x72, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x54, 0x0a, 0x15, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x09, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x03, 0xe0, + 0x41, 0x02, 0x52, 0x08, 0x72, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4a, 0x04, 0x08, 0x03, + 0x10, 0x04, 0x22, 0x4f, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x72, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x4f, - 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x09, 0x72, 0x75, 0x6c, 0x65, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, - 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x08, 0x72, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, - 0x4a, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x09, 0x72, 0x75, 0x6c, - 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, - 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x08, 0x72, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x4f, 0x0a, 0x15, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x09, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x72, 0x75, - 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x4a, 0x0a, 0x16, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x09, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, - 0x72, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x55, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, - 0x18, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf0, 0x01, 0x0a, 0x1c, 0x4c, 0x69, - 0x73, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, - 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, - 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1a, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x70, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x06, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x69, 0x6e, 0x64, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, - 0x64, 0x49, 0x64, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x72, - 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, - 0x72, 0x75, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x12, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xdd, 0x03, 0x0a, - 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, - 0x0a, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x40, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x9c, 0x01, 0x0a, - 0x1e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x76, - 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, - 0x3f, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x39, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, - 0x6c, 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x1a, 0xb0, 0x01, 0x0a, 0x17, - 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x54, 0x79, 0x70, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x72, 0x75, 0x6c, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x22, 0x62, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, 0x6c, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1b, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x05, 0x72, 0x03, + 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x18, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0xf1, 0x02, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x12, 0x45, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x29, 0xba, 0x48, 0x26, 0xd8, 0x01, 0x02, 0x72, 0x21, 0x18, 0xc8, 0x01, 0x32, 0x1c, + 0x5e, 0x28, 0x5b, 0x5b, 0x3a, 0x61, 0x6c, 0x6e, 0x75, 0x6d, 0x3a, 0x5d, 0x5d, 0x5b, 0x2d, 0x5b, + 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, 0x29, 0x3f, 0x24, 0x48, 0x00, 0x52, 0x07, + 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x4e, 0x0a, 0x0c, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xba, + 0x48, 0x26, 0xd8, 0x01, 0x02, 0x72, 0x21, 0x18, 0xc8, 0x01, 0x32, 0x1c, 0x5e, 0x28, 0x5c, 0x2a, + 0x7c, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x5d, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, + 0x30, 0x2d, 0x39, 0x5f, 0x5d, 0x2a, 0x29, 0x24, 0x48, 0x00, 0x52, 0x0b, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x64, 0x49, - 0x64, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x63, 0x0a, 0x08, 0x70, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x6d, 0x69, - 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x76, 0x61, 0x6c, - 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4a, 0x04, - 0x08, 0x01, 0x10, 0x02, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x87, 0x02, 0x0a, - 0x08, 0x52, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x17, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x88, 0x01, 0x01, - 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x70, 0x61, 0x72, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, - 0x63, 0x6b, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x46, 0x61, - 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, - 0x1a, 0x3b, 0x0a, 0x08, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, - 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x08, 0x68, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x42, 0x07, 0x0a, - 0x05, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x25, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, - 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22, 0x0e, 0x0a, - 0x0c, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3e, 0x0a, - 0x07, 0x47, 0x69, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x6f, 0x6e, - 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x6f, - 0x6e, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x98, 0x01, - 0x0a, 0x08, 0x44, 0x69, 0x66, 0x66, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x65, 0x63, - 0x6f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x54, - 0x79, 0x70, 0x65, 0x2e, 0x45, 0x63, 0x6f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x0a, 0x65, - 0x63, 0x6f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x1a, 0x39, 0x0a, - 0x09, 0x45, 0x63, 0x6f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x64, 0x65, 0x70, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x64, 0x65, 0x70, 0x66, 0x69, 0x6c, 0x65, 0x22, 0x88, 0x02, 0x0a, 0x08, 0x53, 0x65, 0x76, - 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xca, 0x01, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x15, 0x0a, 0x11, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x0d, 0x56, 0x41, 0x4c, 0x55, 0x45, - 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x1a, 0x0b, 0xea, 0xdc, 0x14, 0x07, - 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x12, 0x18, 0x0a, 0x0a, 0x56, 0x41, 0x4c, 0x55, 0x45, - 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x02, 0x1a, 0x08, 0xea, 0xdc, 0x14, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x12, 0x16, 0x0a, 0x09, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x03, - 0x1a, 0x07, 0xea, 0xdc, 0x14, 0x03, 0x6c, 0x6f, 0x77, 0x12, 0x1c, 0x0a, 0x0c, 0x56, 0x41, 0x4c, - 0x55, 0x45, 0x5f, 0x4d, 0x45, 0x44, 0x49, 0x55, 0x4d, 0x10, 0x04, 0x1a, 0x0a, 0xea, 0xdc, 0x14, - 0x06, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x12, 0x18, 0x0a, 0x0a, 0x56, 0x41, 0x4c, 0x55, 0x45, - 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, 0x05, 0x1a, 0x08, 0xea, 0xdc, 0x14, 0x04, 0x68, 0x69, 0x67, - 0x68, 0x12, 0x20, 0x0a, 0x0e, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x43, 0x52, 0x49, 0x54, 0x49, - 0x43, 0x41, 0x4c, 0x10, 0x06, 0x1a, 0x0c, 0xea, 0xdc, 0x14, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, - 0x63, 0x61, 0x6c, 0x22, 0xf4, 0x19, 0x0a, 0x08, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x13, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, - 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, - 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, - 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x68, - 0x6f, 0x72, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x73, 0x68, 0x6f, 0x72, 0x74, - 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2c, - 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x30, 0x0a, 0x03, - 0x64, 0x65, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x69, 0x6e, 0x64, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, - 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x20, - 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x1a, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x67, 0x75, 0x69, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2f, 0x0a, 0x08, - 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, - 0x69, 0x74, 0x79, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x44, 0x0a, - 0x0d, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, - 0x50, 0x68, 0x61, 0x73, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x50, 0x68, - 0x61, 0x73, 0x65, 0x1a, 0x9d, 0x16, 0x0a, 0x0a, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6e, 0x5f, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, - 0x38, 0x0a, 0x0b, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0a, 0x72, - 0x75, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x3f, 0x0a, 0x0c, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x06, 0x69, 0x6e, - 0x67, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6d, 0x69, 0x6e, - 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, - 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x67, 0x65, 0x73, - 0x74, 0x52, 0x06, 0x69, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x04, 0x65, 0x76, 0x61, - 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x66, - 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x52, 0x04, 0x65, 0x76, - 0x61, 0x6c, 0x12, 0x46, 0x0a, 0x09, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x66, 0x69, 0x6e, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x52, - 0x09, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x12, 0x3a, 0x0a, 0x05, 0x61, 0x6c, - 0x65, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x69, 0x6e, 0x64, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, - 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x52, - 0x05, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x1a, 0xc7, 0x02, 0x0a, 0x06, 0x49, 0x6e, 0x67, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x72, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x04, 0x72, 0x65, 0x73, 0x74, - 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x48, 0x01, 0x52, 0x07, - 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x08, 0x61, 0x72, - 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, - 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x48, 0x02, 0x52, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, - 0x74, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x03, 0x67, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x69, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x48, 0x03, 0x52, 0x03, 0x67, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, - 0x2c, 0x0a, 0x04, 0x64, 0x69, 0x66, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x54, 0x79, - 0x70, 0x65, 0x48, 0x04, 0x52, 0x04, 0x64, 0x69, 0x66, 0x66, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, - 0x05, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x74, - 0x69, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x42, - 0x06, 0x0a, 0x04, 0x5f, 0x67, 0x69, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x64, 0x69, 0x66, 0x66, - 0x1a, 0x97, 0x07, 0x0a, 0x04, 0x45, 0x76, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x40, 0x0a, - 0x02, 0x6a, 0x71, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6d, 0x69, 0x6e, 0x64, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, - 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x2e, 0x4a, - 0x51, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x02, 0x6a, 0x71, 0x12, - 0x41, 0x0a, 0x04, 0x72, 0x65, 0x67, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x64, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x46, 0x0a, 0x09, 0x72, 0x75, 0x6c, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x42, 0x29, 0xba, 0x48, + 0x26, 0xd8, 0x01, 0x02, 0x92, 0x01, 0x20, 0x22, 0x1e, 0x72, 0x1c, 0x18, 0xc8, 0x01, 0x32, 0x17, + 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x2f, 0x5b, 0x3a, 0x77, 0x6f, + 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, 0x24, 0x52, 0x08, 0x72, 0x75, 0x6c, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x42, 0x12, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xe2, 0x03, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x76, + 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x02, + 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x9c, 0x01, 0x0a, 0x1e, 0x45, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x76, 0x61, 0x6c, + 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x3f, 0x0a, + 0x0e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x0d, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x39, + 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, + 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x1a, 0xb0, 0x01, 0x0a, 0x17, 0x45, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x64, 0x49, 0x64, 0x52, + 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x63, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4a, 0x04, 0x08, 0x01, + 0x10, 0x02, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xb7, 0x03, 0x0a, 0x08, 0x52, + 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe0, 0x41, 0x02, 0xba, 0x48, + 0x05, 0x72, 0x03, 0x18, 0x90, 0x03, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x12, 0x43, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x2b, 0xba, 0x48, 0x28, 0xd8, 0x01, 0x02, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x28, 0x3f, 0x69, + 0x29, 0x28, 0x47, 0x45, 0x54, 0x7c, 0x50, 0x4f, 0x53, 0x54, 0x7c, 0x50, 0x55, 0x54, 0x7c, 0x50, + 0x41, 0x54, 0x43, 0x48, 0x7c, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x29, 0x24, 0x52, 0x06, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x51, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x42, 0x37, 0xba, 0x48, 0x34, 0xd8, 0x01, 0x02, 0x92, 0x01, + 0x2e, 0x22, 0x2c, 0x72, 0x2a, 0x18, 0x90, 0x03, 0x32, 0x25, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, + 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x2d, 0x5d, 0x2b, 0x3a, 0x5b, 0x5b, 0x3a, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x3a, 0x5d, 0x5b, 0x3a, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x3a, 0x5d, 0x5d, 0x2b, 0x24, 0x52, + 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x24, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xba, 0x48, 0x08, 0xd8, 0x01, 0x02, 0x72, 0x03, + 0x18, 0xe8, 0x07, 0x48, 0x00, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x88, 0x01, 0x01, 0x12, 0x2b, + 0x0a, 0x05, 0x70, 0x61, 0x72, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x15, 0xba, + 0x48, 0x12, 0xd8, 0x01, 0x02, 0x72, 0x0d, 0x18, 0x32, 0x32, 0x09, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, + 0x5f, 0x5d, 0x2b, 0x24, 0x52, 0x05, 0x70, 0x61, 0x72, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x66, + 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x2e, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x08, 0x66, 0x61, 0x6c, + 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x1a, 0x54, 0x0a, 0x08, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, + 0x6b, 0x12, 0x27, 0x0a, 0x09, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x42, 0x0a, 0xba, 0x48, 0x07, 0x1a, 0x05, 0x18, 0xd7, 0x04, 0x28, 0x64, + 0x52, 0x08, 0x68, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x0a, 0x04, 0x62, 0x6f, + 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xba, 0x48, 0x08, 0xd8, 0x01, 0x02, + 0x72, 0x03, 0x18, 0xe8, 0x07, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x42, 0x07, 0x0a, 0x05, 0x5f, + 0x62, 0x6f, 0x64, 0x79, 0x22, 0x25, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22, 0x0e, 0x0a, 0x0c, 0x41, + 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x07, 0x47, + 0x69, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x09, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x5f, + 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0e, 0xba, 0x48, 0x0b, 0xd8, 0x01, + 0x02, 0x72, 0x06, 0x18, 0xc8, 0x01, 0x88, 0x01, 0x01, 0x52, 0x08, 0x63, 0x6c, 0x6f, 0x6e, 0x65, + 0x55, 0x72, 0x6c, 0x12, 0x35, 0x0a, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x1d, 0xba, 0x48, 0x1a, 0xd8, 0x01, 0x02, 0x72, 0x15, 0x18, 0xc8, 0x01, + 0x32, 0x10, 0x5e, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x2e, 0x2f, 0x2d, 0x5d, + 0x2b, 0x24, 0x52, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0xa3, 0x02, 0x0a, 0x08, 0x44, + 0x69, 0x66, 0x66, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x65, 0x63, 0x6f, 0x73, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x54, 0x79, 0x70, 0x65, + 0x2e, 0x45, 0x63, 0x6f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x0a, 0x65, 0x63, 0x6f, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x33, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x1f, 0xba, 0x48, 0x1c, 0xd8, 0x01, 0x02, 0x72, 0x17, 0x18, 0xc8, + 0x01, 0x32, 0x12, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x5d, 0x2b, 0x28, 0x5f, 0x5b, 0x61, 0x2d, 0x7a, + 0x5d, 0x2b, 0x29, 0x2a, 0x24, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x1a, 0xa2, 0x01, 0x0a, 0x09, + 0x45, 0x63, 0x6f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x32, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1e, 0xba, 0x48, 0x1b, 0x72, 0x19, 0x10, 0x01, + 0x18, 0xc8, 0x01, 0x32, 0x12, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x5d, 0x2b, 0x28, 0x5f, 0x5b, 0x61, + 0x2d, 0x7a, 0x5d, 0x2b, 0x29, 0x2a, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x61, 0x0a, + 0x07, 0x64, 0x65, 0x70, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x47, + 0xba, 0x48, 0x44, 0x72, 0x42, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x32, 0x3b, 0x5e, 0x28, 0x5c, 0x2e, + 0x2f, 0x29, 0x3f, 0x28, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x5c, + 0x2d, 0x5d, 0x2b, 0x2f, 0x29, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, + 0x5f, 0x5c, 0x2d, 0x5d, 0x2b, 0x28, 0x5c, 0x2e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, + 0x2d, 0x39, 0x5d, 0x2b, 0x29, 0x3f, 0x24, 0x52, 0x07, 0x64, 0x65, 0x70, 0x66, 0x69, 0x6c, 0x65, + 0x22, 0xa3, 0x02, 0x0a, 0x08, 0x44, 0x65, 0x70, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x35, 0x0a, + 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x73, 0x54, 0x79, 0x70, 0x65, + 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x48, 0x00, 0x52, 0x04, + 0x72, 0x65, 0x70, 0x6f, 0x12, 0x38, 0x0a, 0x02, 0x70, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, + 0x73, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x48, 0x00, 0x52, 0x02, 0x70, 0x72, 0x1a, 0x44, + 0x0a, 0x0b, 0x52, 0x65, 0x70, 0x6f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x35, 0x0a, + 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1d, 0xba, + 0x48, 0x1a, 0xd8, 0x01, 0x02, 0x72, 0x15, 0x18, 0xc8, 0x01, 0x32, 0x10, 0x5e, 0x5b, 0x5b, 0x3a, + 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x2e, 0x2f, 0x2d, 0x5d, 0x2b, 0x24, 0x52, 0x06, 0x62, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x1a, 0x51, 0x0a, 0x12, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x3b, 0x0a, 0x06, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xba, 0x48, 0x20, 0xd8, + 0x01, 0x02, 0x72, 0x1b, 0x52, 0x0f, 0x4e, 0x45, 0x57, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x55, 0x50, + 0x44, 0x41, 0x54, 0x45, 0x44, 0x52, 0x08, 0x4e, 0x45, 0x57, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x52, + 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x88, 0x02, 0x0a, 0x08, 0x53, 0x65, 0x76, 0x65, 0x72, + 0x69, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0xca, 0x01, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x15, + 0x0a, 0x11, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x0d, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x55, + 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x1a, 0x0b, 0xea, 0xdc, 0x14, 0x07, 0x75, 0x6e, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x12, 0x18, 0x0a, 0x0a, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x49, + 0x4e, 0x46, 0x4f, 0x10, 0x02, 0x1a, 0x08, 0xea, 0xdc, 0x14, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, + 0x16, 0x0a, 0x09, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x03, 0x1a, 0x07, + 0xea, 0xdc, 0x14, 0x03, 0x6c, 0x6f, 0x77, 0x12, 0x1c, 0x0a, 0x0c, 0x56, 0x41, 0x4c, 0x55, 0x45, + 0x5f, 0x4d, 0x45, 0x44, 0x49, 0x55, 0x4d, 0x10, 0x04, 0x1a, 0x0a, 0xea, 0xdc, 0x14, 0x06, 0x6d, + 0x65, 0x64, 0x69, 0x75, 0x6d, 0x12, 0x18, 0x0a, 0x0a, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x48, + 0x49, 0x47, 0x48, 0x10, 0x05, 0x1a, 0x08, 0xea, 0xdc, 0x14, 0x04, 0x68, 0x69, 0x67, 0x68, 0x12, + 0x20, 0x0a, 0x0e, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x43, 0x52, 0x49, 0x54, 0x49, 0x43, 0x41, + 0x4c, 0x10, 0x06, 0x1a, 0x0c, 0xea, 0xdc, 0x14, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, + 0x6c, 0x22, 0x8a, 0x24, 0x0a, 0x08, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, + 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x0c, 0xba, 0x48, 0x09, 0x72, 0x07, 0x32, 0x05, 0x5e, 0x76, 0x5c, 0x64, 0x24, 0x52, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x10, 0xba, 0x48, 0x0d, 0x72, 0x0b, 0x32, 0x09, 0x72, 0x75, 0x6c, + 0x65, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xba, 0x48, 0x08, 0xd8, 0x01, 0x02, + 0x72, 0x03, 0xb0, 0x01, 0x01, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x88, 0x01, 0x01, 0x12, 0x38, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x24, 0xe0, 0x41, + 0x02, 0xba, 0x48, 0x1e, 0x72, 0x1c, 0x18, 0xc8, 0x01, 0x32, 0x17, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, + 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x2f, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, + 0x2a, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, + 0xba, 0x48, 0x26, 0xd8, 0x01, 0x02, 0x72, 0x21, 0x18, 0xc8, 0x01, 0x32, 0x1c, 0x5e, 0x5b, 0x41, + 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x2f, 0x27, 0x28, 0x29, 0x5b, 0x3a, 0x77, 0x6f, + 0x72, 0x64, 0x3a, 0x5d, 0x20, 0x3a, 0x5d, 0x2a, 0x24, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x15, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, + 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xba, 0x48, 0x08, 0xd8, 0x01, 0x02, 0x72, 0x03, 0x18, + 0x90, 0x03, 0x52, 0x13, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x2f, 0x0a, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x0d, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xe8, 0x07, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, + 0x08, 0x67, 0x75, 0x69, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x0d, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xe8, 0x07, 0x52, 0x08, + 0x67, 0x75, 0x69, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, + 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, + 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x52, + 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x44, 0x0a, 0x0d, 0x72, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x5f, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x50, 0x68, 0x61, 0x73, + 0x65, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x50, 0x68, 0x61, 0x73, 0x65, 0x1a, + 0x85, 0x1f, 0x0a, 0x0a, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, + 0x0a, 0x09, 0x69, 0x6e, 0x5f, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x1e, 0xba, 0x48, 0x1b, 0x72, 0x19, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x32, 0x12, 0x5e, + 0x5b, 0x61, 0x2d, 0x7a, 0x5d, 0x2b, 0x28, 0x5f, 0x5b, 0x61, 0x2d, 0x7a, 0x5d, 0x2b, 0x29, 0x2a, + 0x24, 0x52, 0x08, 0x69, 0x6e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x38, 0x0a, 0x0b, 0x72, + 0x75, 0x6c, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0a, 0x72, 0x75, 0x6c, 0x65, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x3f, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x06, 0x69, 0x6e, 0x67, 0x65, 0x73, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x66, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x42, 0x03, 0xe0, + 0x41, 0x02, 0x52, 0x06, 0x69, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x04, 0x65, 0x76, + 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, + 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x42, 0x03, 0xe0, + 0x41, 0x02, 0x52, 0x04, 0x65, 0x76, 0x61, 0x6c, 0x12, 0x46, 0x0a, 0x09, 0x72, 0x65, 0x6d, 0x65, + 0x64, 0x69, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x2e, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x6d, 0x65, + 0x64, 0x69, 0x61, 0x74, 0x65, 0x52, 0x09, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, + 0x12, 0x3a, 0x0a, 0x05, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x41, 0x6c, 0x65, 0x72, 0x74, 0x52, 0x05, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x1a, 0xb2, 0x03, 0x0a, + 0x06, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x32, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x2c, 0x72, 0x2a, 0x52, + 0x04, 0x72, 0x65, 0x73, 0x74, 0x52, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, + 0x07, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x52, 0x03, 0x67, 0x69, 0x74, 0x52, 0x04, 0x64, + 0x69, 0x66, 0x66, 0x52, 0x04, 0x64, 0x65, 0x70, 0x73, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x2c, 0x0a, 0x04, 0x72, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x48, 0x00, 0x52, 0x04, 0x72, 0x65, 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, + 0x07, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x74, + 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x48, 0x01, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, + 0x6e, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x48, + 0x02, 0x52, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x88, 0x01, 0x01, 0x12, 0x29, + 0x0a, 0x03, 0x67, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x69, 0x74, 0x54, 0x79, 0x70, 0x65, 0x48, + 0x03, 0x52, 0x03, 0x67, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x04, 0x64, 0x69, 0x66, + 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x54, 0x79, 0x70, 0x65, 0x48, 0x04, 0x52, 0x04, + 0x64, 0x69, 0x66, 0x66, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x04, 0x64, 0x65, 0x70, 0x73, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x70, 0x73, 0x54, 0x79, 0x70, 0x65, 0x48, 0x05, 0x52, 0x04, 0x64, 0x65, + 0x70, 0x73, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x42, 0x0a, + 0x0a, 0x08, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, + 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x67, 0x69, 0x74, 0x42, + 0x07, 0x0a, 0x05, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x64, 0x65, 0x70, + 0x73, 0x1a, 0xd3, 0x09, 0x0a, 0x04, 0x45, 0x76, 0x61, 0x6c, 0x12, 0x45, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x31, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x2b, + 0x72, 0x29, 0x52, 0x02, 0x6a, 0x71, 0x52, 0x04, 0x72, 0x65, 0x67, 0x6f, 0x52, 0x09, 0x76, 0x75, + 0x6c, 0x6e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x06, 0x74, 0x72, 0x75, 0x73, 0x74, 0x79, 0x52, + 0x0a, 0x68, 0x6f, 0x6d, 0x6f, 0x67, 0x6c, 0x79, 0x70, 0x68, 0x73, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x40, 0x0a, 0x02, 0x6a, 0x71, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, - 0x61, 0x6c, 0x2e, 0x52, 0x65, 0x67, 0x6f, 0x48, 0x00, 0x52, 0x04, 0x72, 0x65, 0x67, 0x6f, 0x88, - 0x01, 0x01, 0x12, 0x50, 0x0a, 0x09, 0x76, 0x75, 0x6c, 0x6e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x66, 0x69, 0x6e, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x2e, 0x56, 0x75, 0x6c, 0x6e, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x48, 0x01, 0x52, 0x09, 0x76, 0x75, 0x6c, 0x6e, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x06, 0x74, 0x72, 0x75, 0x73, 0x74, 0x79, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x79, - 0x48, 0x02, 0x52, 0x06, 0x74, 0x72, 0x75, 0x73, 0x74, 0x79, 0x88, 0x01, 0x01, 0x12, 0x53, 0x0a, - 0x0a, 0x68, 0x6f, 0x6d, 0x6f, 0x67, 0x6c, 0x79, 0x70, 0x68, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2e, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, + 0x61, 0x6c, 0x2e, 0x4a, 0x51, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, + 0x02, 0x6a, 0x71, 0x12, 0x41, 0x0a, 0x04, 0x72, 0x65, 0x67, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x2e, 0x48, 0x6f, 0x6d, 0x6f, 0x67, 0x6c, 0x79, 0x70, 0x68, - 0x73, 0x48, 0x03, 0x52, 0x0a, 0x68, 0x6f, 0x6d, 0x6f, 0x67, 0x6c, 0x79, 0x70, 0x68, 0x73, 0x88, - 0x01, 0x01, 0x1a, 0x8c, 0x02, 0x0a, 0x0c, 0x4a, 0x51, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, - 0x73, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x08, 0x69, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x66, 0x69, 0x6e, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x2e, 0x4a, 0x51, 0x43, 0x6f, 0x6d, - 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x52, 0x08, 0x69, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x53, 0x0a, 0x07, 0x70, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x6d, 0x69, - 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x2e, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x61, 0x6c, - 0x2e, 0x4a, 0x51, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, - 0x32, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x74, 0x1a, 0x1c, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, - 0x10, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x65, - 0x66, 0x1a, 0x71, 0x0a, 0x04, 0x52, 0x65, 0x67, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, - 0x03, 0x64, 0x65, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, - 0x2e, 0x0a, 0x10, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x76, 0x69, 0x6f, - 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x88, 0x01, 0x01, 0x42, - 0x13, 0x0a, 0x11, 0x5f, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x1a, 0x0b, 0x0a, 0x09, 0x56, 0x75, 0x6c, 0x6e, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x1a, 0x24, 0x0a, 0x06, 0x54, 0x72, 0x75, 0x73, 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x65, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x1a, 0x20, 0x0a, 0x0a, 0x48, 0x6f, 0x6d, 0x6f, 0x67, - 0x6c, 0x79, 0x70, 0x68, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x72, 0x65, - 0x67, 0x6f, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x76, 0x75, 0x6c, 0x6e, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x74, 0x72, 0x75, 0x73, 0x74, 0x79, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, - 0x68, 0x6f, 0x6d, 0x6f, 0x67, 0x6c, 0x79, 0x70, 0x68, 0x73, 0x1a, 0xc2, 0x07, 0x0a, 0x09, 0x52, - 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2c, 0x0a, 0x04, - 0x72, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, - 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x48, - 0x00, 0x52, 0x04, 0x72, 0x65, 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, 0x76, 0x0a, 0x14, 0x67, 0x68, - 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x6e, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x2e, 0x52, 0x65, 0x67, 0x6f, 0x48, 0x00, 0x52, 0x04, 0x72, + 0x65, 0x67, 0x6f, 0x88, 0x01, 0x01, 0x12, 0x50, 0x0a, 0x09, 0x76, 0x75, 0x6c, 0x6e, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, + 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x2e, 0x56, + 0x75, 0x6c, 0x6e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x48, 0x01, 0x52, 0x09, 0x76, 0x75, 0x6c, 0x6e, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x06, 0x74, 0x72, 0x75, 0x73, + 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, - 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, - 0x74, 0x65, 0x2e, 0x47, 0x68, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x74, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x48, 0x01, 0x52, 0x12, 0x67, 0x68, 0x42, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x88, - 0x01, 0x01, 0x12, 0x67, 0x0a, 0x0c, 0x70, 0x75, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x2e, 0x54, 0x72, + 0x75, 0x73, 0x74, 0x79, 0x48, 0x02, 0x52, 0x06, 0x74, 0x72, 0x75, 0x73, 0x74, 0x79, 0x88, 0x01, + 0x01, 0x12, 0x53, 0x0a, 0x0a, 0x68, 0x6f, 0x6d, 0x6f, 0x67, 0x6c, 0x79, 0x70, 0x68, 0x73, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x66, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x2e, 0x48, 0x6f, 0x6d, 0x6f, 0x67, + 0x6c, 0x79, 0x70, 0x68, 0x73, 0x48, 0x03, 0x52, 0x0a, 0x68, 0x6f, 0x6d, 0x6f, 0x67, 0x6c, 0x79, + 0x70, 0x68, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, + 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0b, 0x64, 0x61, + 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x1a, 0xd7, 0x02, 0x0a, 0x0c, 0x4a, 0x51, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x12, 0x5a, 0x0a, 0x08, 0x69, 0x6e, + 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x6d, + 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x2e, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x61, + 0x6c, 0x2e, 0x4a, 0x51, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x2e, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x69, 0x6e, + 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x53, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x66, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x2e, 0x4a, 0x51, 0x43, + 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x1a, + 0x62, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x56, 0x0a, 0x03, 0x64, + 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x44, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x3e, + 0x72, 0x3c, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x32, 0x35, 0x5e, 0x5c, 0x2e, 0x5b, 0x61, 0x2d, 0x7a, + 0x41, 0x2d, 0x5a, 0x5f, 0x5d, 0x2b, 0x28, 0x5c, 0x2e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, + 0x5f, 0x5d, 0x2b, 0x7c, 0x5c, 0x5b, 0x5c, 0x64, 0x2b, 0x5d, 0x7c, 0x5c, 0x5b, 0x22, 0x5b, 0x61, + 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x5f, 0x5d, 0x2b, 0x22, 0x5c, 0x5d, 0x29, 0x2a, 0x24, 0x52, 0x03, + 0x64, 0x65, 0x66, 0x1a, 0xb2, 0x01, 0x0a, 0x04, 0x52, 0x65, 0x67, 0x6f, 0x12, 0x38, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x24, 0xba, 0x48, 0x21, 0xd8, + 0x01, 0x02, 0x72, 0x1c, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x32, 0x15, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, + 0x5d, 0x2b, 0x28, 0x5b, 0x5f, 0x2d, 0x5d, 0x5b, 0x61, 0x2d, 0x7a, 0x5d, 0x2b, 0x29, 0x2a, 0x24, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x15, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x44, 0x0a, + 0x10, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x14, 0xba, 0x48, 0x11, 0xd8, 0x01, 0x02, 0x72, + 0x0c, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x52, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x48, 0x00, 0x52, + 0x0f, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x1a, 0x0b, 0x0a, 0x09, 0x56, 0x75, 0x6c, 0x6e, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x1a, 0x31, 0x0a, 0x06, 0x54, 0x72, 0x75, 0x73, 0x74, 0x79, 0x12, + 0x27, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x0b, 0xba, 0x48, 0x08, 0xd8, 0x01, 0x02, 0x72, 0x03, 0x88, 0x01, 0x01, 0x52, 0x08, + 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x1a, 0x4c, 0x0a, 0x0a, 0x48, 0x6f, 0x6d, 0x6f, + 0x67, 0x6c, 0x79, 0x70, 0x68, 0x73, 0x12, 0x3e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x2a, 0xba, 0x48, 0x27, 0x72, 0x25, 0x52, 0x14, 0x69, 0x6e, 0x76, + 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, + 0x73, 0x52, 0x0d, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x73, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x72, 0x65, 0x67, 0x6f, 0x42, + 0x0c, 0x0a, 0x0a, 0x5f, 0x76, 0x75, 0x6c, 0x6e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x09, 0x0a, + 0x07, 0x5f, 0x74, 0x72, 0x75, 0x73, 0x74, 0x79, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x68, 0x6f, 0x6d, + 0x6f, 0x67, 0x6c, 0x79, 0x70, 0x68, 0x73, 0x1a, 0x9c, 0x0a, 0x0a, 0x09, 0x52, 0x65, 0x6d, 0x65, + 0x64, 0x69, 0x61, 0x74, 0x65, 0x12, 0x46, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x32, 0xba, 0x48, 0x2f, 0xd8, 0x01, 0x02, 0x72, 0x2a, 0x52, 0x04, 0x72, + 0x65, 0x73, 0x74, 0x52, 0x14, 0x67, 0x68, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x5f, 0x70, + 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x70, 0x75, 0x6c, 0x6c, 0x5f, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2c, 0x0a, + 0x04, 0x72, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x48, 0x00, 0x52, 0x04, 0x72, 0x65, 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, 0x76, 0x0a, 0x14, 0x67, + 0x68, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, + 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x6d, 0x65, 0x64, 0x69, + 0x61, 0x74, 0x65, 0x2e, 0x47, 0x68, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x74, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x48, 0x01, 0x52, 0x12, 0x67, 0x68, + 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x88, 0x01, 0x01, 0x12, 0x67, 0x0a, 0x0c, 0x70, 0x75, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, + 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x6d, 0x65, 0x64, 0x69, + 0x61, 0x74, 0x65, 0x2e, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, + 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x02, 0x52, 0x0b, 0x70, 0x75, + 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x88, 0x01, 0x01, 0x1a, 0x3b, 0x0a, 0x16, + 0x47, 0x68, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xba, 0x48, 0x08, 0xd8, 0x01, 0x02, 0x72, 0x03, 0x18, + 0xe8, 0x07, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x1a, 0xc7, 0x06, 0x0a, 0x16, 0x50, 0x75, + 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x09, 0xba, 0x48, 0x06, 0x72, 0x04, 0x10, 0x01, 0x18, 0x4b, 0x52, 0x05, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1f, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x0b, 0xba, 0x48, 0x08, 0x72, 0x06, 0x10, 0x01, 0x18, 0x80, 0x80, 0x04, + 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x63, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, - 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x02, 0x52, 0x0b, 0x70, 0x75, 0x6c, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x88, 0x01, 0x01, 0x1a, 0x2e, 0x0a, 0x16, 0x47, - 0x68, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x1a, 0xae, 0x04, 0x0a, 0x16, - 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6d, 0x65, 0x64, - 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x62, 0x6f, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, - 0x12, 0x63, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x6a, 0x0a, 0x06, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x52, 0xba, 0x48, 0x4f, + 0xd8, 0x01, 0x02, 0x72, 0x4a, 0x52, 0x0e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x24, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x61, + 0x67, 0x73, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x73, 0x68, 0x61, 0x52, 0x12, 0x6d, 0x69, 0x6e, + 0x64, 0x65, 0x72, 0x2e, 0x79, 0x71, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x52, + 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x1d, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x61, 0x67, + 0x73, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x59, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x52, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x75, 0x6c, 0x6c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x54, 0x61, 0x67, 0x73, 0x57, 0x69, 0x74, 0x68, 0x53, 0x68, 0x61, 0x48, 0x00, 0x52, 0x19, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x54, 0x61, 0x67, + 0x73, 0x57, 0x69, 0x74, 0x68, 0x53, 0x68, 0x61, 0x88, 0x01, 0x01, 0x1a, 0xa4, 0x01, 0x0a, 0x07, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, + 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2a, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x12, 0xba, 0x48, 0x0f, 0x72, 0x0d, 0x10, 0x01, + 0x18, 0x32, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x06, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, + 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x11, 0xba, 0x48, 0x0e, + 0xd8, 0x01, 0x02, 0x72, 0x09, 0x18, 0x06, 0x32, 0x05, 0x5e, 0x5c, 0x64, 0x2b, 0x24, 0x48, 0x00, + 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6d, 0x6f, + 0x64, 0x65, 0x1a, 0x7d, 0x0a, 0x19, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x54, 0x61, 0x67, 0x73, 0x57, 0x69, 0x74, 0x68, 0x53, 0x68, 0x61, 0x12, + 0x60, 0x0a, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x42, 0x46, 0xba, 0x48, 0x43, 0x92, 0x01, 0x40, 0x22, 0x3e, 0x72, 0x3c, 0x18, 0xc8, 0x01, 0x32, + 0x37, 0x5e, 0x5c, 0x2e, 0x3f, 0x28, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x2e, + 0x2d, 0x5d, 0x2b, 0x5c, 0x2f, 0x29, 0x2a, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, + 0x2e, 0x2d, 0x5d, 0x2b, 0x28, 0x3f, 0x3a, 0x5c, 0x2e, 0x5b, 0x5b, 0x3a, 0x61, 0x6c, 0x6e, 0x75, + 0x6d, 0x3a, 0x5d, 0x5d, 0x2b, 0x29, 0x3f, 0x24, 0x52, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x72, 0x65, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, + 0x73, 0x68, 0x61, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x42, 0x17, 0x0a, 0x15, + 0x5f, 0x67, 0x68, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x70, 0x75, 0x6c, 0x6c, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0xfd, 0x03, 0x0a, 0x05, 0x41, 0x6c, 0x65, 0x72, 0x74, + 0x12, 0x45, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x31, + 0xba, 0x48, 0x2e, 0xd8, 0x01, 0x02, 0x72, 0x29, 0x52, 0x11, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, + 0x74, 0x79, 0x5f, 0x61, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x79, 0x52, 0x14, 0x70, 0x75, 0x6c, + 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x62, 0x0a, 0x11, 0x73, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x5f, 0x61, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x75, 0x6c, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0xa0, 0x01, - 0x0a, 0x1d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x73, 0x68, 0x61, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x59, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x66, 0x69, 0x6e, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x2e, - 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6d, 0x65, 0x64, - 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x54, 0x61, 0x67, 0x73, 0x57, 0x69, 0x74, 0x68, 0x53, 0x68, 0x61, - 0x48, 0x00, 0x52, 0x19, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x54, 0x61, 0x67, 0x73, 0x57, 0x69, 0x74, 0x68, 0x53, 0x68, 0x61, 0x88, 0x01, 0x01, - 0x1a, 0x71, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, - 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, - 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x12, 0x17, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6d, - 0x6f, 0x64, 0x65, 0x1a, 0x35, 0x0a, 0x19, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x54, 0x61, 0x67, 0x73, 0x57, 0x69, 0x74, 0x68, 0x53, 0x68, 0x61, - 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x74, - 0x61, 0x67, 0x73, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x73, 0x68, 0x61, 0x42, 0x07, 0x0a, 0x05, - 0x5f, 0x72, 0x65, 0x73, 0x74, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x67, 0x68, 0x5f, 0x62, 0x72, 0x61, - 0x6e, 0x63, 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, - 0x0a, 0x0d, 0x5f, 0x70, 0x75, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0xc0, 0x01, 0x0a, 0x05, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x62, 0x0a, - 0x11, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x61, 0x64, 0x76, 0x69, 0x73, 0x6f, - 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, - 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x41, - 0x6c, 0x65, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x53, 0x41, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, - 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x41, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x79, 0x88, 0x01, - 0x01, 0x1a, 0x29, 0x0a, 0x0b, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x53, 0x41, - 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x42, 0x14, 0x0a, 0x12, - 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x61, 0x64, 0x76, 0x69, 0x73, 0x6f, - 0x72, 0x79, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x64, 0x22, 0xb1, 0x08, 0x0a, 0x07, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x69, 0x6e, 0x64, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x52, 0x75, - 0x6c, 0x65, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x44, - 0x0a, 0x11, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x69, 0x6e, 0x64, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x52, 0x75, - 0x6c, 0x65, 0x52, 0x10, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x33, 0x0a, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, - 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x3a, 0x0a, 0x0c, 0x70, 0x75, 0x6c, - 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0b, 0x70, 0x75, 0x6c, 0x6c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, - 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, + 0x6f, 0x6e, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x53, 0x41, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x41, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x79, 0x88, 0x01, 0x01, 0x12, 0x6e, 0x0a, 0x14, 0x70, + 0x75, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, + 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x2e, + 0x41, 0x6c, 0x65, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x50, 0x52, 0x43, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x74, 0x48, 0x01, 0x52, 0x12, 0x70, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x1a, 0x5f, 0x0a, 0x0b, 0x41, + 0x6c, 0x65, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x53, 0x41, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, + 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x34, 0xba, 0x48, + 0x31, 0xd8, 0x01, 0x02, 0x72, 0x2c, 0x52, 0x07, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x52, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x52, 0x03, 0x6c, 0x6f, 0x77, 0x52, 0x06, 0x6d, 0x65, 0x64, 0x69, + 0x75, 0x6d, 0x52, 0x04, 0x68, 0x69, 0x67, 0x68, 0x52, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, + 0x61, 0x6c, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x1a, 0x49, 0x0a, 0x12, + 0x41, 0x6c, 0x65, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x50, 0x52, 0x43, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x33, 0x0a, 0x0e, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xe0, 0x41, 0x02, 0xba, + 0x48, 0x06, 0x72, 0x04, 0x18, 0x80, 0x80, 0x04, 0x52, 0x0d, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x5f, 0x61, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x79, 0x42, 0x17, 0x0a, + 0x15, 0x5f, 0x70, 0x75, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x64, 0x22, 0x8b, + 0x0c, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x20, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xba, 0x48, 0x08, 0xd8, 0x01, 0x02, 0x72, 0x03, 0xb0, 0x01, + 0x01, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x24, 0xba, 0x48, 0x21, 0xd8, 0x01, 0x02, + 0x72, 0x1c, 0x18, 0xc8, 0x01, 0x32, 0x17, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x5d, + 0x5b, 0x2d, 0x2f, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, 0x24, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, + 0x0c, 0x20, 0x03, 0x28, 0x09, 0x42, 0x73, 0xba, 0x48, 0x70, 0xd8, 0x01, 0x02, 0x92, 0x01, 0x6a, + 0x18, 0x01, 0x22, 0x66, 0x72, 0x64, 0x32, 0x62, 0x5e, 0x28, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, + 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x5d, 0x28, 0x5b, 0x2d, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, + 0x2d, 0x39, 0x5f, 0x5d, 0x7b, 0x30, 0x2c, 0x36, 0x31, 0x7d, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, + 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x5d, 0x29, 0x3f, 0x3a, 0x29, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x41, + 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x5d, 0x28, 0x5b, 0x2d, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, + 0x30, 0x2d, 0x39, 0x5f, 0x5d, 0x7b, 0x30, 0x2c, 0x36, 0x31, 0x7d, 0x5b, 0x61, 0x2d, 0x7a, 0x41, + 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x5d, 0x29, 0x3f, 0x24, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, - 0x07, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0c, 0x70, 0x69, 0x70, 0x65, - 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0b, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, - 0x65, 0x52, 0x75, 0x6e, 0x12, 0x32, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x72, 0x75, 0x6e, - 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, + 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x44, 0x0a, 0x11, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, - 0x07, 0x74, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6e, 0x12, 0x2d, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, - 0x64, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, - 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x39, 0x0a, 0x09, 0x73, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x69, 0x6e, - 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x09, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x09, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x09, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, - 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x05, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x88, 0x01, 0x01, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, - 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, - 0x65, 0x1a, 0x8a, 0x01, 0x0a, 0x04, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2f, - 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x29, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x1a, 0x7f, + 0x10, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x33, 0x0a, 0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x08, 0x61, 0x72, + 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x3a, 0x0a, 0x0c, 0x70, 0x75, 0x6c, 0x6c, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, + 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0b, 0x70, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x18, 0x0f, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x07, 0x72, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0c, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, + 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0b, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x75, + 0x6e, 0x12, 0x32, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x11, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x07, 0x74, 0x61, + 0x73, 0x6b, 0x52, 0x75, 0x6e, 0x12, 0x2d, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x12, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x12, 0x39, 0x0a, 0x09, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x52, 0x09, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x3d, 0x0a, 0x09, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x1a, 0xba, 0x48, 0x17, 0xd8, 0x01, 0x02, 0x72, 0x12, 0x52, 0x02, 0x6f, 0x6e, + 0x52, 0x03, 0x6f, 0x66, 0x66, 0x52, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x48, 0x01, + 0x52, 0x09, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x35, + 0x0a, 0x05, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1a, 0xba, + 0x48, 0x17, 0xd8, 0x01, 0x02, 0x72, 0x12, 0x52, 0x02, 0x6f, 0x6e, 0x52, 0x03, 0x6f, 0x66, 0x66, + 0x52, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x48, 0x02, 0x52, 0x05, 0x61, 0x6c, 0x65, + 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x0e, 0xba, 0x48, 0x0b, 0x72, 0x09, 0x32, 0x07, 0x70, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xba, 0x48, 0x09, 0x72, + 0x07, 0x32, 0x05, 0x5e, 0x76, 0x5c, 0x64, 0x24, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x4c, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xba, 0x48, 0x26, 0xd8, 0x01, 0x02, 0x72, + 0x21, 0x18, 0xe8, 0x07, 0x32, 0x1c, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, + 0x2d, 0x2f, 0x27, 0x28, 0x29, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x20, 0x3a, 0x5d, + 0x2a, 0x24, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x1a, + 0xdb, 0x01, 0x0a, 0x04, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x38, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x24, 0xba, 0x48, 0x21, 0xd8, 0x01, 0x02, 0x72, 0x1c, + 0x18, 0xc8, 0x01, 0x32, 0x17, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, + 0x2f, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, 0x24, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x3d, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xba, 0x48, + 0x26, 0xd8, 0x01, 0x02, 0x72, 0x21, 0x18, 0xc8, 0x01, 0x32, 0x1c, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, + 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x2f, 0x27, 0x28, 0x29, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, + 0x3a, 0x5d, 0x20, 0x3a, 0x5d, 0x2a, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x1a, 0xdd, 0x01, 0x0a, 0x08, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x20, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x39, 0x0a, 0x06, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x21, 0xba, 0x48, 0x1e, 0xd8, + 0x01, 0x02, 0x72, 0x19, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x32, 0x12, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, + 0x5d, 0x2b, 0x28, 0x5f, 0x5b, 0x61, 0x2d, 0x7a, 0x5d, 0x2b, 0x29, 0x2a, 0x24, 0x52, 0x06, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x27, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xba, 0x48, 0x08, 0xd8, 0x01, 0x02, 0x72, + 0x03, 0x18, 0xc8, 0x01, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x4e, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x42, - 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x6d, 0x65, 0x64, - 0x69, 0x61, 0x74, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x22, 0x15, - 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x46, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, - 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x58, 0x0a, - 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x45, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x2c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x44, - 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x22, 0x36, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x22, 0x89, 0x01, 0x0a, - 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, - 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x45, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, - 0x7e, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x63, 0x68, 0x12, - 0x26, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, - 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0f, - 0x0a, 0x0d, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, - 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0xaf, 0x01, 0x0a, 0x13, 0x50, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x70, - 0x61, 0x74, 0x63, 0x68, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, - 0x61, 0x73, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, - 0x6b, 0x22, 0x44, 0x0a, 0x14, 0x50, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x70, 0x72, 0x6f, + 0x01, 0x28, 0x09, 0x42, 0x2c, 0xba, 0x48, 0x29, 0xd8, 0x01, 0x02, 0x72, 0x24, 0x18, 0xe8, 0x07, + 0x32, 0x1f, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x2f, 0x2e, 0x21, + 0x3f, 0x2c, 0x3a, 0x3b, 0x27, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x20, 0x5d, 0x2a, + 0x24, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x04, + 0x08, 0x05, 0x10, 0x06, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x05, 0x0a, + 0x03, 0x5f, 0x69, 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, + 0x74, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x22, 0x15, 0x0a, 0x13, + 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x4b, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x22, 0x7e, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x38, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x24, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x1e, 0x72, 0x1c, 0x18, 0xc8, + 0x01, 0x32, 0x17, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x2f, 0x5b, + 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x4a, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, - 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x68, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x43, - 0x68, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x56, 0x32, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, - 0x65, 0x22, 0x4b, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, - 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x03, + 0xe0, 0x41, 0x02, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x44, 0x0a, 0x14, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x22, 0x3b, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x22, + 0xe4, 0x01, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x4c, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xba, 0x48, + 0x26, 0xd8, 0x01, 0x02, 0x72, 0x21, 0x18, 0xc8, 0x01, 0x32, 0x1c, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, + 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x2f, 0x27, 0x28, 0x29, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, + 0x3a, 0x5d, 0x20, 0x3a, 0x5d, 0x2a, 0x24, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x50, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2e, 0xba, 0x48, 0x2b, 0xd8, 0x01, + 0x02, 0x72, 0x26, 0x10, 0x00, 0x18, 0xe8, 0x07, 0x32, 0x1f, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, + 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x2f, 0x2e, 0x21, 0x3f, 0x2c, 0x3a, 0x3b, 0x27, 0x5b, 0x3a, 0x77, + 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x20, 0x5d, 0x2a, 0x24, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x31, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x87, - 0x01, 0x0a, 0x25, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, - 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x64, - 0x49, 0x64, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, - 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, - 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x28, 0x0a, 0x26, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, - 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x40, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, + 0x6a, 0x65, 0x63, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0xd9, 0x01, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, + 0x74, 0x63, 0x68, 0x12, 0x51, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xba, 0x48, 0x26, 0xd8, 0x01, + 0x02, 0x72, 0x21, 0x18, 0xc8, 0x01, 0x32, 0x1c, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, + 0x5d, 0x5b, 0x2d, 0x2f, 0x27, 0x28, 0x29, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x20, + 0x3a, 0x5d, 0x2a, 0x24, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x55, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2e, 0xba, 0x48, 0x2b, + 0xd8, 0x01, 0x02, 0x72, 0x26, 0x10, 0x00, 0x18, 0xe8, 0x07, 0x32, 0x1f, 0x5e, 0x5b, 0x41, 0x2d, + 0x5a, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x2f, 0x2e, 0x21, 0x3f, 0x2c, 0x3a, 0x3b, 0x27, 0x5b, + 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x20, 0x5d, 0x2a, 0x24, 0x48, 0x01, 0x52, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, + 0x0d, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0e, + 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xaf, + 0x01, 0x0a, 0x13, 0x50, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x22, 0x3a, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x72, 0x6f, 0x6c, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, - 0x22, 0x4a, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, - 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, + 0x74, 0x65, 0x78, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x70, 0x61, + 0x74, 0x63, 0x68, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, + 0x73, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, + 0x22, 0x49, 0x0a, 0x14, 0x50, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x03, 0xe0, + 0x41, 0x02, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x68, 0x0a, 0x18, 0x4c, + 0x69, 0x73, 0x74, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x56, 0x32, 0x52, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, + 0x73, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, + 0x72, 0x73, 0x69, 0x76, 0x65, 0x22, 0x50, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x69, + 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x8c, 0x01, 0x0a, 0x25, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, + 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x35, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x64, 0x49, 0x64, 0x42, 0x03, 0xe0, 0x41, 0x02, + 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x28, 0x0a, 0x26, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x40, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x22, 0x3f, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x22, 0x4a, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x41, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, + 0xa6, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x49, 0x0a, 0x10, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0f, 0x72, 0x6f, 0x6c, 0x65, 0x41, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x3c, 0x0a, 0x0b, 0x69, 0x6e, + 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x69, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x69, 0x6e, 0x76, + 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8a, 0x01, 0x0a, 0x11, 0x41, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x9c, 0x01, 0x0a, - 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x10, - 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x0f, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x37, 0x0a, 0x0b, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, - 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x85, 0x01, 0x0a, 0x11, - 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x47, 0x0a, 0x0f, + 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x8f, 0x01, 0x0a, 0x12, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0f, + 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x35, 0x0a, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x69, 0x6e, 0x76, + 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd4, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x25, 0x0a, 0x07, 0x73, + 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xba, 0x48, + 0x08, 0xd8, 0x01, 0x02, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x12, 0x3c, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x09, 0x42, 0x26, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x20, 0x92, 0x01, 0x1d, 0x22, 0x1b, 0x72, 0x19, + 0x10, 0x01, 0x18, 0xc8, 0x01, 0x32, 0x12, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x5d, 0x2b, 0x28, 0x5f, + 0x5b, 0x61, 0x2d, 0x7a, 0x5d, 0x2b, 0x29, 0x2a, 0x24, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, + 0x12, 0x20, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x0a, 0xba, 0x48, 0x07, 0xd8, 0x01, 0x02, 0x72, 0x02, 0x60, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, + 0x69, 0x6c, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x93, + 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x10, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, + 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0f, 0x72, 0x6f, 0x6c, 0x65, + 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x0b, 0x69, + 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, + 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8a, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x47, 0x0a, 0x0f, 0x72, 0x6f, 0x6c, 0x65, + 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x03, 0xe0, 0x41, + 0x02, 0x52, 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x22, 0x8f, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0f, 0x72, 0x6f, 0x6c, 0x65, + 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x72, 0x6f, + 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x35, 0x0a, 0x0a, + 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, + 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x6e, 0x0a, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, + 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0xb4, 0x03, 0x0a, 0x0e, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x35, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x21, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x1b, 0x72, 0x19, 0x10, 0x01, + 0x18, 0xc8, 0x01, 0x32, 0x12, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x5d, 0x2b, 0x28, 0x5f, 0x5b, 0x61, + 0x2d, 0x7a, 0x5d, 0x2b, 0x29, 0x2a, 0x24, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x25, 0x0a, + 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, + 0xba, 0x48, 0x08, 0xd8, 0x01, 0x02, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x07, 0x73, 0x75, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x12, 0x4c, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xba, 0x48, 0x26, 0xd8, + 0x01, 0x02, 0x72, 0x21, 0x18, 0xc8, 0x01, 0x32, 0x1c, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, + 0x7a, 0x5d, 0x5b, 0x2d, 0x2f, 0x27, 0x28, 0x29, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, + 0x20, 0x3a, 0x5d, 0x2a, 0x24, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x0b, 0xba, 0x48, 0x08, 0xd8, 0x01, 0x02, 0x72, 0x03, 0xb0, 0x01, 0x01, + 0x48, 0x00, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x88, 0x01, 0x01, 0x12, 0x20, + 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xba, + 0x48, 0x07, 0xd8, 0x01, 0x02, 0x72, 0x02, 0x60, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, + 0x12, 0x4b, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x2c, 0xba, 0x48, 0x29, 0xd8, 0x01, 0x02, 0x72, 0x24, 0x18, 0xc8, + 0x01, 0x32, 0x1f, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x20, 0x5b, + 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x5b, 0x5c, 0x5d, 0x5c, 0x28, 0x5c, 0x29, 0x5d, + 0x2a, 0x24, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x49, 0x0a, + 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x2c, 0xba, 0x48, 0x29, 0xd8, 0x01, 0x02, 0x72, 0x24, 0x18, 0xc8, 0x01, 0x32, 0x1f, 0x5e, + 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x20, 0x5b, 0x3a, 0x77, 0x6f, 0x72, + 0x64, 0x3a, 0x5d, 0x5c, 0x5b, 0x5c, 0x5d, 0x5c, 0x28, 0x5c, 0x29, 0x5d, 0x2a, 0x24, 0x52, 0x08, + 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x18, 0x0a, 0x16, 0x4c, 0x69, + 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x57, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3c, 0x0a, 0x0b, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x02, + 0x52, 0x0b, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x65, 0x0a, + 0x18, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x04, 0x63, 0x6f, 0x64, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1d, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x17, 0x72, + 0x15, 0x32, 0x10, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, + 0x5d, 0x2b, 0x24, 0x98, 0x01, 0x40, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, + 0x63, 0x65, 0x70, 0x74, 0x22, 0xb8, 0x01, 0x0a, 0x19, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, + 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, + 0x6c, 0x12, 0x1d, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x12, 0x24, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x69, 0x73, 0x41, 0x63, + 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x22, + 0xae, 0x03, 0x0a, 0x0a, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, + 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, + 0x02, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1d, 0x0a, + 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, + 0xe0, 0x41, 0x02, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x63, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, + 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x65, + 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, + 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, + 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x6f, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x12, 0x1d, 0x0a, 0x0a, + 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x53, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, + 0x22, 0x73, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x12, 0x2f, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x1b, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x15, 0x72, 0x13, 0x18, 0xc8, 0x01, 0x32, + 0x0e, 0x5e, 0x5b, 0x2d, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, 0x24, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4b, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x08, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x22, 0x9a, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, + 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x22, 0x0a, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0c, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x06, + 0x1a, 0x04, 0x18, 0x64, 0x28, 0x00, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x30, 0x0a, + 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xba, + 0x48, 0x15, 0x72, 0x13, 0x18, 0xc8, 0x01, 0x32, 0x0e, 0x5e, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, + 0x64, 0x3a, 0x5d, 0x3d, 0x5d, 0x2a, 0x24, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, + 0x67, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x7b, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, - 0x42, 0x0a, 0x0f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x22, 0x8f, 0x01, 0x0a, 0x12, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x6f, - 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0f, 0x72, 0x6f, - 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0e, - 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x35, - 0x0a, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x49, - 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, - 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, - 0x69, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x4a, - 0x04, 0x08, 0x03, 0x10, 0x04, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x93, 0x01, 0x0a, 0x12, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x44, 0x0a, 0x10, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, - 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, - 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0f, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, - 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x0b, 0x69, 0x6e, 0x76, 0x69, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0x85, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x42, 0x0a, 0x0f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x41, - 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, - 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x8f, 0x01, 0x0a, 0x12, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x42, 0x0a, 0x0f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x69, 0x6e, 0x64, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x35, 0x0a, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x04, 0x52, - 0x6f, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, - 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, - 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe4, 0x01, 0x0a, - 0x0e, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, - 0x6f, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x21, 0x0a, - 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x1d, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x88, 0x01, 0x01, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4a, 0x04, 0x08, - 0x03, 0x10, 0x04, 0x22, 0x18, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x52, 0x0a, - 0x17, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x69, 0x6e, 0x76, 0x69, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0x46, 0x0a, 0x18, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x49, 0x6e, 0x76, 0x69, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x22, 0xa9, 0x01, 0x0a, 0x19, 0x52, 0x65, - 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, - 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, - 0x73, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0a, 0x69, 0x73, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x69, - 0x73, 0x70, 0x6c, 0x61, 0x79, 0x22, 0xa4, 0x03, 0x0a, 0x0a, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, - 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x39, 0x0a, 0x0a, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, - 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, - 0x41, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x6f, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x6f, - 0x72, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x12, - 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, - 0x61, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x76, 0x69, - 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, - 0x76, 0x69, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, - 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x53, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x22, 0x56, 0x0a, 0x12, - 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x46, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x72, 0x0a, 0x14, - 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, + 0x34, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x94, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x34, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x0d, 0x61, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x15, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x31, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x66, 0x0a, 0x19, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x42, 0x79, 0x49, + 0x44, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1b, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x0b, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, + 0x02, 0x69, 0x64, 0x22, 0x31, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, + 0x41, 0x02, 0x52, 0x02, 0x69, 0x64, 0x22, 0x4a, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, - 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, - 0x22, 0x62, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x09, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, + 0x78, 0x74, 0x22, 0x4d, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x2e, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, + 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, + 0x73, 0x22, 0xb1, 0x01, 0x0a, 0x14, 0x50, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x42, + 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x29, 0x0a, + 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, - 0x72, 0x73, 0x6f, 0x72, 0x22, 0x76, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, - 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x72, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x4d, 0x0a, 0x15, 0x50, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, + 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x22, 0x42, 0x0a, 0x13, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x61, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x22, 0x5e, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x3b, 0x0a, + 0x0a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x61, 0x70, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x69, + 0x74, 0x48, 0x75, 0x62, 0x41, 0x70, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, + 0x09, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x41, 0x70, 0x70, 0x42, 0x0c, 0x0a, 0x0a, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x9f, 0x01, 0x0a, 0x0f, 0x47, 0x69, 0x74, + 0x48, 0x75, 0x62, 0x41, 0x70, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x33, 0x0a, 0x0f, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x0a, 0xba, 0x48, 0x07, 0xd8, 0x01, 0x02, 0x22, 0x02, 0x20, + 0x00, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x0a, + 0xba, 0x48, 0x07, 0xd8, 0x01, 0x02, 0x22, 0x02, 0x20, 0x00, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xeb, 0x03, 0x0a, 0x08, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xba, 0x48, 0x20, 0xd8, 0x01, 0x02, 0x72, 0x1b, 0x18, + 0xc8, 0x01, 0x32, 0x16, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x5b, + 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x35, 0x0a, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x1f, 0xba, 0x48, 0x1c, 0xd8, 0x01, 0x02, 0x72, 0x17, 0x18, 0xc8, 0x01, 0x32, 0x12, 0x5e, 0x5b, + 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2a, 0x24, + 0x52, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x12, 0x26, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x0c, 0xba, 0x48, 0x09, 0xd8, 0x01, 0x02, 0x72, 0x04, 0x32, 0x02, 0x76, 0x31, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0a, 0x69, 0x6d, 0x70, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x8f, 0x01, 0x0a, - 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x08, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1e, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, - 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x45, - 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x2c, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x59, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2c, - 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x4c, 0x0a, 0x1c, - 0x47, 0x65, 0x74, 0x55, 0x6e, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x5b, 0x0a, 0x1d, 0x47, 0x65, - 0x74, 0x55, 0x6e, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x09, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x09, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x4a, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x22, 0x48, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x22, 0xac, 0x01, - 0x0a, 0x14, 0x50, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12, - 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, - 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x48, 0x0a, 0x15, - 0x50, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x08, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x42, 0x0a, 0x13, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2b, 0x0a, - 0x11, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, - 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x22, 0x5e, 0x0a, 0x11, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, - 0x3b, 0x0a, 0x0a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x61, 0x70, 0x70, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x69, 0x74, 0x48, 0x75, 0x62, 0x41, 0x70, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, - 0x00, 0x52, 0x09, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x41, 0x70, 0x70, 0x42, 0x0c, 0x0a, 0x0a, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x0f, 0x47, - 0x69, 0x74, 0x48, 0x75, 0x62, 0x41, 0x70, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x27, - 0x0a, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, - 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x6f, - 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xfa, 0x02, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x37, 0x0a, 0x0a, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x69, 0x6d, - 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3b, 0x0a, 0x0a, 0x61, 0x75, 0x74, - 0x68, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, - 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6c, 0x6f, 0x77, 0x52, 0x09, 0x61, 0x75, 0x74, - 0x68, 0x46, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6e, - 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x61, 0x6c, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x22, 0x5b, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x88, - 0x03, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1f, 0x0a, - 0x0b, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, - 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, - 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0b, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, - 0x61, 0x6c, 0x65, 0x72, 0x74, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x65, - 0x72, 0x74, 0x12, 0x2e, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x66, 0x72, - 0x6f, 0x6d, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x29, - 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x75, 0x72, 0x73, 0x6f, - 0x72, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x5c, 0x0a, 0x1c, 0x47, 0x65, 0x74, - 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0a, 0x65, 0x76, 0x61, - 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x76, 0x61, - 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7c, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x45, + 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x3b, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x66, 0x6c, 0x6f, 0x77, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x46, 0x6c, 0x6f, 0x77, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x46, 0x6c, 0x6f, 0x77, 0x73, + 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x2b, + 0x0a, 0x11, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xba, 0x48, 0x08, 0xd8, 0x01, 0x02, 0x72, + 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x68, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x0b, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x22, 0xad, 0x05, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x12, 0x41, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x20, 0xba, 0x48, 0x1d, 0xd8, 0x01, 0x02, 0x92, 0x01, + 0x17, 0x22, 0x15, 0x72, 0x13, 0x18, 0xc8, 0x01, 0x32, 0x0e, 0x5e, 0x5b, 0x2c, 0x5b, 0x3a, 0x77, + 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, 0x24, 0x52, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x42, 0x23, 0xba, 0x48, 0x20, 0xd8, 0x01, + 0x02, 0x92, 0x01, 0x1a, 0x22, 0x18, 0x72, 0x16, 0x18, 0xc8, 0x01, 0x32, 0x11, 0x5e, 0x5b, 0x2c, + 0x2d, 0x2e, 0x2f, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, 0x24, 0x52, 0x0a, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x0c, 0x70, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, + 0x42, 0x29, 0xba, 0x48, 0x26, 0xd8, 0x01, 0x02, 0x92, 0x01, 0x20, 0x22, 0x1e, 0x72, 0x1c, 0x18, + 0xc8, 0x01, 0x32, 0x17, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x2f, + 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, 0x24, 0x52, 0x0b, 0x70, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x42, 0x20, 0xba, 0x48, 0x1d, 0xd8, 0x01, 0x02, + 0x92, 0x01, 0x17, 0x22, 0x15, 0x72, 0x13, 0x18, 0xc8, 0x01, 0x32, 0x0e, 0x5e, 0x5b, 0x2c, 0x5b, + 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, 0x24, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x42, 0x0a, 0x0b, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x42, 0x20, 0xba, 0x48, 0x1d, 0xd8, 0x01, 0x02, 0x92, + 0x01, 0x17, 0x22, 0x15, 0x72, 0x13, 0x18, 0xc8, 0x01, 0x32, 0x0e, 0x5e, 0x5b, 0x2c, 0x5b, 0x3a, + 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, 0x24, 0x52, 0x0b, 0x72, 0x65, 0x6d, 0x65, 0x64, + 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x05, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x09, 0x42, 0x20, 0xba, 0x48, 0x1d, 0xd8, 0x01, 0x02, 0x92, 0x01, 0x17, + 0x22, 0x15, 0x72, 0x13, 0x18, 0xc8, 0x01, 0x32, 0x0e, 0x5e, 0x5b, 0x2c, 0x5b, 0x3a, 0x77, 0x6f, + 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, 0x24, 0x52, 0x05, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x12, 0x2e, + 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x2a, + 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x4b, 0x0a, 0x0c, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, + 0x42, 0x28, 0xba, 0x48, 0x25, 0xd8, 0x01, 0x02, 0x92, 0x01, 0x1f, 0x22, 0x1d, 0x72, 0x1b, 0x18, + 0xc8, 0x01, 0x32, 0x16, 0x5e, 0x28, 0x5c, 0x2a, 0x7c, 0x5b, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x61, + 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x5d, 0x2a, 0x29, 0x24, 0x52, 0x0b, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, + 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, + 0x6f, 0x72, 0x22, 0x61, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0a, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x29, 0x0a, 0x04, 0x70, 0x61, - 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x50, 0x61, 0x67, 0x65, 0x52, - 0x04, 0x70, 0x61, 0x67, 0x65, 0x22, 0x94, 0x03, 0x0a, 0x11, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x3a, 0x0a, 0x06, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6d, 0x69, - 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, - 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x34, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x74, 0x6f, 0x72, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x65, 0x76, 0x61, 0x6c, 0x75, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x81, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x76, + 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x12, 0x3a, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, - 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x37, 0x0a, 0x05, 0x61, 0x6c, 0x65, - 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x52, 0x05, 0x61, 0x6c, 0x65, - 0x72, 0x74, 0x12, 0x49, 0x0a, 0x0b, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0b, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, - 0x0c, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0b, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x64, 0x0a, 0x17, - 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0x93, 0x01, 0x0a, 0x15, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, - 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x52, 0x08, - 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x22, 0x4b, 0x0a, 0x17, 0x45, 0x76, 0x61, 0x6c, + 0x6f, 0x72, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x29, + 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, + 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x50, + 0x61, 0x67, 0x65, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x22, 0xad, 0x03, 0x0a, 0x11, 0x45, 0x76, + 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, + 0x3f, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x61, 0x6c, + 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x12, 0x39, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x75, 0x6c, 0x65, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, + 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x37, 0x0a, 0x05, + 0x61, 0x6c, 0x65, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x52, 0x05, + 0x61, 0x6c, 0x65, 0x72, 0x74, 0x12, 0x49, 0x0a, 0x0b, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x69, 0x6e, + 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x72, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x42, 0x0a, 0x0c, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x02, 0x69, 0x64, 0x22, 0x73, 0x0a, 0x17, 0x45, 0x76, 0x61, + 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xa7, + 0x01, 0x0a, 0x15, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x20, 0x0a, 0x09, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x72, 0x75, 0x6c, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, + 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x22, 0x55, 0x0a, 0x17, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x50, 0x0a, 0x1c, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x6d, 0x65, 0x64, 0x69, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, + 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x1d, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, + 0x55, 0x0a, 0x1c, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x4f, 0x0a, 0x16, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x41, 0x6c, 0x65, 0x72, 0x74, + 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x4a, 0x0a, 0x16, 0x45, 0x76, 0x61, 0x6c, 0x75, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x41, 0x6c, 0x65, 0x72, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x22, 0xc4, 0x01, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x56, 0x32, 0x52, 0x07, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0a, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0xa3, 0x01, 0x0a, 0x11, 0x55, - 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x66, - 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x56, 0x32, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x12, 0x25, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, - 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x2a, 0x62, 0x0a, 0x0b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, - 0x1c, 0x0a, 0x18, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4f, 0x57, 0x4e, 0x45, 0x52, 0x5f, - 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, - 0x14, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4f, 0x57, 0x4e, 0x45, 0x52, 0x5f, 0x50, 0x52, - 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x42, 0x4a, 0x45, 0x43, - 0x54, 0x5f, 0x4f, 0x57, 0x4e, 0x45, 0x52, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x10, 0x03, 0x22, 0x04, - 0x08, 0x01, 0x10, 0x01, 0x2a, 0x95, 0x0e, 0x0a, 0x08, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1f, 0x0a, 0x0f, 0x52, - 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x01, - 0x1a, 0x0a, 0xea, 0xdc, 0x14, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x0c, - 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x45, 0x54, 0x10, 0x02, 0x1a, 0x07, - 0xea, 0xdc, 0x14, 0x03, 0x67, 0x65, 0x74, 0x12, 0x1f, 0x0a, 0x0f, 0x52, 0x45, 0x4c, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x03, 0x1a, 0x0a, 0xea, 0xdc, - 0x14, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0f, 0x52, 0x45, 0x4c, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x04, 0x1a, 0x0a, 0xea, - 0xdc, 0x14, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x0a, 0x12, 0x52, 0x45, 0x4c, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, - 0x05, 0x1a, 0x0d, 0xea, 0xdc, 0x14, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, - 0x12, 0x3b, 0x0a, 0x1d, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x4f, 0x4c, - 0x45, 0x5f, 0x41, 0x53, 0x53, 0x49, 0x47, 0x4e, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x4c, 0x49, 0x53, - 0x54, 0x10, 0x06, 0x1a, 0x18, 0xea, 0xdc, 0x14, 0x14, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x3f, 0x0a, - 0x1f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x41, - 0x53, 0x53, 0x49, 0x47, 0x4e, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, - 0x10, 0x07, 0x1a, 0x1a, 0xea, 0xdc, 0x14, 0x16, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, - 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x3f, - 0x0a, 0x1f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, - 0x41, 0x53, 0x53, 0x49, 0x47, 0x4e, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, - 0x45, 0x10, 0x08, 0x1a, 0x1a, 0xea, 0xdc, 0x14, 0x16, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, - 0x23, 0x0a, 0x11, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x50, 0x4f, - 0x5f, 0x47, 0x45, 0x54, 0x10, 0x09, 0x1a, 0x0c, 0xea, 0xdc, 0x14, 0x08, 0x72, 0x65, 0x70, 0x6f, - 0x5f, 0x67, 0x65, 0x74, 0x12, 0x29, 0x0a, 0x14, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x52, 0x45, 0x50, 0x4f, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x0a, 0x1a, 0x0f, - 0xea, 0xdc, 0x14, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xc4, 0x01, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x56, + 0x32, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x6d, + 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0xa3, + 0x01, 0x0a, 0x11, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x52, 0x65, 0x66, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x56, 0x32, 0x52, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x12, 0x25, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x37, 0x0a, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0xe2, 0x02, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x0f, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x09, 0x72, 0x07, 0x32, 0x05, + 0x5e, 0x76, 0x5c, 0x64, 0x24, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x14, 0xba, 0x48, + 0x11, 0x72, 0x0f, 0x18, 0x0c, 0x52, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x56, 0x32, 0x52, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x35, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x21, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x1b, 0x72, 0x19, + 0x18, 0xc8, 0x01, 0x32, 0x14, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x5f, 0x5b, 0x3a, + 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2a, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x1e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0e, 0xe0, 0x41, 0x03, + 0xba, 0x48, 0x08, 0xd8, 0x01, 0x02, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x3d, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x48, 0x00, 0x52, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x12, 0x2f, + 0x0a, 0x04, 0x72, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, + 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x44, 0x61, 0x74, + 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x04, 0x72, 0x65, 0x73, 0x74, 0x42, + 0x08, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x22, 0xbb, 0x02, 0x0a, 0x10, 0x53, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x36, + 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x66, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x03, 0x64, 0x65, 0x66, 0x1a, 0x95, 0x01, 0x0a, 0x03, 0x44, 0x65, 0x66, 0x12, 0x3d, + 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, + 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x44, + 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x66, 0x2e, 0x50, 0x61, + 0x74, 0x68, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x1a, 0x4f, 0x0a, + 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x0c, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xd8, 0x01, 0x02, + 0x52, 0x0c, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x73, 0x1a, 0x57, + 0x0a, 0x08, 0x44, 0x65, 0x66, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x66, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf6, 0x06, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x74, + 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x34, 0x0a, 0x03, 0x64, 0x65, + 0x66, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x2e, 0x44, 0x65, 0x66, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x64, 0x65, 0x66, + 0x1a, 0xd6, 0x05, 0x0a, 0x03, 0x44, 0x65, 0x66, 0x12, 0x36, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1a, 0xe0, 0x41, 0x02, 0xba, + 0x48, 0x14, 0x72, 0x12, 0x18, 0xa0, 0x06, 0x32, 0x0d, 0x5e, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3f, + 0x3a, 0x2f, 0x2f, 0x2e, 0x2a, 0x24, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x12, 0x3f, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x27, 0xba, 0x48, 0x24, 0xd8, 0x01, 0x02, 0x72, 0x1f, 0x52, 0x03, 0x47, 0x45, 0x54, 0x52, + 0x04, 0x50, 0x4f, 0x53, 0x54, 0x52, 0x03, 0x50, 0x55, 0x54, 0x52, 0x05, 0x50, 0x41, 0x54, 0x43, + 0x48, 0x52, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x12, 0x44, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x44, 0x65, + 0x66, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x07, 0x62, 0x6f, 0x64, 0x79, 0x6f, + 0x62, 0x6a, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x48, 0x00, 0x52, 0x07, 0x62, 0x6f, 0x64, 0x79, 0x6f, 0x62, 0x6a, 0x12, 0x24, 0x0a, 0x07, + 0x62, 0x6f, 0x64, 0x79, 0x73, 0x74, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, + 0x48, 0x05, 0x72, 0x03, 0x18, 0xe8, 0x07, 0x48, 0x00, 0x52, 0x07, 0x62, 0x6f, 0x64, 0x79, 0x73, + 0x74, 0x72, 0x12, 0x31, 0x0a, 0x0f, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, + 0x72, 0x02, 0x18, 0x32, 0x48, 0x00, 0x52, 0x0d, 0x62, 0x6f, 0x64, 0x79, 0x46, 0x72, 0x6f, 0x6d, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x24, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x73, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x0e, 0xba, 0x48, 0x0b, 0xd8, 0x01, 0x02, 0x72, 0x06, 0x52, 0x04, + 0x6a, 0x73, 0x6f, 0x6e, 0x52, 0x05, 0x70, 0x61, 0x72, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x08, 0x66, + 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x66, 0x2e, 0x46, 0x61, 0x6c, + 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, + 0x3b, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x05, 0x42, 0x12, 0xba, 0x48, 0x0f, 0xd8, 0x01, 0x02, + 0x92, 0x01, 0x09, 0x22, 0x07, 0x1a, 0x05, 0x18, 0xd7, 0x04, 0x28, 0x64, 0x52, 0x0e, 0x65, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3a, 0x0a, 0x0c, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0b, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x1a, 0x3a, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5b, 0x0a, 0x08, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, + 0x12, 0x2e, 0x0a, 0x0b, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0d, 0xba, 0x48, 0x0a, 0xd8, 0x01, 0x02, 0x1a, 0x05, 0x18, + 0xd7, 0x04, 0x28, 0x64, 0x52, 0x0a, 0x68, 0x74, 0x74, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x1f, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, + 0xba, 0x48, 0x08, 0xd8, 0x01, 0x02, 0x72, 0x03, 0x18, 0xe8, 0x07, 0x52, 0x04, 0x62, 0x6f, 0x64, + 0x79, 0x42, 0x06, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x1a, 0x55, 0x0a, 0x08, 0x44, 0x65, 0x66, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x2e, 0x44, 0x65, 0x66, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x49, 0x0a, 0x13, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1e, 0xba, 0x48, 0x1b, 0x72, 0x19, 0x18, 0xc8, 0x01, 0x32, + 0x14, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x5d, 0x5b, 0x2d, 0x5f, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, + 0x3a, 0x5d, 0x5d, 0x2a, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x62, 0x0a, 0x0b, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x18, 0x4f, 0x42, + 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4f, 0x57, 0x4e, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x4f, 0x42, 0x4a, 0x45, + 0x43, 0x54, 0x5f, 0x4f, 0x57, 0x4e, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, + 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4f, 0x57, 0x4e, + 0x45, 0x52, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x10, 0x03, 0x22, 0x04, 0x08, 0x01, 0x10, 0x01, 0x2a, + 0xf3, 0x0f, 0x0a, 0x08, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x14, + 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1f, 0x0a, 0x0f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x01, 0x1a, 0x0a, 0xea, 0xdc, 0x14, + 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x0c, 0x52, 0x45, 0x4c, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x45, 0x54, 0x10, 0x02, 0x1a, 0x07, 0xea, 0xdc, 0x14, 0x03, 0x67, + 0x65, 0x74, 0x12, 0x1f, 0x0a, 0x0f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, + 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x03, 0x1a, 0x0a, 0xea, 0xdc, 0x14, 0x06, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x04, 0x1a, 0x0a, 0xea, 0xdc, 0x14, 0x06, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x0a, 0x12, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x05, 0x1a, 0x0d, 0xea, 0xdc, + 0x14, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x1d, 0x52, + 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x41, 0x53, 0x53, + 0x49, 0x47, 0x4e, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x06, 0x1a, 0x18, + 0xea, 0xdc, 0x14, 0x14, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x1f, 0x52, 0x45, 0x4c, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x41, 0x53, 0x53, 0x49, 0x47, 0x4e, + 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x07, 0x1a, 0x1a, 0xea, + 0xdc, 0x14, 0x16, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x1f, 0x52, 0x45, 0x4c, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x41, 0x53, 0x53, 0x49, 0x47, + 0x4e, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x08, 0x1a, 0x1a, + 0xea, 0xdc, 0x14, 0x16, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x23, 0x0a, 0x11, 0x52, 0x45, + 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x50, 0x4f, 0x5f, 0x47, 0x45, 0x54, 0x10, + 0x09, 0x1a, 0x0c, 0xea, 0xdc, 0x14, 0x08, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x67, 0x65, 0x74, 0x12, 0x29, 0x0a, 0x14, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x50, 0x4f, - 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x0b, 0x1a, 0x0f, 0xea, 0xdc, 0x14, 0x0b, 0x72, - 0x65, 0x70, 0x6f, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x29, 0x0a, 0x14, 0x52, 0x45, - 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x50, 0x4f, 0x5f, 0x44, 0x45, 0x4c, 0x45, - 0x54, 0x45, 0x10, 0x0c, 0x1a, 0x0f, 0xea, 0xdc, 0x14, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x15, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x41, 0x52, 0x54, 0x49, 0x46, 0x41, 0x43, 0x54, 0x5f, 0x47, 0x45, 0x54, 0x10, 0x0d, - 0x1a, 0x10, 0xea, 0xdc, 0x14, 0x0c, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x5f, 0x67, - 0x65, 0x74, 0x12, 0x31, 0x0a, 0x18, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, - 0x52, 0x54, 0x49, 0x46, 0x41, 0x43, 0x54, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x0e, - 0x1a, 0x13, 0xea, 0xdc, 0x14, 0x0f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x5f, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x31, 0x0a, 0x18, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x41, 0x52, 0x54, 0x49, 0x46, 0x41, 0x43, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, - 0x45, 0x10, 0x0f, 0x1a, 0x13, 0xea, 0xdc, 0x14, 0x0f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, - 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x31, 0x0a, 0x18, 0x52, 0x45, 0x4c, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x52, 0x54, 0x49, 0x46, 0x41, 0x43, 0x54, 0x5f, 0x44, 0x45, - 0x4c, 0x45, 0x54, 0x45, 0x10, 0x10, 0x1a, 0x13, 0xea, 0xdc, 0x14, 0x0f, 0x61, 0x72, 0x74, 0x69, - 0x66, 0x61, 0x63, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0f, 0x52, - 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x5f, 0x47, 0x45, 0x54, 0x10, 0x11, - 0x1a, 0x0a, 0xea, 0xdc, 0x14, 0x06, 0x70, 0x72, 0x5f, 0x67, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x12, - 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x5f, 0x43, 0x52, 0x45, 0x41, - 0x54, 0x45, 0x10, 0x12, 0x1a, 0x0d, 0xea, 0xdc, 0x14, 0x09, 0x70, 0x72, 0x5f, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x12, 0x25, 0x0a, 0x12, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x50, 0x52, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x13, 0x1a, 0x0d, 0xea, 0xdc, 0x14, - 0x09, 0x70, 0x72, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x0a, 0x12, 0x52, 0x45, - 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, - 0x10, 0x14, 0x1a, 0x0d, 0xea, 0xdc, 0x14, 0x09, 0x70, 0x72, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x12, 0x2b, 0x0a, 0x15, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, - 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x47, 0x45, 0x54, 0x10, 0x15, 0x1a, 0x10, 0xea, 0xdc, - 0x14, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x67, 0x65, 0x74, 0x12, 0x31, - 0x0a, 0x18, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, - 0x44, 0x45, 0x52, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x16, 0x1a, 0x13, 0xea, 0xdc, - 0x14, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x12, 0x31, 0x0a, 0x18, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, - 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x17, 0x1a, - 0x13, 0xea, 0xdc, 0x14, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x12, 0x31, 0x0a, 0x18, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, - 0x10, 0x18, 0x1a, 0x13, 0xea, 0xdc, 0x14, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2d, 0x0a, 0x16, 0x52, 0x45, 0x4c, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x45, - 0x54, 0x10, 0x19, 0x1a, 0x11, 0xea, 0xdc, 0x14, 0x0d, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x5f, 0x67, 0x65, 0x74, 0x12, 0x33, 0x0a, 0x19, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x52, 0x45, - 0x41, 0x54, 0x45, 0x10, 0x1a, 0x1a, 0x14, 0xea, 0xdc, 0x14, 0x10, 0x72, 0x75, 0x6c, 0x65, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x19, 0x52, - 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x1b, 0x1a, 0x14, 0xea, 0xdc, 0x14, 0x10, - 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x12, 0x33, 0x0a, 0x19, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x55, 0x4c, - 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x1c, 0x1a, - 0x14, 0xea, 0xdc, 0x14, 0x10, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x29, 0x0a, 0x14, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x47, 0x45, 0x54, 0x10, 0x1d, 0x1a, - 0x0f, 0xea, 0xdc, 0x14, 0x0b, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x67, 0x65, 0x74, - 0x12, 0x2f, 0x0a, 0x17, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, - 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x1e, 0x1a, 0x12, 0xea, - 0xdc, 0x14, 0x0e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x12, 0x2f, 0x0a, 0x17, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, - 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x1f, 0x1a, 0x12, - 0xea, 0xdc, 0x14, 0x0e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x12, 0x2f, 0x0a, 0x17, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, - 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x20, 0x1a, - 0x12, 0xea, 0xdc, 0x14, 0x0e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x1b, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x47, - 0x45, 0x54, 0x10, 0x21, 0x1a, 0x16, 0xea, 0xdc, 0x14, 0x12, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x12, 0x31, 0x0a, 0x18, - 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x54, 0x45, 0x5f, - 0x52, 0x45, 0x50, 0x4f, 0x5f, 0x47, 0x45, 0x54, 0x10, 0x22, 0x1a, 0x13, 0xea, 0xdc, 0x14, 0x0f, - 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x67, 0x65, 0x74, 0x12, - 0x55, 0x0a, 0x2a, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x54, 0x49, - 0x54, 0x59, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x43, 0x49, 0x4c, 0x49, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x23, 0x1a, - 0x25, 0xea, 0xdc, 0x14, 0x21, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x63, 0x6f, - 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, + 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x0a, 0x1a, 0x0f, 0xea, 0xdc, 0x14, 0x0b, 0x72, + 0x65, 0x70, 0x6f, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x29, 0x0a, 0x14, 0x52, 0x45, + 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x50, 0x4f, 0x5f, 0x55, 0x50, 0x44, 0x41, + 0x54, 0x45, 0x10, 0x0b, 0x1a, 0x0f, 0xea, 0xdc, 0x14, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x29, 0x0a, 0x14, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x52, 0x45, 0x50, 0x4f, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x0c, 0x1a, + 0x0f, 0xea, 0xdc, 0x14, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x12, 0x2b, 0x0a, 0x15, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x52, 0x54, + 0x49, 0x46, 0x41, 0x43, 0x54, 0x5f, 0x47, 0x45, 0x54, 0x10, 0x0d, 0x1a, 0x10, 0xea, 0xdc, 0x14, + 0x0c, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x5f, 0x67, 0x65, 0x74, 0x12, 0x31, 0x0a, + 0x18, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x52, 0x54, 0x49, 0x46, 0x41, + 0x43, 0x54, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x0e, 0x1a, 0x13, 0xea, 0xdc, 0x14, + 0x0f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x12, 0x31, 0x0a, 0x18, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x52, 0x54, + 0x49, 0x46, 0x41, 0x43, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x0f, 0x1a, 0x13, + 0xea, 0xdc, 0x14, 0x0f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x5f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x12, 0x31, 0x0a, 0x18, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x41, 0x52, 0x54, 0x49, 0x46, 0x41, 0x43, 0x54, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, + 0x10, 0x1a, 0x13, 0xea, 0xdc, 0x14, 0x0f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x5f, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x5f, 0x47, 0x45, 0x54, 0x10, 0x11, 0x1a, 0x0a, 0xea, 0xdc, 0x14, + 0x06, 0x70, 0x72, 0x5f, 0x67, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x12, 0x52, 0x45, 0x4c, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x12, 0x1a, + 0x0d, 0xea, 0xdc, 0x14, 0x09, 0x70, 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x25, + 0x0a, 0x12, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x5f, 0x55, 0x50, + 0x44, 0x41, 0x54, 0x45, 0x10, 0x13, 0x1a, 0x0d, 0xea, 0xdc, 0x14, 0x09, 0x70, 0x72, 0x5f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x0a, 0x12, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x50, 0x52, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x14, 0x1a, 0x0d, 0xea, + 0xdc, 0x14, 0x09, 0x70, 0x72, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x15, + 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, + 0x52, 0x5f, 0x47, 0x45, 0x54, 0x10, 0x15, 0x1a, 0x10, 0xea, 0xdc, 0x14, 0x0c, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x67, 0x65, 0x74, 0x12, 0x31, 0x0a, 0x18, 0x52, 0x45, 0x4c, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x43, + 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x16, 0x1a, 0x13, 0xea, 0xdc, 0x14, 0x0f, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x31, 0x0a, 0x18, + 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, + 0x52, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x17, 0x1a, 0x13, 0xea, 0xdc, 0x14, 0x0f, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, + 0x31, 0x0a, 0x18, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x56, + 0x49, 0x44, 0x45, 0x52, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x18, 0x1a, 0x13, 0xea, + 0xdc, 0x14, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x12, 0x2d, 0x0a, 0x16, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, + 0x55, 0x4c, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x45, 0x54, 0x10, 0x19, 0x1a, 0x11, + 0xea, 0xdc, 0x14, 0x0d, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x67, 0x65, + 0x74, 0x12, 0x33, 0x0a, 0x19, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x55, + 0x4c, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x1a, + 0x1a, 0x14, 0xea, 0xdc, 0x14, 0x10, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x19, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x43, - 0x49, 0x4c, 0x45, 0x10, 0x24, 0x1a, 0x14, 0xea, 0xdc, 0x14, 0x10, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x12, 0x3f, 0x0a, 0x1f, 0x52, - 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x41, 0x53, 0x53, - 0x49, 0x47, 0x4e, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x25, - 0x1a, 0x1a, 0xea, 0xdc, 0x14, 0x16, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2a, 0x82, 0x01, 0x0a, - 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, - 0x1f, 0x0a, 0x1b, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x18, 0x0a, 0x14, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, - 0x52, 0x43, 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x54, 0x41, - 0x52, 0x47, 0x45, 0x54, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x55, 0x53, - 0x45, 0x52, 0x10, 0x02, 0x12, 0x1b, 0x0a, 0x17, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x52, - 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x10, - 0x03, 0x2a, 0xdc, 0x01, 0x0a, 0x06, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x12, - 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x52, - 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x4f, 0x52, 0x49, 0x45, 0x53, 0x10, 0x01, 0x12, 0x1d, 0x0a, - 0x19, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x45, 0x4e, - 0x56, 0x49, 0x52, 0x4f, 0x4e, 0x4d, 0x45, 0x4e, 0x54, 0x53, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, - 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x41, 0x52, 0x54, 0x49, 0x46, 0x41, 0x43, 0x54, 0x53, - 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x55, 0x4c, - 0x4c, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x53, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, - 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45, 0x10, 0x05, - 0x12, 0x17, 0x0a, 0x13, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x49, 0x50, 0x45, 0x4c, - 0x49, 0x4e, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x10, 0x06, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4e, 0x54, - 0x49, 0x54, 0x59, 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x52, 0x55, 0x4e, 0x10, 0x07, 0x12, 0x10, - 0x0a, 0x0c, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x10, 0x08, - 0x2a, 0xf9, 0x01, 0x0a, 0x14, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x6c, - 0x65, 0x61, 0x73, 0x65, 0x50, 0x68, 0x61, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x23, 0x52, 0x55, 0x4c, + 0x4f, 0x4e, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x50, 0x44, + 0x41, 0x54, 0x45, 0x10, 0x1b, 0x1a, 0x14, 0xea, 0xdc, 0x14, 0x10, 0x72, 0x75, 0x6c, 0x65, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x19, 0x52, + 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x1c, 0x1a, 0x14, 0xea, 0xdc, 0x14, 0x10, + 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x12, 0x29, 0x0a, 0x14, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, + 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x47, 0x45, 0x54, 0x10, 0x1d, 0x1a, 0x0f, 0xea, 0xdc, 0x14, 0x0b, + 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x67, 0x65, 0x74, 0x12, 0x2f, 0x0a, 0x17, 0x52, + 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x5f, + 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x1e, 0x1a, 0x12, 0xea, 0xdc, 0x14, 0x0e, 0x70, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2f, 0x0a, 0x17, + 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, + 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x1f, 0x1a, 0x12, 0xea, 0xdc, 0x14, 0x0e, 0x70, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2f, 0x0a, + 0x17, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, + 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x20, 0x1a, 0x12, 0xea, 0xdc, 0x14, 0x0e, + 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x37, + 0x0a, 0x1b, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, + 0x4c, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x47, 0x45, 0x54, 0x10, 0x21, 0x1a, + 0x16, 0xea, 0xdc, 0x14, 0x12, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x12, 0x31, 0x0a, 0x18, 0x52, 0x45, 0x4c, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x50, 0x4f, 0x5f, + 0x47, 0x45, 0x54, 0x10, 0x22, 0x1a, 0x13, 0xea, 0xdc, 0x14, 0x0f, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x67, 0x65, 0x74, 0x12, 0x55, 0x0a, 0x2a, 0x52, 0x45, + 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x52, 0x45, + 0x43, 0x4f, 0x4e, 0x43, 0x49, 0x4c, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x41, 0x53, + 0x4b, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x23, 0x1a, 0x25, 0xea, 0xdc, 0x14, 0x21, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x12, 0x33, 0x0a, 0x19, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, + 0x54, 0x49, 0x54, 0x59, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x43, 0x49, 0x4c, 0x45, 0x10, 0x24, + 0x1a, 0x14, 0xea, 0xdc, 0x14, 0x10, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x63, + 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x12, 0x3f, 0x0a, 0x1f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x41, 0x53, 0x53, 0x49, 0x47, 0x4e, 0x4d, 0x45, + 0x4e, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x25, 0x1a, 0x1a, 0xea, 0xdc, 0x14, + 0x16, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x31, 0x0a, 0x18, 0x52, 0x45, 0x4c, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, + 0x47, 0x45, 0x54, 0x10, 0x26, 0x1a, 0x13, 0xea, 0xdc, 0x14, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x74, 0x12, 0x37, 0x0a, 0x1b, 0x52, 0x45, + 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x53, 0x4f, 0x55, 0x52, + 0x43, 0x45, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x27, 0x1a, 0x16, 0xea, 0xdc, 0x14, + 0x12, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x1b, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, + 0x54, 0x45, 0x10, 0x28, 0x1a, 0x16, 0xea, 0xdc, 0x14, 0x12, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x1b, + 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x53, 0x4f, + 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x29, 0x1a, 0x16, 0xea, + 0xdc, 0x14, 0x12, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x2a, 0x82, 0x01, 0x0a, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x41, 0x52, 0x47, + 0x45, 0x54, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x54, 0x41, 0x52, + 0x47, 0x45, 0x54, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4e, 0x4f, 0x4e, + 0x45, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x52, 0x45, + 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x10, 0x02, 0x12, 0x1b, 0x0a, + 0x17, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, + 0x5f, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x03, 0x2a, 0xdc, 0x01, 0x0a, 0x06, 0x45, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, + 0x13, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x52, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x4f, + 0x52, 0x49, 0x45, 0x53, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, + 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x45, 0x4e, 0x56, 0x49, 0x52, 0x4f, 0x4e, 0x4d, 0x45, + 0x4e, 0x54, 0x53, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, + 0x41, 0x52, 0x54, 0x49, 0x46, 0x41, 0x43, 0x54, 0x53, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x45, + 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x55, 0x4c, 0x4c, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, + 0x53, 0x54, 0x53, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, + 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45, 0x10, 0x05, 0x12, 0x17, 0x0a, 0x13, 0x45, 0x4e, 0x54, + 0x49, 0x54, 0x59, 0x5f, 0x50, 0x49, 0x50, 0x45, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x52, 0x55, 0x4e, + 0x10, 0x06, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x54, 0x41, 0x53, + 0x4b, 0x5f, 0x52, 0x55, 0x4e, 0x10, 0x07, 0x12, 0x10, 0x0a, 0x0c, 0x45, 0x4e, 0x54, 0x49, 0x54, + 0x59, 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x10, 0x08, 0x2a, 0xf9, 0x01, 0x0a, 0x14, 0x52, 0x75, + 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x50, 0x68, 0x61, + 0x73, 0x65, 0x12, 0x27, 0x0a, 0x23, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45, 0x5f, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2c, 0x0a, 0x1d, 0x52, + 0x55, 0x4c, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45, + 0x5f, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x41, 0x4c, 0x50, 0x48, 0x41, 0x10, 0x01, 0x1a, 0x09, + 0xea, 0xdc, 0x14, 0x05, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x12, 0x2a, 0x0a, 0x1c, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45, 0x5f, 0x50, - 0x48, 0x41, 0x53, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x2c, 0x0a, 0x1d, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45, 0x5f, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x41, 0x4c, - 0x50, 0x48, 0x41, 0x10, 0x01, 0x1a, 0x09, 0xea, 0xdc, 0x14, 0x05, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x12, 0x2a, 0x0a, 0x1c, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, - 0x4c, 0x45, 0x41, 0x53, 0x45, 0x5f, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x42, 0x45, 0x54, 0x41, - 0x10, 0x02, 0x1a, 0x08, 0xea, 0xdc, 0x14, 0x04, 0x62, 0x65, 0x74, 0x61, 0x12, 0x26, 0x0a, 0x1a, - 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, - 0x45, 0x5f, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x47, 0x41, 0x10, 0x03, 0x1a, 0x06, 0xea, 0xdc, - 0x14, 0x02, 0x67, 0x61, 0x12, 0x36, 0x0a, 0x22, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45, 0x5f, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, - 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x10, 0x04, 0x1a, 0x0e, 0xea, 0xdc, - 0x14, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x2a, 0x97, 0x02, 0x0a, - 0x0c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, - 0x19, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x24, 0x0a, 0x14, - 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x49, - 0x54, 0x48, 0x55, 0x42, 0x10, 0x01, 0x1a, 0x0a, 0xea, 0xdc, 0x14, 0x06, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x12, 0x20, 0x0a, 0x12, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x54, 0x10, 0x02, 0x1a, 0x08, 0xea, 0xdc, 0x14, 0x04, - 0x72, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x11, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x49, 0x54, 0x10, 0x03, 0x1a, 0x07, 0xea, 0xdc, 0x14, - 0x03, 0x67, 0x69, 0x74, 0x12, 0x1e, 0x0a, 0x11, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x43, 0x49, 0x10, 0x04, 0x1a, 0x07, 0xea, 0xdc, 0x14, - 0x03, 0x6f, 0x63, 0x69, 0x12, 0x2e, 0x0a, 0x19, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x50, 0x4f, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x45, - 0x52, 0x10, 0x05, 0x1a, 0x0f, 0xea, 0xdc, 0x14, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x2d, 0x6c, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x1a, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x5f, 0x4c, 0x49, 0x53, 0x54, - 0x45, 0x52, 0x10, 0x06, 0x1a, 0x10, 0xea, 0xdc, 0x14, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2d, - 0x6c, 0x69, 0x73, 0x74, 0x65, 0x72, 0x2a, 0xd5, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x4f, 0x56, - 0x49, 0x44, 0x45, 0x52, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x25, 0x0a, 0x15, 0x50, 0x52, 0x4f, 0x56, + 0x48, 0x41, 0x53, 0x45, 0x5f, 0x42, 0x45, 0x54, 0x41, 0x10, 0x02, 0x1a, 0x08, 0xea, 0xdc, 0x14, + 0x04, 0x62, 0x65, 0x74, 0x61, 0x12, 0x26, 0x0a, 0x1a, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45, 0x5f, 0x50, 0x48, 0x41, 0x53, 0x45, + 0x5f, 0x47, 0x41, 0x10, 0x03, 0x1a, 0x06, 0xea, 0xdc, 0x14, 0x02, 0x67, 0x61, 0x12, 0x36, 0x0a, + 0x22, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x4c, 0x45, 0x41, + 0x53, 0x45, 0x5f, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, + 0x54, 0x45, 0x44, 0x10, 0x04, 0x1a, 0x0e, 0xea, 0xdc, 0x14, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, + 0x63, 0x61, 0x74, 0x65, 0x64, 0x2a, 0x97, 0x02, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, + 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x24, 0x0a, 0x14, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, + 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x10, 0x01, 0x1a, + 0x0a, 0xea, 0xdc, 0x14, 0x06, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x12, 0x20, 0x0a, 0x12, 0x50, + 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, + 0x54, 0x10, 0x02, 0x1a, 0x08, 0xea, 0xdc, 0x14, 0x04, 0x72, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, + 0x11, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, + 0x49, 0x54, 0x10, 0x03, 0x1a, 0x07, 0xea, 0xdc, 0x14, 0x03, 0x67, 0x69, 0x74, 0x12, 0x1e, 0x0a, + 0x11, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, + 0x43, 0x49, 0x10, 0x04, 0x1a, 0x07, 0xea, 0xdc, 0x14, 0x03, 0x6f, 0x63, 0x69, 0x12, 0x2e, 0x0a, + 0x19, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, + 0x45, 0x50, 0x4f, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x45, 0x52, 0x10, 0x05, 0x1a, 0x0f, 0xea, 0xdc, + 0x14, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x30, 0x0a, + 0x1a, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, + 0x4d, 0x41, 0x47, 0x45, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x45, 0x52, 0x10, 0x06, 0x1a, 0x10, 0xea, + 0xdc, 0x14, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x72, 0x2a, + 0xd5, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x43, 0x4c, + 0x41, 0x53, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x25, 0x0a, 0x15, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x43, 0x4c, + 0x41, 0x53, 0x53, 0x5f, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x10, 0x01, 0x1a, 0x0a, 0xea, 0xdc, + 0x14, 0x06, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x12, 0x2d, 0x0a, 0x19, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x47, 0x49, 0x54, 0x48, 0x55, - 0x42, 0x10, 0x01, 0x1a, 0x0a, 0xea, 0xdc, 0x14, 0x06, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x12, - 0x2d, 0x0a, 0x19, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x43, 0x4c, 0x41, 0x53, - 0x53, 0x5f, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x5f, 0x41, 0x50, 0x50, 0x10, 0x02, 0x1a, 0x0e, - 0xea, 0xdc, 0x14, 0x0a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2d, 0x61, 0x70, 0x70, 0x12, 0x21, - 0x0a, 0x13, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, - 0x5f, 0x47, 0x48, 0x43, 0x52, 0x10, 0x03, 0x1a, 0x08, 0xea, 0xdc, 0x14, 0x04, 0x67, 0x68, 0x63, - 0x72, 0x12, 0x2b, 0x0a, 0x18, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x43, 0x4c, - 0x41, 0x53, 0x53, 0x5f, 0x44, 0x4f, 0x43, 0x4b, 0x45, 0x52, 0x48, 0x55, 0x42, 0x10, 0x04, 0x1a, - 0x0d, 0xea, 0xdc, 0x14, 0x09, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x68, 0x75, 0x62, 0x2a, 0xa9, - 0x02, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x46, 0x6c, 0x6f, 0x77, 0x12, 0x22, 0x0a, 0x1e, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x5a, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x25, 0x0a, 0x17, 0x41, 0x55, 0x54, 0x48, - 0x4f, 0x52, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x4e, - 0x4f, 0x4e, 0x45, 0x10, 0x01, 0x1a, 0x08, 0xea, 0xdc, 0x14, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x12, - 0x31, 0x0a, 0x1d, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x49, 0x4e, 0x50, 0x55, 0x54, - 0x10, 0x02, 0x1a, 0x0e, 0xea, 0xdc, 0x14, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x12, 0x59, 0x0a, 0x31, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x4f, 0x41, 0x55, 0x54, 0x48, 0x32, 0x5f, - 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, - 0x44, 0x45, 0x5f, 0x46, 0x4c, 0x4f, 0x57, 0x10, 0x03, 0x1a, 0x22, 0xea, 0xdc, 0x14, 0x1e, 0x6f, - 0x61, 0x75, 0x74, 0x68, 0x32, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x3b, 0x0a, - 0x22, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, - 0x4c, 0x4f, 0x57, 0x5f, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x5f, 0x41, 0x50, 0x50, 0x5f, 0x46, - 0x4c, 0x4f, 0x57, 0x10, 0x04, 0x1a, 0x13, 0xea, 0xdc, 0x14, 0x0f, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x5f, 0x61, 0x70, 0x70, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x2a, 0xbb, 0x01, 0x0a, 0x10, 0x43, - 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x21, 0x0a, 0x1d, 0x43, 0x52, 0x45, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x53, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x22, 0x0a, 0x15, 0x43, 0x52, 0x45, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, - 0x53, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x01, 0x1a, 0x07, 0xea, - 0xdc, 0x14, 0x03, 0x73, 0x65, 0x74, 0x12, 0x26, 0x0a, 0x17, 0x43, 0x52, 0x45, 0x44, 0x45, 0x4e, - 0x54, 0x49, 0x41, 0x4c, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x45, - 0x54, 0x10, 0x02, 0x1a, 0x09, 0xea, 0xdc, 0x14, 0x05, 0x75, 0x6e, 0x73, 0x65, 0x74, 0x12, 0x38, - 0x0a, 0x20, 0x43, 0x52, 0x45, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x53, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x42, - 0x4c, 0x45, 0x10, 0x03, 0x1a, 0x12, 0xea, 0xdc, 0x14, 0x0e, 0x6e, 0x6f, 0x74, 0x5f, 0x61, 0x70, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x32, 0x7d, 0x0a, 0x0d, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6c, 0x0a, 0x0b, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x1d, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0xaa, 0xf8, 0x18, 0x04, 0x10, 0x01, 0x30, - 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, - 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x32, 0xbc, 0x03, 0x0a, 0x0f, 0x41, 0x72, 0x74, 0x69, - 0x66, 0x61, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x95, 0x01, 0x0a, 0x0d, - 0x4c, 0x69, 0x73, 0x74, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x12, 0x1f, 0x2e, - 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x72, - 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, - 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x41, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x0d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, - 0x5a, 0x13, 0x12, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x72, 0x74, 0x69, - 0x66, 0x61, 0x63, 0x74, 0x73, 0x12, 0x1c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, - 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x7d, 0x12, 0x7f, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, - 0x63, 0x74, 0x42, 0x79, 0x49, 0x64, 0x12, 0x21, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x42, 0x79, - 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, 0x69, 0x6e, 0x64, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, - 0x74, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0xaa, - 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x0d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x2f, - 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x8f, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, - 0x66, 0x61, 0x63, 0x74, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x2e, 0x6d, 0x69, 0x6e, - 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, - 0x63, 0x74, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x24, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, - 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x0d, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, - 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x7b, 0x6e, 0x61, - 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x32, 0xb6, 0x05, 0x0a, 0x0c, 0x4f, 0x41, 0x75, 0x74, 0x68, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x86, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x41, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x52, 0x4c, 0x12, - 0x25, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, + 0x42, 0x5f, 0x41, 0x50, 0x50, 0x10, 0x02, 0x1a, 0x0e, 0xea, 0xdc, 0x14, 0x0a, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2d, 0x61, 0x70, 0x70, 0x12, 0x21, 0x0a, 0x13, 0x50, 0x52, 0x4f, 0x56, 0x49, + 0x44, 0x45, 0x52, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x47, 0x48, 0x43, 0x52, 0x10, 0x03, + 0x1a, 0x08, 0xea, 0xdc, 0x14, 0x04, 0x67, 0x68, 0x63, 0x72, 0x12, 0x2b, 0x0a, 0x18, 0x50, 0x52, + 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x44, 0x4f, 0x43, + 0x4b, 0x45, 0x52, 0x48, 0x55, 0x42, 0x10, 0x04, 0x1a, 0x0d, 0xea, 0xdc, 0x14, 0x09, 0x64, 0x6f, + 0x63, 0x6b, 0x65, 0x72, 0x68, 0x75, 0x62, 0x2a, 0xa9, 0x02, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6c, 0x6f, 0x77, 0x12, 0x22, 0x0a, + 0x1e, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, + 0x4c, 0x4f, 0x57, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x25, 0x0a, 0x17, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x01, 0x1a, 0x08, + 0xea, 0xdc, 0x14, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x12, 0x31, 0x0a, 0x1d, 0x41, 0x55, 0x54, 0x48, + 0x4f, 0x52, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x55, + 0x53, 0x45, 0x52, 0x5f, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x10, 0x02, 0x1a, 0x0e, 0xea, 0xdc, 0x14, + 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x59, 0x0a, 0x31, 0x41, + 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4c, 0x4f, + 0x57, 0x5f, 0x4f, 0x41, 0x55, 0x54, 0x48, 0x32, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, + 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x46, 0x4c, 0x4f, 0x57, + 0x10, 0x03, 0x1a, 0x22, 0xea, 0xdc, 0x14, 0x1e, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x5f, 0x61, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x64, + 0x65, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x3b, 0x0a, 0x22, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, + 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x47, 0x49, 0x54, + 0x48, 0x55, 0x42, 0x5f, 0x41, 0x50, 0x50, 0x5f, 0x46, 0x4c, 0x4f, 0x57, 0x10, 0x04, 0x1a, 0x13, + 0xea, 0xdc, 0x14, 0x0f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x61, 0x70, 0x70, 0x5f, 0x66, + 0x6c, 0x6f, 0x77, 0x2a, 0xbb, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x52, 0x45, 0x44, + 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x22, 0x0a, 0x15, 0x43, + 0x52, 0x45, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x53, 0x45, 0x54, 0x10, 0x01, 0x1a, 0x07, 0xea, 0xdc, 0x14, 0x03, 0x73, 0x65, 0x74, 0x12, + 0x26, 0x0a, 0x17, 0x43, 0x52, 0x45, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x53, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x45, 0x54, 0x10, 0x02, 0x1a, 0x09, 0xea, 0xdc, + 0x14, 0x05, 0x75, 0x6e, 0x73, 0x65, 0x74, 0x12, 0x38, 0x0a, 0x20, 0x43, 0x52, 0x45, 0x44, 0x45, + 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4e, 0x4f, 0x54, + 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x1a, 0x12, 0xea, + 0xdc, 0x14, 0x0e, 0x6e, 0x6f, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, + 0x65, 0x32, 0x7d, 0x0a, 0x0d, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x6c, 0x0a, 0x0b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x12, 0x1d, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x1e, 0xaa, 0xf8, 0x18, 0x04, 0x10, 0x01, 0x30, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, + 0x12, 0x0e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x32, 0xbc, 0x03, 0x0a, 0x0f, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x95, 0x01, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x72, 0x74, + 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x41, 0xaa, 0xf8, 0x18, 0x04, 0x30, + 0x03, 0x38, 0x0d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x5a, 0x13, 0x12, 0x11, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x12, 0x1c, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, + 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x7d, 0x12, 0x7f, 0x0a, 0x0f, + 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x42, 0x79, 0x49, 0x64, 0x12, + 0x21, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, + 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x0d, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, + 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x8f, 0x01, + 0x0a, 0x11, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x42, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x23, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x42, 0x79, 0x4e, 0x61, 0x6d, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, + 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, + 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x0d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, + 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x32, + 0xb6, 0x05, 0x0a, 0x0c, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x86, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x52, 0x4c, 0x12, 0x25, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x26, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x52, 0x4c, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, - 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x75, 0x72, 0x6c, - 0x12, 0xac, 0x01, 0x0a, 0x12, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x24, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, - 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x49, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x17, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x3b, 0x3a, 0x01, 0x2a, 0x5a, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x22, 0x1d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x7b, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0xd2, 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x29, 0x2e, 0x6d, 0x69, - 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x72, 0x6f, 0x6d, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, + 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, + 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x75, 0x72, 0x6c, 0x12, 0xac, 0x01, 0x0a, 0x12, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x24, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x49, 0xaa, + 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x3a, 0x01, 0x2a, + 0x5a, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, + 0x75, 0x74, 0x68, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x1d, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x7d, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0xd2, 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x29, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2a, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, + 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x60, 0xaa, 0xf8, 0x18, + 0x04, 0x30, 0x03, 0x38, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4f, 0x5a, 0x21, 0x12, 0x1f, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x79, 0x2f, 0x7b, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x7d, 0x12, 0x2a, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x7b, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x7d, 0x88, 0x02, 0x01, 0x12, 0x98, 0x01, + 0x0a, 0x18, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x2a, 0x2e, 0x6d, 0x69, 0x6e, + 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x60, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x17, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x4f, 0x5a, 0x21, 0x12, 0x1f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, - 0x74, 0x68, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x2f, 0x7b, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x7d, 0x12, 0x2a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, - 0x75, 0x74, 0x68, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x7b, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x7d, 0x88, 0x02, 0x01, 0x12, 0x98, 0x01, 0x0a, 0x18, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x12, 0x2a, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x72, 0x65, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, - 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0xaa, 0xf8, 0x18, 0x04, - 0x30, 0x03, 0x38, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x32, - 0xe9, 0x0a, 0x0a, 0x11, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xc7, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x24, 0x2e, 0x6d, - 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x64, 0xaa, 0xf8, 0x18, 0x04, 0x30, - 0x03, 0x38, 0x0a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x56, 0x3a, 0x01, 0x2a, 0x5a, 0x20, 0x3a, 0x01, - 0x2a, 0x22, 0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x22, 0x2f, + 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x23, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x17, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, + 0x68, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x32, 0xe9, 0x0a, 0x0a, 0x11, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xc7, + 0x01, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x24, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x64, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x0a, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x56, 0x3a, 0x01, 0x2a, 0x5a, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x72, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x22, 0x2f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, + 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x7d, 0x2f, + 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0xf1, 0x01, 0x0a, 0x22, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, + 0x34, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, + 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0xaa, 0xf8, + 0x18, 0x04, 0x30, 0x03, 0x38, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x50, 0x5a, 0x1d, 0x12, 0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2f, 0x7b, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, - 0xf1, 0x01, 0x0a, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x34, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x6d, - 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x46, - 0x72, 0x6f, 0x6d, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x5e, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x22, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x50, 0x5a, 0x1d, 0x12, 0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x72, 0x65, 0x6d, 0x6f, - 0x74, 0x65, 0x12, 0x2f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x70, 0x6f, + 0x72, 0x69, 0x65, 0x73, 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x2f, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, + 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0xad, 0x01, 0x0a, + 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, + 0x73, 0x12, 0x22, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x50, 0xaa, 0xf8, 0x18, 0x04, + 0x30, 0x03, 0x38, 0x09, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x42, 0x5a, 0x16, 0x12, 0x14, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, + 0x65, 0x73, 0x12, 0x28, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x72, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x12, 0xad, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, - 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x50, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x09, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x42, 0x5a, 0x16, 0x12, 0x14, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x28, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x31, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x2f, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x7d, 0x12, 0x95, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x49, 0x64, 0x12, 0x23, 0x2e, 0x6d, 0x69, 0x6e, 0x64, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, - 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x09, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x27, 0x12, 0x25, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x69, 0x64, 0x2f, 0x7b, 0x72, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xd0, 0x01, 0x0a, 0x13, + 0x72, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x7d, 0x12, 0x95, 0x01, 0x0a, + 0x11, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, + 0x49, 0x64, 0x12, 0x23, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x49, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0xaa, + 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x09, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x12, 0x25, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x2f, 0x69, 0x64, 0x2f, 0x7b, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, + 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xd0, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x2e, 0x6d, + 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x25, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x4e, - 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x69, 0x6e, - 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x6a, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x09, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x5c, 0x5a, 0x23, 0x12, 0x21, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x7b, 0x6e, - 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x35, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, - 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x7d, 0x2f, - 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x9e, - 0x01, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x42, 0x79, 0x49, 0x64, 0x12, 0x26, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x27, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6a, 0xaa, 0xf8, 0x18, + 0x04, 0x30, 0x03, 0x38, 0x09, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5c, 0x5a, 0x23, 0x12, 0x21, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, + 0x12, 0x35, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2f, 0x7b, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x7b, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x9e, 0x01, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x49, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, - 0x38, 0x0c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x2a, 0x25, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x31, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x69, 0x64, 0x2f, - 0x7b, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x12, - 0xd9, 0x01, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x2e, 0x6d, 0x69, 0x6e, - 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x79, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x6a, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x0c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5c, 0x5a, - 0x23, 0x2a, 0x21, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, - 0x3d, 0x2a, 0x2a, 0x7d, 0x2a, 0x35, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x6e, 0x61, 0x6d, - 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x32, 0xce, 0x04, 0x0a, 0x0b, - 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x68, 0x0a, 0x0a, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x6d, 0x69, 0x6e, 0x64, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0xaa, 0xf8, 0x18, 0x02, 0x30, 0x02, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, - 0x2f, 0x75, 0x73, 0x65, 0x72, 0x12, 0x65, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x1a, 0xaa, 0xf8, 0x18, 0x02, 0x30, 0x02, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x2a, 0x0c, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x12, 0x5c, 0x0a, 0x07, - 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, - 0xaa, 0xf8, 0x18, 0x02, 0x30, 0x02, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x12, 0x80, 0x01, 0x0a, 0x0f, 0x4c, - 0x69, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, - 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, - 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x22, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0xaa, 0xf8, 0x18, 0x02, 0x30, 0x02, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, - 0x72, 0x2f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8c, 0x01, - 0x0a, 0x11, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x49, 0x6e, 0x76, 0x69, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, - 0xaa, 0xf8, 0x18, 0x02, 0x30, 0x02, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1e, 0x2f, 0x61, + 0x12, 0x26, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x49, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x35, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x0c, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x27, 0x2a, 0x25, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x69, 0x64, 0x2f, 0x7b, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xd9, 0x01, 0x0a, 0x16, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x28, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, + 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, + 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6a, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, + 0x38, 0x0c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5c, 0x5a, 0x23, 0x2a, 0x21, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x6e, + 0x61, 0x6d, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x2a, 0x35, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x2a, 0x2a, 0x7d, 0x32, 0xce, 0x04, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x68, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1d, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x1d, 0xaa, 0xf8, 0x18, 0x02, 0x30, 0x02, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, + 0x22, 0x0c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x12, 0x65, + 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x6d, + 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x69, 0x6e, + 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0xaa, 0xf8, 0x18, 0x02, 0x30, + 0x02, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x2a, 0x0c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, + 0x2f, 0x75, 0x73, 0x65, 0x72, 0x12, 0x5c, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x12, 0x19, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0xaa, 0xf8, 0x18, 0x02, 0x30, 0x02, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x75, + 0x73, 0x65, 0x72, 0x12, 0x80, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, 0x69, 0x6e, + 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, + 0xaa, 0xf8, 0x18, 0x02, 0x30, 0x02, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x76, 0x69, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x64, 0x65, 0x7d, 0x32, 0xbe, 0x09, 0x0a, - 0x0e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x76, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x22, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x1e, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x14, 0x3a, 0x01, 0x2a, 0x22, 0x0f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, - 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x76, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x69, 0x6e, 0x64, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0xaa, 0xf8, 0x18, - 0x04, 0x30, 0x03, 0x38, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x3a, 0x01, 0x2a, 0x1a, 0x0f, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, - 0x7c, 0x0a, 0x0c, 0x50, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, - 0x1e, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x74, 0x63, - 0x68, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x74, 0x63, - 0x68, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x2b, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, - 0x3a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x32, 0x14, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, - 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x78, 0x0a, - 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1f, - 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x24, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x16, 0x2a, 0x14, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x71, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x1e, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, - 0x38, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x7b, 0x0a, 0x0e, 0x47, 0x65, - 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x79, 0x49, 0x64, 0x12, 0x20, 0x2e, 0x6d, - 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x24, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x16, 0x12, 0x14, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x8b, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x2e, 0x6d, - 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x23, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x1d, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, - 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0xa4, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x28, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x79, 0x4e, - 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x69, 0x6e, - 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x21, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x12, 0x25, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, - 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x9e, 0x01, 0x0a, - 0x19, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x42, 0x79, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2b, 0x2e, 0x6d, 0x69, 0x6e, - 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x79, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x42, 0x79, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x21, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x32, 0x98, 0x06, - 0x0a, 0x0f, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x76, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x19, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, - 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x12, 0x90, 0x01, 0x0a, 0x11, 0x47, 0x65, - 0x74, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x23, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, - 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x79, 0x4e, 0x61, - 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0xaa, 0xf8, 0x18, 0x04, - 0x30, 0x03, 0x38, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x6e, 0x61, - 0x6d, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x80, 0x01, 0x0a, - 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x79, 0x49, 0x64, - 0x12, 0x21, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x79, 0x49, 0x64, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, - 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, - 0x2f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, - 0x7b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x20, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x1a, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x31, 0x2f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x12, 0x7b, 0x0a, 0x0e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, - 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x21, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x24, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x1b, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x1a, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, - 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x12, 0x7d, 0x0a, 0x0e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x2e, 0x6d, 0x69, - 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, - 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x6f, 0x6c, + 0x76, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x2e, 0x6d, + 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, + 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0xaa, 0xf8, 0x18, 0x02, 0x30, 0x02, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x75, + 0x73, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, + 0x63, 0x6f, 0x64, 0x65, 0x7d, 0x32, 0xbe, 0x09, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x76, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x69, 0x6e, + 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0xaa, 0xf8, + 0x18, 0x04, 0x30, 0x03, 0x38, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x3a, 0x01, 0x2a, 0x22, + 0x0f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x12, 0x76, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x1f, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x14, 0x3a, 0x01, 0x2a, 0x1a, 0x0f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, + 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x7c, 0x0a, 0x0c, 0x50, 0x61, 0x74, 0x63, + 0x68, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0xaa, 0xf8, 0x18, 0x04, 0x30, + 0x03, 0x38, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, + 0x32, 0x14, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x78, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0xaa, 0xf8, 0x18, 0x04, + 0x30, 0x03, 0x38, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x2a, 0x14, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x7b, 0x69, 0x64, 0x7d, + 0x12, 0x71, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x12, 0x1e, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x20, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x12, 0x12, 0x10, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x12, 0x7b, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x42, 0x79, 0x49, 0x64, 0x12, 0x20, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x79, 0x49, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x79, + 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0xaa, 0xf8, 0x18, 0x04, + 0x30, 0x03, 0x38, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x7b, 0x69, 0x64, 0x7d, + 0x12, 0x8b, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, + 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, + 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2f, + 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0xa4, + 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, + 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x12, 0x25, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2f, + 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x9e, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x79, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x12, 0x2b, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x42, 0x79, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2c, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x79, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, + 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x32, 0xfd, 0x07, 0x0a, 0x11, 0x44, 0x61, 0x74, 0x61, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x83, 0x01, 0x0a, + 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x22, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0xaa, 0xf8, 0x18, 0x04, + 0x30, 0x03, 0x38, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x42, 0x79, 0x49, 0x64, 0x12, 0x23, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, + 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, + 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x28, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x26, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x61, 0x74, + 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x98, 0x01, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, + 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, + 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6d, + 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x26, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x24, 0x12, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x61, + 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x7b, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x7e, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, + 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, + 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x24, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x26, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x16, 0x12, 0x14, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x61, 0x74, 0x61, + 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x10, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x22, 0x2e, + 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x28, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x1a, 0x13, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x31, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x91, + 0x01, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x42, 0x79, 0x49, 0x64, 0x12, 0x26, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x27, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x79, 0x49, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, + 0x38, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x2a, 0x18, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, + 0x31, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2f, 0x7b, 0x69, + 0x64, 0x7d, 0x12, 0xa1, 0x01, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x26, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, - 0x2a, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x32, 0xc0, 0x03, 0x0a, 0x12, 0x45, 0x76, 0x61, - 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x8b, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x6d, 0x69, 0x6e, 0x64, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x32, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x29, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x24, 0x2a, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x61, 0x74, 0x61, + 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x7b, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x32, 0x98, 0x06, 0x0a, 0x0f, 0x52, 0x75, 0x6c, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x76, 0x0a, 0x0d, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, + 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6c, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, + 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x12, 0x90, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, + 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6c, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x30, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x19, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x75, 0x6c, + 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x80, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6c, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x79, 0x49, 0x64, 0x12, 0x21, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, + 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6c, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x26, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, + 0x12, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x7b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x2e, 0x6d, 0x69, 0x6e, + 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, + 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x24, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, + 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x75, 0x6c, 0x65, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x12, 0x7b, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0xaa, 0xf8, + 0x18, 0x04, 0x30, 0x03, 0x38, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x1a, + 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x7d, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0xaa, 0xf8, 0x18, 0x04, 0x30, + 0x03, 0x38, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x2a, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x31, 0x2f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x7b, 0x69, 0x64, + 0x7d, 0x32, 0xc0, 0x03, 0x0a, 0x12, 0x45, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, + 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x12, 0x27, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0xaa, 0xf8, - 0x18, 0x04, 0x30, 0x03, 0x38, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x8b, 0x01, - 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x27, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x28, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x76, 0x61, 0x6c, + 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x21, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x8b, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x45, + 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x12, 0x27, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0xaa, 0xf8, 0x18, 0x04, - 0x30, 0x03, 0x38, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x31, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x8d, 0x01, 0x0a, 0x14, - 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x79, 0x12, 0x26, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6d, - 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, - 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x21, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x68, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x32, 0x8a, 0x05, 0x0a, 0x12, - 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x71, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, - 0x1b, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6d, - 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0xaa, 0xf8, 0x18, 0x04, - 0x30, 0x03, 0x38, 0x05, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x12, 0x19, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x95, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x1f, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x21, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x68, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x12, 0x8d, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, + 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x26, 0x2e, + 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, + 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, + 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x2f, + 0x7b, 0x69, 0x64, 0x7d, 0x32, 0x8a, 0x05, 0x0a, 0x12, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x71, 0x0a, 0x09, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x29, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x05, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1b, 0x12, 0x19, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x95, + 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0xaa, 0xf8, - 0x18, 0x04, 0x30, 0x03, 0x38, 0x06, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x78, 0x0a, - 0x0a, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x1c, 0x2e, 0x6d, 0x69, - 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x6f, - 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x69, 0x6e, 0x64, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x6f, 0x6c, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, - 0x38, 0x07, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x3a, 0x01, 0x2a, 0x22, 0x1a, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x12, 0x78, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x1c, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2d, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x25, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1f, 0x3a, 0x01, 0x2a, 0x22, 0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x12, 0x75, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, - 0x1c, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, - 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0xaa, 0xf8, - 0x18, 0x04, 0x30, 0x03, 0x38, 0x08, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x2a, 0x1a, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x32, 0xc5, 0x07, 0x0a, 0x0f, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x71, 0x0a, 0x0c, - 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x1e, 0x2e, 0x6d, - 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, - 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0xaa, - 0xf8, 0x18, 0x04, 0x30, 0x02, 0x38, 0x02, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, - 0x77, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x23, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x01, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x9e, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, - 0x74, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x23, - 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, - 0x68, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3e, 0xaa, 0xf8, 0x18, 0x04, 0x30, - 0x03, 0x38, 0x02, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x12, 0x2e, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x12, 0x74, 0x0a, 0x0d, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, + 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x06, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x78, 0x0a, 0x0a, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x1c, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2d, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x07, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x1f, 0x3a, 0x01, 0x2a, 0x22, 0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x12, 0x78, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x1c, + 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, + 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0xaa, 0xf8, 0x18, + 0x04, 0x30, 0x03, 0x38, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x3a, 0x01, 0x2a, 0x22, 0x1a, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x75, 0x0a, 0x0a, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x1c, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x08, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x2a, 0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x32, 0xc5, 0x07, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x71, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x1e, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x02, 0x38, 0x02, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x77, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x69, 0x6e, + 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0xaa, 0xf8, + 0x18, 0x04, 0x30, 0x03, 0x38, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, + 0x10, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x12, 0x9e, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, + 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x69, + 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x3e, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x02, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x30, 0x12, 0x2e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, + 0x65, 0x6e, 0x12, 0x74, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x04, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x2a, 0x10, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x77, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x69, 0x6e, + 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0xaa, 0xf8, + 0x18, 0x04, 0x30, 0x03, 0x38, 0x03, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x1a, + 0x10, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x12, 0x78, 0x0a, 0x0c, 0x50, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x12, 0x1e, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, + 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, + 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x27, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x03, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x19, 0x3a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x32, 0x10, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0xbb, 0x01, 0x0a, 0x1e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x63, 0x6f, + 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x30, + 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x31, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, + 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x34, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x23, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x26, 0x3a, 0x01, 0x2a, 0x22, 0x21, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2f, + 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x32, 0xc4, 0x08, 0x0a, 0x10, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x7c, + 0x0a, 0x0d, 0x50, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, + 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x74, 0x63, + 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x20, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x74, + 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x28, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x17, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x1a, 0x3a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x32, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x76, 0x0a, 0x0b, + 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6d, 0x69, 0x6e, + 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0xaa, 0xf8, 0x18, 0x04, + 0x30, 0x03, 0x38, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6e, + 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x75, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, + 0x38, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, + 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x7b, 0x0a, 0x0e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x20, 0x2e, + 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x24, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x16, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x78, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x69, - 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0xaa, - 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x04, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x2a, 0x10, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, - 0x77, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x23, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x03, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x1a, 0x10, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x78, 0x0a, 0x0c, 0x50, 0x61, 0x74, 0x63, - 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1e, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0xaa, 0xf8, 0x18, 0x04, 0x30, - 0x03, 0x38, 0x03, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, - 0x32, 0x10, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x12, 0xbb, 0x01, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x30, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, - 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, - 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0xaa, 0xf8, 0x18, 0x04, - 0x30, 0x03, 0x38, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x3a, 0x01, 0x2a, 0x22, 0x21, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2f, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, - 0x32, 0xd5, 0x09, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x7c, 0x0a, 0x0d, 0x50, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0xaa, 0xf8, 0x18, 0x04, 0x30, - 0x03, 0x38, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, - 0x32, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x73, 0x12, 0x76, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1e, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x28, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1a, 0x12, 0x18, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x75, 0x0a, 0x0d, 0x4c, - 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x1f, 0x2e, 0x6d, - 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, - 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x21, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, + 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x21, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x2a, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x73, 0x12, 0x7b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0xaa, 0xf8, 0x18, 0x04, 0x30, - 0x03, 0x38, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, - 0x78, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x12, 0x20, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x18, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x2a, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x12, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x42, 0x79, 0x49, 0x44, - 0x12, 0x24, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x42, 0x79, 0x49, 0x44, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0xaa, - 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x0c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x2a, 0x16, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, - 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x8e, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x63, - 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, - 0x27, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, - 0x6e, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, - 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x22, 0xaa, 0xf8, 0x18, 0x02, 0x30, 0x02, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, - 0x12, 0x14, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x79, 0x2f, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x12, 0x25, - 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0xaa, - 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x12, 0xae, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x63, 0x6f, + 0x72, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x42, 0x79, 0x49, 0x44, 0x12, 0x24, 0x2e, 0x6d, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x25, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x0c, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x2a, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x8e, + 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x12, 0x25, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x15, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x12, + 0xae, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x45, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x2d, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x45, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x24, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, 0x1d, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x6c, 0x6c, 0x32, 0x92, 0x01, 0x0a, 0x0d, 0x49, 0x6e, 0x76, - 0x69, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x80, 0x01, 0x0a, 0x10, 0x47, - 0x65, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, - 0x22, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, - 0x6e, 0x76, 0x69, 0x74, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0xaa, 0xf8, 0x18, 0x02, 0x30, 0x01, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, - 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x2f, 0x7b, 0x63, 0x6f, 0x64, 0x65, 0x7d, 0x3a, 0x3a, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xcd, 0xcb, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x58, 0x0a, 0x0b, 0x72, 0x70, 0x63, - 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x85, 0x8f, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x70, 0x63, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0a, 0x72, 0x70, 0x63, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x42, 0x3b, 0x5a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x65, 0x63, 0x2f, 0x6d, 0x69, 0x6e, 0x64, - 0x65, 0x72, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2f, 0x76, 0x31, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, + 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, + 0x63, 0x69, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, + 0xaa, 0xf8, 0x18, 0x04, 0x30, 0x03, 0x38, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, + 0x2a, 0x22, 0x1d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x6c, 0x6c, + 0x32, 0x92, 0x01, 0x0a, 0x0d, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x80, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x22, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, + 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x23, 0xaa, 0xf8, 0x18, 0x02, 0x30, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x2f, 0x7b, + 0x63, 0x6f, 0x64, 0x65, 0x7d, 0x3a, 0x3a, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0xcd, 0xcb, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, + 0x01, 0x3a, 0x58, 0x0a, 0x0b, 0x72, 0x70, 0x63, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x85, 0x8f, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x70, 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x0a, 0x72, 0x70, 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x3b, 0x5a, 0x39, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x73, 0x65, 0x63, 0x2f, 0x6d, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, + 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -15321,7 +17025,7 @@ func file_minder_v1_minder_proto_rawDescGZIP() []byte { } var file_minder_v1_minder_proto_enumTypes = make([]protoimpl.EnumInfo, 10) -var file_minder_v1_minder_proto_msgTypes = make([]protoimpl.MessageInfo, 202) +var file_minder_v1_minder_proto_msgTypes = make([]protoimpl.MessageInfo, 227) var file_minder_v1_minder_proto_goTypes = []any{ (ObjectOwner)(0), // 0: minder.v1.ObjectOwner (Relation)(0), // 1: minder.v1.Relation @@ -15344,565 +17048,628 @@ var file_minder_v1_minder_proto_goTypes = []any{ (*GetArtifactByIdResponse)(nil), // 18: minder.v1.GetArtifactByIdResponse (*GetArtifactByNameRequest)(nil), // 19: minder.v1.GetArtifactByNameRequest (*GetArtifactByNameResponse)(nil), // 20: minder.v1.GetArtifactByNameResponse - (*PullRequest)(nil), // 21: minder.v1.PullRequest - (*Release)(nil), // 22: minder.v1.Release - (*PipelineRun)(nil), // 23: minder.v1.PipelineRun - (*TaskRun)(nil), // 24: minder.v1.TaskRun - (*Build)(nil), // 25: minder.v1.Build - (*GetInviteDetailsRequest)(nil), // 26: minder.v1.GetInviteDetailsRequest - (*GetInviteDetailsResponse)(nil), // 27: minder.v1.GetInviteDetailsResponse - (*CheckHealthRequest)(nil), // 28: minder.v1.CheckHealthRequest - (*CheckHealthResponse)(nil), // 29: minder.v1.CheckHealthResponse - (*GetAuthorizationURLRequest)(nil), // 30: minder.v1.GetAuthorizationURLRequest - (*GetAuthorizationURLResponse)(nil), // 31: minder.v1.GetAuthorizationURLResponse - (*StoreProviderTokenRequest)(nil), // 32: minder.v1.StoreProviderTokenRequest - (*StoreProviderTokenResponse)(nil), // 33: minder.v1.StoreProviderTokenResponse - (*Project)(nil), // 34: minder.v1.Project - (*ListRemoteRepositoriesFromProviderRequest)(nil), // 35: minder.v1.ListRemoteRepositoriesFromProviderRequest - (*ListRemoteRepositoriesFromProviderResponse)(nil), // 36: minder.v1.ListRemoteRepositoriesFromProviderResponse - (*RegistrableUpstreamEntityRef)(nil), // 37: minder.v1.RegistrableUpstreamEntityRef - (*UpstreamRepositoryRef)(nil), // 38: minder.v1.UpstreamRepositoryRef - (*Repository)(nil), // 39: minder.v1.Repository - (*RegisterRepositoryRequest)(nil), // 40: minder.v1.RegisterRepositoryRequest - (*RegisterRepoResult)(nil), // 41: minder.v1.RegisterRepoResult - (*RegisterRepositoryResponse)(nil), // 42: minder.v1.RegisterRepositoryResponse - (*GetRepositoryByIdRequest)(nil), // 43: minder.v1.GetRepositoryByIdRequest - (*GetRepositoryByIdResponse)(nil), // 44: minder.v1.GetRepositoryByIdResponse - (*DeleteRepositoryByIdRequest)(nil), // 45: minder.v1.DeleteRepositoryByIdRequest - (*DeleteRepositoryByIdResponse)(nil), // 46: minder.v1.DeleteRepositoryByIdResponse - (*GetRepositoryByNameRequest)(nil), // 47: minder.v1.GetRepositoryByNameRequest - (*GetRepositoryByNameResponse)(nil), // 48: minder.v1.GetRepositoryByNameResponse - (*DeleteRepositoryByNameRequest)(nil), // 49: minder.v1.DeleteRepositoryByNameRequest - (*DeleteRepositoryByNameResponse)(nil), // 50: minder.v1.DeleteRepositoryByNameResponse - (*ListRepositoriesRequest)(nil), // 51: minder.v1.ListRepositoriesRequest - (*ListRepositoriesResponse)(nil), // 52: minder.v1.ListRepositoriesResponse - (*ReconcileEntityRegistrationRequest)(nil), // 53: minder.v1.ReconcileEntityRegistrationRequest - (*ReconcileEntityRegistrationResponse)(nil), // 54: minder.v1.ReconcileEntityRegistrationResponse - (*VerifyProviderTokenFromRequest)(nil), // 55: minder.v1.VerifyProviderTokenFromRequest - (*VerifyProviderTokenFromResponse)(nil), // 56: minder.v1.VerifyProviderTokenFromResponse - (*VerifyProviderCredentialRequest)(nil), // 57: minder.v1.VerifyProviderCredentialRequest - (*VerifyProviderCredentialResponse)(nil), // 58: minder.v1.VerifyProviderCredentialResponse - (*BranchProtection)(nil), // 59: minder.v1.BranchProtection - (*CreateUserRequest)(nil), // 60: minder.v1.CreateUserRequest - (*CreateUserResponse)(nil), // 61: minder.v1.CreateUserResponse - (*DeleteUserRequest)(nil), // 62: minder.v1.DeleteUserRequest - (*DeleteUserResponse)(nil), // 63: minder.v1.DeleteUserResponse - (*UserRecord)(nil), // 64: minder.v1.UserRecord - (*ProjectRole)(nil), // 65: minder.v1.ProjectRole - (*GetUserRequest)(nil), // 66: minder.v1.GetUserRequest - (*GetUserResponse)(nil), // 67: minder.v1.GetUserResponse - (*CreateProfileRequest)(nil), // 68: minder.v1.CreateProfileRequest - (*CreateProfileResponse)(nil), // 69: minder.v1.CreateProfileResponse - (*UpdateProfileRequest)(nil), // 70: minder.v1.UpdateProfileRequest - (*UpdateProfileResponse)(nil), // 71: minder.v1.UpdateProfileResponse - (*PatchProfileRequest)(nil), // 72: minder.v1.PatchProfileRequest - (*PatchProfileResponse)(nil), // 73: minder.v1.PatchProfileResponse - (*DeleteProfileRequest)(nil), // 74: minder.v1.DeleteProfileRequest - (*DeleteProfileResponse)(nil), // 75: minder.v1.DeleteProfileResponse - (*ListProfilesRequest)(nil), // 76: minder.v1.ListProfilesRequest - (*ListProfilesResponse)(nil), // 77: minder.v1.ListProfilesResponse - (*GetProfileByIdRequest)(nil), // 78: minder.v1.GetProfileByIdRequest - (*GetProfileByIdResponse)(nil), // 79: minder.v1.GetProfileByIdResponse - (*GetProfileByNameRequest)(nil), // 80: minder.v1.GetProfileByNameRequest - (*GetProfileByNameResponse)(nil), // 81: minder.v1.GetProfileByNameResponse - (*ProfileStatus)(nil), // 82: minder.v1.ProfileStatus - (*EvalResultAlert)(nil), // 83: minder.v1.EvalResultAlert - (*RuleEvaluationStatus)(nil), // 84: minder.v1.RuleEvaluationStatus - (*EntityTypedId)(nil), // 85: minder.v1.EntityTypedId - (*GetProfileStatusByNameRequest)(nil), // 86: minder.v1.GetProfileStatusByNameRequest - (*GetProfileStatusByNameResponse)(nil), // 87: minder.v1.GetProfileStatusByNameResponse - (*GetProfileStatusByProjectRequest)(nil), // 88: minder.v1.GetProfileStatusByProjectRequest - (*GetProfileStatusByProjectResponse)(nil), // 89: minder.v1.GetProfileStatusByProjectResponse - (*EntityAutoRegistrationConfig)(nil), // 90: minder.v1.EntityAutoRegistrationConfig - (*AutoRegistration)(nil), // 91: minder.v1.AutoRegistration - (*ProviderConfig)(nil), // 92: minder.v1.ProviderConfig - (*RESTProviderConfig)(nil), // 93: minder.v1.RESTProviderConfig - (*GitHubProviderConfig)(nil), // 94: minder.v1.GitHubProviderConfig - (*GitHubAppProviderConfig)(nil), // 95: minder.v1.GitHubAppProviderConfig - (*GitLabProviderConfig)(nil), // 96: minder.v1.GitLabProviderConfig - (*DockerHubProviderConfig)(nil), // 97: minder.v1.DockerHubProviderConfig - (*GHCRProviderConfig)(nil), // 98: minder.v1.GHCRProviderConfig - (*Context)(nil), // 99: minder.v1.Context - (*ContextV2)(nil), // 100: minder.v1.ContextV2 - (*ListRuleTypesRequest)(nil), // 101: minder.v1.ListRuleTypesRequest - (*ListRuleTypesResponse)(nil), // 102: minder.v1.ListRuleTypesResponse - (*GetRuleTypeByNameRequest)(nil), // 103: minder.v1.GetRuleTypeByNameRequest - (*GetRuleTypeByNameResponse)(nil), // 104: minder.v1.GetRuleTypeByNameResponse - (*GetRuleTypeByIdRequest)(nil), // 105: minder.v1.GetRuleTypeByIdRequest - (*GetRuleTypeByIdResponse)(nil), // 106: minder.v1.GetRuleTypeByIdResponse - (*CreateRuleTypeRequest)(nil), // 107: minder.v1.CreateRuleTypeRequest - (*CreateRuleTypeResponse)(nil), // 108: minder.v1.CreateRuleTypeResponse - (*UpdateRuleTypeRequest)(nil), // 109: minder.v1.UpdateRuleTypeRequest - (*UpdateRuleTypeResponse)(nil), // 110: minder.v1.UpdateRuleTypeResponse - (*DeleteRuleTypeRequest)(nil), // 111: minder.v1.DeleteRuleTypeRequest - (*DeleteRuleTypeResponse)(nil), // 112: minder.v1.DeleteRuleTypeResponse - (*ListEvaluationResultsRequest)(nil), // 113: minder.v1.ListEvaluationResultsRequest - (*ListEvaluationResultsResponse)(nil), // 114: minder.v1.ListEvaluationResultsResponse - (*RestType)(nil), // 115: minder.v1.RestType - (*BuiltinType)(nil), // 116: minder.v1.BuiltinType - (*ArtifactType)(nil), // 117: minder.v1.ArtifactType - (*GitType)(nil), // 118: minder.v1.GitType - (*DiffType)(nil), // 119: minder.v1.DiffType - (*Severity)(nil), // 120: minder.v1.Severity - (*RuleType)(nil), // 121: minder.v1.RuleType - (*Profile)(nil), // 122: minder.v1.Profile - (*ListProjectsRequest)(nil), // 123: minder.v1.ListProjectsRequest - (*ListProjectsResponse)(nil), // 124: minder.v1.ListProjectsResponse - (*CreateProjectRequest)(nil), // 125: minder.v1.CreateProjectRequest - (*CreateProjectResponse)(nil), // 126: minder.v1.CreateProjectResponse - (*DeleteProjectRequest)(nil), // 127: minder.v1.DeleteProjectRequest - (*DeleteProjectResponse)(nil), // 128: minder.v1.DeleteProjectResponse - (*UpdateProjectRequest)(nil), // 129: minder.v1.UpdateProjectRequest - (*UpdateProjectResponse)(nil), // 130: minder.v1.UpdateProjectResponse - (*ProjectPatch)(nil), // 131: minder.v1.ProjectPatch - (*PatchProjectRequest)(nil), // 132: minder.v1.PatchProjectRequest - (*PatchProjectResponse)(nil), // 133: minder.v1.PatchProjectResponse - (*ListChildProjectsRequest)(nil), // 134: minder.v1.ListChildProjectsRequest - (*ListChildProjectsResponse)(nil), // 135: minder.v1.ListChildProjectsResponse - (*CreateEntityReconciliationTaskRequest)(nil), // 136: minder.v1.CreateEntityReconciliationTaskRequest - (*CreateEntityReconciliationTaskResponse)(nil), // 137: minder.v1.CreateEntityReconciliationTaskResponse - (*ListRolesRequest)(nil), // 138: minder.v1.ListRolesRequest - (*ListRolesResponse)(nil), // 139: minder.v1.ListRolesResponse - (*ListRoleAssignmentsRequest)(nil), // 140: minder.v1.ListRoleAssignmentsRequest - (*ListRoleAssignmentsResponse)(nil), // 141: minder.v1.ListRoleAssignmentsResponse - (*AssignRoleRequest)(nil), // 142: minder.v1.AssignRoleRequest - (*AssignRoleResponse)(nil), // 143: minder.v1.AssignRoleResponse - (*UpdateRoleRequest)(nil), // 144: minder.v1.UpdateRoleRequest - (*UpdateRoleResponse)(nil), // 145: minder.v1.UpdateRoleResponse - (*RemoveRoleRequest)(nil), // 146: minder.v1.RemoveRoleRequest - (*RemoveRoleResponse)(nil), // 147: minder.v1.RemoveRoleResponse - (*Role)(nil), // 148: minder.v1.Role - (*RoleAssignment)(nil), // 149: minder.v1.RoleAssignment - (*ListInvitationsRequest)(nil), // 150: minder.v1.ListInvitationsRequest - (*ListInvitationsResponse)(nil), // 151: minder.v1.ListInvitationsResponse - (*ResolveInvitationRequest)(nil), // 152: minder.v1.ResolveInvitationRequest - (*ResolveInvitationResponse)(nil), // 153: minder.v1.ResolveInvitationResponse - (*Invitation)(nil), // 154: minder.v1.Invitation - (*GetProviderRequest)(nil), // 155: minder.v1.GetProviderRequest - (*GetProviderResponse)(nil), // 156: minder.v1.GetProviderResponse - (*ListProvidersRequest)(nil), // 157: minder.v1.ListProvidersRequest - (*ListProvidersResponse)(nil), // 158: minder.v1.ListProvidersResponse - (*CreateProviderRequest)(nil), // 159: minder.v1.CreateProviderRequest - (*CreateProviderResponse)(nil), // 160: minder.v1.CreateProviderResponse - (*DeleteProviderRequest)(nil), // 161: minder.v1.DeleteProviderRequest - (*DeleteProviderResponse)(nil), // 162: minder.v1.DeleteProviderResponse - (*DeleteProviderByIDRequest)(nil), // 163: minder.v1.DeleteProviderByIDRequest - (*DeleteProviderByIDResponse)(nil), // 164: minder.v1.DeleteProviderByIDResponse - (*GetUnclaimedProvidersRequest)(nil), // 165: minder.v1.GetUnclaimedProvidersRequest - (*GetUnclaimedProvidersResponse)(nil), // 166: minder.v1.GetUnclaimedProvidersResponse - (*ListProviderClassesRequest)(nil), // 167: minder.v1.ListProviderClassesRequest - (*ListProviderClassesResponse)(nil), // 168: minder.v1.ListProviderClassesResponse - (*PatchProviderRequest)(nil), // 169: minder.v1.PatchProviderRequest - (*PatchProviderResponse)(nil), // 170: minder.v1.PatchProviderResponse - (*AuthorizationParams)(nil), // 171: minder.v1.AuthorizationParams - (*ProviderParameter)(nil), // 172: minder.v1.ProviderParameter - (*GitHubAppParams)(nil), // 173: minder.v1.GitHubAppParams - (*Provider)(nil), // 174: minder.v1.Provider - (*GetEvaluationHistoryRequest)(nil), // 175: minder.v1.GetEvaluationHistoryRequest - (*ListEvaluationHistoryRequest)(nil), // 176: minder.v1.ListEvaluationHistoryRequest - (*GetEvaluationHistoryResponse)(nil), // 177: minder.v1.GetEvaluationHistoryResponse - (*ListEvaluationHistoryResponse)(nil), // 178: minder.v1.ListEvaluationHistoryResponse - (*EvaluationHistory)(nil), // 179: minder.v1.EvaluationHistory - (*EvaluationHistoryEntity)(nil), // 180: minder.v1.EvaluationHistoryEntity - (*EvaluationHistoryRule)(nil), // 181: minder.v1.EvaluationHistoryRule - (*EvaluationHistoryStatus)(nil), // 182: minder.v1.EvaluationHistoryStatus - (*EvaluationHistoryRemediation)(nil), // 183: minder.v1.EvaluationHistoryRemediation - (*EvaluationHistoryAlert)(nil), // 184: minder.v1.EvaluationHistoryAlert - (*EntityInstance)(nil), // 185: minder.v1.EntityInstance - (*UpstreamEntityRef)(nil), // 186: minder.v1.UpstreamEntityRef - (*RegisterRepoResult_Status)(nil), // 187: minder.v1.RegisterRepoResult.Status - nil, // 188: minder.v1.RuleEvaluationStatus.EntityInfoEntry - nil, // 189: minder.v1.AutoRegistration.EntitiesEntry - (*ListEvaluationResultsResponse_EntityProfileEvaluationResults)(nil), // 190: minder.v1.ListEvaluationResultsResponse.EntityProfileEvaluationResults - (*ListEvaluationResultsResponse_EntityEvaluationResults)(nil), // 191: minder.v1.ListEvaluationResultsResponse.EntityEvaluationResults - (*RestType_Fallback)(nil), // 192: minder.v1.RestType.Fallback - (*DiffType_Ecosystem)(nil), // 193: minder.v1.DiffType.Ecosystem - (*RuleType_Definition)(nil), // 194: minder.v1.RuleType.Definition - (*RuleType_Definition_Ingest)(nil), // 195: minder.v1.RuleType.Definition.Ingest - (*RuleType_Definition_Eval)(nil), // 196: minder.v1.RuleType.Definition.Eval - (*RuleType_Definition_Remediate)(nil), // 197: minder.v1.RuleType.Definition.Remediate - (*RuleType_Definition_Alert)(nil), // 198: minder.v1.RuleType.Definition.Alert - (*RuleType_Definition_Eval_JQComparison)(nil), // 199: minder.v1.RuleType.Definition.Eval.JQComparison - (*RuleType_Definition_Eval_Rego)(nil), // 200: minder.v1.RuleType.Definition.Eval.Rego - (*RuleType_Definition_Eval_Vulncheck)(nil), // 201: minder.v1.RuleType.Definition.Eval.Vulncheck - (*RuleType_Definition_Eval_Trusty)(nil), // 202: minder.v1.RuleType.Definition.Eval.Trusty - (*RuleType_Definition_Eval_Homoglyphs)(nil), // 203: minder.v1.RuleType.Definition.Eval.Homoglyphs - (*RuleType_Definition_Eval_JQComparison_Operator)(nil), // 204: minder.v1.RuleType.Definition.Eval.JQComparison.Operator - (*RuleType_Definition_Remediate_GhBranchProtectionType)(nil), // 205: minder.v1.RuleType.Definition.Remediate.GhBranchProtectionType - (*RuleType_Definition_Remediate_PullRequestRemediation)(nil), // 206: minder.v1.RuleType.Definition.Remediate.PullRequestRemediation - (*RuleType_Definition_Remediate_PullRequestRemediation_Content)(nil), // 207: minder.v1.RuleType.Definition.Remediate.PullRequestRemediation.Content - (*RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha)(nil), // 208: minder.v1.RuleType.Definition.Remediate.PullRequestRemediation.ActionsReplaceTagsWithSha - (*RuleType_Definition_Alert_AlertTypeSA)(nil), // 209: minder.v1.RuleType.Definition.Alert.AlertTypeSA - (*Profile_Rule)(nil), // 210: minder.v1.Profile.Rule - (*Profile_Selector)(nil), // 211: minder.v1.Profile.Selector - (*timestamppb.Timestamp)(nil), // 212: google.protobuf.Timestamp - (*structpb.Struct)(nil), // 213: google.protobuf.Struct - (*fieldmaskpb.FieldMask)(nil), // 214: google.protobuf.FieldMask - (*structpb.Value)(nil), // 215: google.protobuf.Value - (*descriptorpb.EnumValueOptions)(nil), // 216: google.protobuf.EnumValueOptions - (*descriptorpb.MethodOptions)(nil), // 217: google.protobuf.MethodOptions + (*Release)(nil), // 21: minder.v1.Release + (*PipelineRun)(nil), // 22: minder.v1.PipelineRun + (*TaskRun)(nil), // 23: minder.v1.TaskRun + (*Build)(nil), // 24: minder.v1.Build + (*GetInviteDetailsRequest)(nil), // 25: minder.v1.GetInviteDetailsRequest + (*GetInviteDetailsResponse)(nil), // 26: minder.v1.GetInviteDetailsResponse + (*CheckHealthRequest)(nil), // 27: minder.v1.CheckHealthRequest + (*CheckHealthResponse)(nil), // 28: minder.v1.CheckHealthResponse + (*GetAuthorizationURLRequest)(nil), // 29: minder.v1.GetAuthorizationURLRequest + (*GetAuthorizationURLResponse)(nil), // 30: minder.v1.GetAuthorizationURLResponse + (*StoreProviderTokenRequest)(nil), // 31: minder.v1.StoreProviderTokenRequest + (*StoreProviderTokenResponse)(nil), // 32: minder.v1.StoreProviderTokenResponse + (*Project)(nil), // 33: minder.v1.Project + (*ListRemoteRepositoriesFromProviderRequest)(nil), // 34: minder.v1.ListRemoteRepositoriesFromProviderRequest + (*ListRemoteRepositoriesFromProviderResponse)(nil), // 35: minder.v1.ListRemoteRepositoriesFromProviderResponse + (*RegistrableUpstreamEntityRef)(nil), // 36: minder.v1.RegistrableUpstreamEntityRef + (*UpstreamRepositoryRef)(nil), // 37: minder.v1.UpstreamRepositoryRef + (*Repository)(nil), // 38: minder.v1.Repository + (*RegisterRepositoryRequest)(nil), // 39: minder.v1.RegisterRepositoryRequest + (*RegisterRepoResult)(nil), // 40: minder.v1.RegisterRepoResult + (*RegisterRepositoryResponse)(nil), // 41: minder.v1.RegisterRepositoryResponse + (*GetRepositoryByIdRequest)(nil), // 42: minder.v1.GetRepositoryByIdRequest + (*GetRepositoryByIdResponse)(nil), // 43: minder.v1.GetRepositoryByIdResponse + (*DeleteRepositoryByIdRequest)(nil), // 44: minder.v1.DeleteRepositoryByIdRequest + (*DeleteRepositoryByIdResponse)(nil), // 45: minder.v1.DeleteRepositoryByIdResponse + (*GetRepositoryByNameRequest)(nil), // 46: minder.v1.GetRepositoryByNameRequest + (*GetRepositoryByNameResponse)(nil), // 47: minder.v1.GetRepositoryByNameResponse + (*DeleteRepositoryByNameRequest)(nil), // 48: minder.v1.DeleteRepositoryByNameRequest + (*DeleteRepositoryByNameResponse)(nil), // 49: minder.v1.DeleteRepositoryByNameResponse + (*ListRepositoriesRequest)(nil), // 50: minder.v1.ListRepositoriesRequest + (*ListRepositoriesResponse)(nil), // 51: minder.v1.ListRepositoriesResponse + (*ReconcileEntityRegistrationRequest)(nil), // 52: minder.v1.ReconcileEntityRegistrationRequest + (*ReconcileEntityRegistrationResponse)(nil), // 53: minder.v1.ReconcileEntityRegistrationResponse + (*VerifyProviderTokenFromRequest)(nil), // 54: minder.v1.VerifyProviderTokenFromRequest + (*VerifyProviderTokenFromResponse)(nil), // 55: minder.v1.VerifyProviderTokenFromResponse + (*VerifyProviderCredentialRequest)(nil), // 56: minder.v1.VerifyProviderCredentialRequest + (*VerifyProviderCredentialResponse)(nil), // 57: minder.v1.VerifyProviderCredentialResponse + (*CreateUserRequest)(nil), // 58: minder.v1.CreateUserRequest + (*CreateUserResponse)(nil), // 59: minder.v1.CreateUserResponse + (*DeleteUserRequest)(nil), // 60: minder.v1.DeleteUserRequest + (*DeleteUserResponse)(nil), // 61: minder.v1.DeleteUserResponse + (*UserRecord)(nil), // 62: minder.v1.UserRecord + (*ProjectRole)(nil), // 63: minder.v1.ProjectRole + (*GetUserRequest)(nil), // 64: minder.v1.GetUserRequest + (*GetUserResponse)(nil), // 65: minder.v1.GetUserResponse + (*CreateDataSourceRequest)(nil), // 66: minder.v1.CreateDataSourceRequest + (*CreateDataSourceResponse)(nil), // 67: minder.v1.CreateDataSourceResponse + (*GetDataSourceByIdRequest)(nil), // 68: minder.v1.GetDataSourceByIdRequest + (*GetDataSourceByIdResponse)(nil), // 69: minder.v1.GetDataSourceByIdResponse + (*GetDataSourceByNameRequest)(nil), // 70: minder.v1.GetDataSourceByNameRequest + (*GetDataSourceByNameResponse)(nil), // 71: minder.v1.GetDataSourceByNameResponse + (*ListDataSourcesRequest)(nil), // 72: minder.v1.ListDataSourcesRequest + (*ListDataSourcesResponse)(nil), // 73: minder.v1.ListDataSourcesResponse + (*UpdateDataSourceRequest)(nil), // 74: minder.v1.UpdateDataSourceRequest + (*UpdateDataSourceResponse)(nil), // 75: minder.v1.UpdateDataSourceResponse + (*DeleteDataSourceByIdRequest)(nil), // 76: minder.v1.DeleteDataSourceByIdRequest + (*DeleteDataSourceByIdResponse)(nil), // 77: minder.v1.DeleteDataSourceByIdResponse + (*DeleteDataSourceByNameRequest)(nil), // 78: minder.v1.DeleteDataSourceByNameRequest + (*DeleteDataSourceByNameResponse)(nil), // 79: minder.v1.DeleteDataSourceByNameResponse + (*CreateProfileRequest)(nil), // 80: minder.v1.CreateProfileRequest + (*CreateProfileResponse)(nil), // 81: minder.v1.CreateProfileResponse + (*UpdateProfileRequest)(nil), // 82: minder.v1.UpdateProfileRequest + (*UpdateProfileResponse)(nil), // 83: minder.v1.UpdateProfileResponse + (*PatchProfileRequest)(nil), // 84: minder.v1.PatchProfileRequest + (*PatchProfileResponse)(nil), // 85: minder.v1.PatchProfileResponse + (*DeleteProfileRequest)(nil), // 86: minder.v1.DeleteProfileRequest + (*DeleteProfileResponse)(nil), // 87: minder.v1.DeleteProfileResponse + (*ListProfilesRequest)(nil), // 88: minder.v1.ListProfilesRequest + (*ListProfilesResponse)(nil), // 89: minder.v1.ListProfilesResponse + (*GetProfileByIdRequest)(nil), // 90: minder.v1.GetProfileByIdRequest + (*GetProfileByIdResponse)(nil), // 91: minder.v1.GetProfileByIdResponse + (*GetProfileByNameRequest)(nil), // 92: minder.v1.GetProfileByNameRequest + (*GetProfileByNameResponse)(nil), // 93: minder.v1.GetProfileByNameResponse + (*ProfileStatus)(nil), // 94: minder.v1.ProfileStatus + (*EvalResultAlert)(nil), // 95: minder.v1.EvalResultAlert + (*RuleEvaluationStatus)(nil), // 96: minder.v1.RuleEvaluationStatus + (*EntityTypedId)(nil), // 97: minder.v1.EntityTypedId + (*GetProfileStatusByNameRequest)(nil), // 98: minder.v1.GetProfileStatusByNameRequest + (*GetProfileStatusByNameResponse)(nil), // 99: minder.v1.GetProfileStatusByNameResponse + (*GetProfileStatusByProjectRequest)(nil), // 100: minder.v1.GetProfileStatusByProjectRequest + (*GetProfileStatusByProjectResponse)(nil), // 101: minder.v1.GetProfileStatusByProjectResponse + (*EntityAutoRegistrationConfig)(nil), // 102: minder.v1.EntityAutoRegistrationConfig + (*AutoRegistration)(nil), // 103: minder.v1.AutoRegistration + (*ProviderConfig)(nil), // 104: minder.v1.ProviderConfig + (*RESTProviderConfig)(nil), // 105: minder.v1.RESTProviderConfig + (*GitHubProviderConfig)(nil), // 106: minder.v1.GitHubProviderConfig + (*GitHubAppProviderConfig)(nil), // 107: minder.v1.GitHubAppProviderConfig + (*GitLabProviderConfig)(nil), // 108: minder.v1.GitLabProviderConfig + (*DockerHubProviderConfig)(nil), // 109: minder.v1.DockerHubProviderConfig + (*GHCRProviderConfig)(nil), // 110: minder.v1.GHCRProviderConfig + (*Context)(nil), // 111: minder.v1.Context + (*ContextV2)(nil), // 112: minder.v1.ContextV2 + (*ListRuleTypesRequest)(nil), // 113: minder.v1.ListRuleTypesRequest + (*ListRuleTypesResponse)(nil), // 114: minder.v1.ListRuleTypesResponse + (*GetRuleTypeByNameRequest)(nil), // 115: minder.v1.GetRuleTypeByNameRequest + (*GetRuleTypeByNameResponse)(nil), // 116: minder.v1.GetRuleTypeByNameResponse + (*GetRuleTypeByIdRequest)(nil), // 117: minder.v1.GetRuleTypeByIdRequest + (*GetRuleTypeByIdResponse)(nil), // 118: minder.v1.GetRuleTypeByIdResponse + (*CreateRuleTypeRequest)(nil), // 119: minder.v1.CreateRuleTypeRequest + (*CreateRuleTypeResponse)(nil), // 120: minder.v1.CreateRuleTypeResponse + (*UpdateRuleTypeRequest)(nil), // 121: minder.v1.UpdateRuleTypeRequest + (*UpdateRuleTypeResponse)(nil), // 122: minder.v1.UpdateRuleTypeResponse + (*DeleteRuleTypeRequest)(nil), // 123: minder.v1.DeleteRuleTypeRequest + (*DeleteRuleTypeResponse)(nil), // 124: minder.v1.DeleteRuleTypeResponse + (*ListEvaluationResultsRequest)(nil), // 125: minder.v1.ListEvaluationResultsRequest + (*ListEvaluationResultsResponse)(nil), // 126: minder.v1.ListEvaluationResultsResponse + (*RestType)(nil), // 127: minder.v1.RestType + (*BuiltinType)(nil), // 128: minder.v1.BuiltinType + (*ArtifactType)(nil), // 129: minder.v1.ArtifactType + (*GitType)(nil), // 130: minder.v1.GitType + (*DiffType)(nil), // 131: minder.v1.DiffType + (*DepsType)(nil), // 132: minder.v1.DepsType + (*Severity)(nil), // 133: minder.v1.Severity + (*RuleType)(nil), // 134: minder.v1.RuleType + (*Profile)(nil), // 135: minder.v1.Profile + (*ListProjectsRequest)(nil), // 136: minder.v1.ListProjectsRequest + (*ListProjectsResponse)(nil), // 137: minder.v1.ListProjectsResponse + (*CreateProjectRequest)(nil), // 138: minder.v1.CreateProjectRequest + (*CreateProjectResponse)(nil), // 139: minder.v1.CreateProjectResponse + (*DeleteProjectRequest)(nil), // 140: minder.v1.DeleteProjectRequest + (*DeleteProjectResponse)(nil), // 141: minder.v1.DeleteProjectResponse + (*UpdateProjectRequest)(nil), // 142: minder.v1.UpdateProjectRequest + (*UpdateProjectResponse)(nil), // 143: minder.v1.UpdateProjectResponse + (*ProjectPatch)(nil), // 144: minder.v1.ProjectPatch + (*PatchProjectRequest)(nil), // 145: minder.v1.PatchProjectRequest + (*PatchProjectResponse)(nil), // 146: minder.v1.PatchProjectResponse + (*ListChildProjectsRequest)(nil), // 147: minder.v1.ListChildProjectsRequest + (*ListChildProjectsResponse)(nil), // 148: minder.v1.ListChildProjectsResponse + (*CreateEntityReconciliationTaskRequest)(nil), // 149: minder.v1.CreateEntityReconciliationTaskRequest + (*CreateEntityReconciliationTaskResponse)(nil), // 150: minder.v1.CreateEntityReconciliationTaskResponse + (*ListRolesRequest)(nil), // 151: minder.v1.ListRolesRequest + (*ListRolesResponse)(nil), // 152: minder.v1.ListRolesResponse + (*ListRoleAssignmentsRequest)(nil), // 153: minder.v1.ListRoleAssignmentsRequest + (*ListRoleAssignmentsResponse)(nil), // 154: minder.v1.ListRoleAssignmentsResponse + (*AssignRoleRequest)(nil), // 155: minder.v1.AssignRoleRequest + (*AssignRoleResponse)(nil), // 156: minder.v1.AssignRoleResponse + (*UpdateRoleRequest)(nil), // 157: minder.v1.UpdateRoleRequest + (*UpdateRoleResponse)(nil), // 158: minder.v1.UpdateRoleResponse + (*RemoveRoleRequest)(nil), // 159: minder.v1.RemoveRoleRequest + (*RemoveRoleResponse)(nil), // 160: minder.v1.RemoveRoleResponse + (*Role)(nil), // 161: minder.v1.Role + (*RoleAssignment)(nil), // 162: minder.v1.RoleAssignment + (*ListInvitationsRequest)(nil), // 163: minder.v1.ListInvitationsRequest + (*ListInvitationsResponse)(nil), // 164: minder.v1.ListInvitationsResponse + (*ResolveInvitationRequest)(nil), // 165: minder.v1.ResolveInvitationRequest + (*ResolveInvitationResponse)(nil), // 166: minder.v1.ResolveInvitationResponse + (*Invitation)(nil), // 167: minder.v1.Invitation + (*GetProviderRequest)(nil), // 168: minder.v1.GetProviderRequest + (*GetProviderResponse)(nil), // 169: minder.v1.GetProviderResponse + (*ListProvidersRequest)(nil), // 170: minder.v1.ListProvidersRequest + (*ListProvidersResponse)(nil), // 171: minder.v1.ListProvidersResponse + (*CreateProviderRequest)(nil), // 172: minder.v1.CreateProviderRequest + (*CreateProviderResponse)(nil), // 173: minder.v1.CreateProviderResponse + (*DeleteProviderRequest)(nil), // 174: minder.v1.DeleteProviderRequest + (*DeleteProviderResponse)(nil), // 175: minder.v1.DeleteProviderResponse + (*DeleteProviderByIDRequest)(nil), // 176: minder.v1.DeleteProviderByIDRequest + (*DeleteProviderByIDResponse)(nil), // 177: minder.v1.DeleteProviderByIDResponse + (*ListProviderClassesRequest)(nil), // 178: minder.v1.ListProviderClassesRequest + (*ListProviderClassesResponse)(nil), // 179: minder.v1.ListProviderClassesResponse + (*PatchProviderRequest)(nil), // 180: minder.v1.PatchProviderRequest + (*PatchProviderResponse)(nil), // 181: minder.v1.PatchProviderResponse + (*AuthorizationParams)(nil), // 182: minder.v1.AuthorizationParams + (*ProviderParameter)(nil), // 183: minder.v1.ProviderParameter + (*GitHubAppParams)(nil), // 184: minder.v1.GitHubAppParams + (*Provider)(nil), // 185: minder.v1.Provider + (*GetEvaluationHistoryRequest)(nil), // 186: minder.v1.GetEvaluationHistoryRequest + (*ListEvaluationHistoryRequest)(nil), // 187: minder.v1.ListEvaluationHistoryRequest + (*GetEvaluationHistoryResponse)(nil), // 188: minder.v1.GetEvaluationHistoryResponse + (*ListEvaluationHistoryResponse)(nil), // 189: minder.v1.ListEvaluationHistoryResponse + (*EvaluationHistory)(nil), // 190: minder.v1.EvaluationHistory + (*EvaluationHistoryEntity)(nil), // 191: minder.v1.EvaluationHistoryEntity + (*EvaluationHistoryRule)(nil), // 192: minder.v1.EvaluationHistoryRule + (*EvaluationHistoryStatus)(nil), // 193: minder.v1.EvaluationHistoryStatus + (*EvaluationHistoryRemediation)(nil), // 194: minder.v1.EvaluationHistoryRemediation + (*EvaluationHistoryAlert)(nil), // 195: minder.v1.EvaluationHistoryAlert + (*EntityInstance)(nil), // 196: minder.v1.EntityInstance + (*UpstreamEntityRef)(nil), // 197: minder.v1.UpstreamEntityRef + (*DataSource)(nil), // 198: minder.v1.DataSource + (*StructDataSource)(nil), // 199: minder.v1.StructDataSource + (*RestDataSource)(nil), // 200: minder.v1.RestDataSource + (*DataSourceReference)(nil), // 201: minder.v1.DataSourceReference + (*RegisterRepoResult_Status)(nil), // 202: minder.v1.RegisterRepoResult.Status + nil, // 203: minder.v1.RuleEvaluationStatus.EntityInfoEntry + nil, // 204: minder.v1.AutoRegistration.EntitiesEntry + (*ListEvaluationResultsResponse_EntityProfileEvaluationResults)(nil), // 205: minder.v1.ListEvaluationResultsResponse.EntityProfileEvaluationResults + (*ListEvaluationResultsResponse_EntityEvaluationResults)(nil), // 206: minder.v1.ListEvaluationResultsResponse.EntityEvaluationResults + (*RestType_Fallback)(nil), // 207: minder.v1.RestType.Fallback + (*DiffType_Ecosystem)(nil), // 208: minder.v1.DiffType.Ecosystem + (*DepsType_RepoConfigs)(nil), // 209: minder.v1.DepsType.RepoConfigs + (*DepsType_PullRequestConfigs)(nil), // 210: minder.v1.DepsType.PullRequestConfigs + (*RuleType_Definition)(nil), // 211: minder.v1.RuleType.Definition + (*RuleType_Definition_Ingest)(nil), // 212: minder.v1.RuleType.Definition.Ingest + (*RuleType_Definition_Eval)(nil), // 213: minder.v1.RuleType.Definition.Eval + (*RuleType_Definition_Remediate)(nil), // 214: minder.v1.RuleType.Definition.Remediate + (*RuleType_Definition_Alert)(nil), // 215: minder.v1.RuleType.Definition.Alert + (*RuleType_Definition_Eval_JQComparison)(nil), // 216: minder.v1.RuleType.Definition.Eval.JQComparison + (*RuleType_Definition_Eval_Rego)(nil), // 217: minder.v1.RuleType.Definition.Eval.Rego + (*RuleType_Definition_Eval_Vulncheck)(nil), // 218: minder.v1.RuleType.Definition.Eval.Vulncheck + (*RuleType_Definition_Eval_Trusty)(nil), // 219: minder.v1.RuleType.Definition.Eval.Trusty + (*RuleType_Definition_Eval_Homoglyphs)(nil), // 220: minder.v1.RuleType.Definition.Eval.Homoglyphs + (*RuleType_Definition_Eval_JQComparison_Operator)(nil), // 221: minder.v1.RuleType.Definition.Eval.JQComparison.Operator + (*RuleType_Definition_Remediate_GhBranchProtectionType)(nil), // 222: minder.v1.RuleType.Definition.Remediate.GhBranchProtectionType + (*RuleType_Definition_Remediate_PullRequestRemediation)(nil), // 223: minder.v1.RuleType.Definition.Remediate.PullRequestRemediation + (*RuleType_Definition_Remediate_PullRequestRemediation_Content)(nil), // 224: minder.v1.RuleType.Definition.Remediate.PullRequestRemediation.Content + (*RuleType_Definition_Remediate_PullRequestRemediation_ActionsReplaceTagsWithSha)(nil), // 225: minder.v1.RuleType.Definition.Remediate.PullRequestRemediation.ActionsReplaceTagsWithSha + (*RuleType_Definition_Alert_AlertTypeSA)(nil), // 226: minder.v1.RuleType.Definition.Alert.AlertTypeSA + (*RuleType_Definition_Alert_AlertTypePRComment)(nil), // 227: minder.v1.RuleType.Definition.Alert.AlertTypePRComment + (*Profile_Rule)(nil), // 228: minder.v1.Profile.Rule + (*Profile_Selector)(nil), // 229: minder.v1.Profile.Selector + (*StructDataSource_Def)(nil), // 230: minder.v1.StructDataSource.Def + nil, // 231: minder.v1.StructDataSource.DefEntry + (*StructDataSource_Def_Path)(nil), // 232: minder.v1.StructDataSource.Def.Path + (*RestDataSource_Def)(nil), // 233: minder.v1.RestDataSource.Def + nil, // 234: minder.v1.RestDataSource.DefEntry + nil, // 235: minder.v1.RestDataSource.Def.HeadersEntry + (*RestDataSource_Def_Fallback)(nil), // 236: minder.v1.RestDataSource.Def.Fallback + (*timestamppb.Timestamp)(nil), // 237: google.protobuf.Timestamp + (*structpb.Struct)(nil), // 238: google.protobuf.Struct + (*fieldmaskpb.FieldMask)(nil), // 239: google.protobuf.FieldMask + (*structpb.Value)(nil), // 240: google.protobuf.Value + (*descriptorpb.EnumValueOptions)(nil), // 241: google.protobuf.EnumValueOptions + (*descriptorpb.MethodOptions)(nil), // 242: google.protobuf.MethodOptions } var file_minder_v1_minder_proto_depIdxs = []int32{ 2, // 0: minder.v1.RpcOptions.target_resource:type_name -> minder.v1.TargetResource 1, // 1: minder.v1.RpcOptions.relation:type_name -> minder.v1.Relation 11, // 2: minder.v1.CursorPage.next:type_name -> minder.v1.Cursor 11, // 3: minder.v1.CursorPage.prev:type_name -> minder.v1.Cursor - 99, // 4: minder.v1.ListArtifactsRequest.context:type_name -> minder.v1.Context + 111, // 4: minder.v1.ListArtifactsRequest.context:type_name -> minder.v1.Context 15, // 5: minder.v1.ListArtifactsResponse.results:type_name -> minder.v1.Artifact 16, // 6: minder.v1.Artifact.versions:type_name -> minder.v1.ArtifactVersion - 212, // 7: minder.v1.Artifact.created_at:type_name -> google.protobuf.Timestamp - 99, // 8: minder.v1.Artifact.context:type_name -> minder.v1.Context - 212, // 9: minder.v1.ArtifactVersion.created_at:type_name -> google.protobuf.Timestamp - 99, // 10: minder.v1.GetArtifactByIdRequest.context:type_name -> minder.v1.Context + 237, // 7: minder.v1.Artifact.created_at:type_name -> google.protobuf.Timestamp + 111, // 8: minder.v1.Artifact.context:type_name -> minder.v1.Context + 237, // 9: minder.v1.ArtifactVersion.created_at:type_name -> google.protobuf.Timestamp + 111, // 10: minder.v1.GetArtifactByIdRequest.context:type_name -> minder.v1.Context 15, // 11: minder.v1.GetArtifactByIdResponse.artifact:type_name -> minder.v1.Artifact 16, // 12: minder.v1.GetArtifactByIdResponse.versions:type_name -> minder.v1.ArtifactVersion - 99, // 13: minder.v1.GetArtifactByNameRequest.context:type_name -> minder.v1.Context + 111, // 13: minder.v1.GetArtifactByNameRequest.context:type_name -> minder.v1.Context 15, // 14: minder.v1.GetArtifactByNameResponse.artifact:type_name -> minder.v1.Artifact 16, // 15: minder.v1.GetArtifactByNameResponse.versions:type_name -> minder.v1.ArtifactVersion - 99, // 16: minder.v1.PullRequest.context:type_name -> minder.v1.Context - 213, // 17: minder.v1.PullRequest.properties:type_name -> google.protobuf.Struct - 212, // 18: minder.v1.GetInviteDetailsResponse.expires_at:type_name -> google.protobuf.Timestamp - 99, // 19: minder.v1.GetAuthorizationURLRequest.context:type_name -> minder.v1.Context - 213, // 20: minder.v1.GetAuthorizationURLRequest.config:type_name -> google.protobuf.Struct - 99, // 21: minder.v1.StoreProviderTokenRequest.context:type_name -> minder.v1.Context - 212, // 22: minder.v1.Project.created_at:type_name -> google.protobuf.Timestamp - 212, // 23: minder.v1.Project.updated_at:type_name -> google.protobuf.Timestamp - 99, // 24: minder.v1.ListRemoteRepositoriesFromProviderRequest.context:type_name -> minder.v1.Context - 38, // 25: minder.v1.ListRemoteRepositoriesFromProviderResponse.results:type_name -> minder.v1.UpstreamRepositoryRef - 37, // 26: minder.v1.ListRemoteRepositoriesFromProviderResponse.entities:type_name -> minder.v1.RegistrableUpstreamEntityRef - 186, // 27: minder.v1.RegistrableUpstreamEntityRef.entity:type_name -> minder.v1.UpstreamEntityRef - 99, // 28: minder.v1.UpstreamRepositoryRef.context:type_name -> minder.v1.Context - 99, // 29: minder.v1.Repository.context:type_name -> minder.v1.Context - 212, // 30: minder.v1.Repository.created_at:type_name -> google.protobuf.Timestamp - 212, // 31: minder.v1.Repository.updated_at:type_name -> google.protobuf.Timestamp - 213, // 32: minder.v1.Repository.properties:type_name -> google.protobuf.Struct - 38, // 33: minder.v1.RegisterRepositoryRequest.repository:type_name -> minder.v1.UpstreamRepositoryRef - 99, // 34: minder.v1.RegisterRepositoryRequest.context:type_name -> minder.v1.Context - 186, // 35: minder.v1.RegisterRepositoryRequest.entity:type_name -> minder.v1.UpstreamEntityRef - 39, // 36: minder.v1.RegisterRepoResult.repository:type_name -> minder.v1.Repository - 187, // 37: minder.v1.RegisterRepoResult.status:type_name -> minder.v1.RegisterRepoResult.Status - 41, // 38: minder.v1.RegisterRepositoryResponse.result:type_name -> minder.v1.RegisterRepoResult - 99, // 39: minder.v1.GetRepositoryByIdRequest.context:type_name -> minder.v1.Context - 39, // 40: minder.v1.GetRepositoryByIdResponse.repository:type_name -> minder.v1.Repository - 99, // 41: minder.v1.DeleteRepositoryByIdRequest.context:type_name -> minder.v1.Context - 99, // 42: minder.v1.GetRepositoryByNameRequest.context:type_name -> minder.v1.Context - 39, // 43: minder.v1.GetRepositoryByNameResponse.repository:type_name -> minder.v1.Repository - 99, // 44: minder.v1.DeleteRepositoryByNameRequest.context:type_name -> minder.v1.Context - 99, // 45: minder.v1.ListRepositoriesRequest.context:type_name -> minder.v1.Context - 39, // 46: minder.v1.ListRepositoriesResponse.results:type_name -> minder.v1.Repository - 99, // 47: minder.v1.ReconcileEntityRegistrationRequest.context:type_name -> minder.v1.Context - 212, // 48: minder.v1.VerifyProviderTokenFromRequest.timestamp:type_name -> google.protobuf.Timestamp - 99, // 49: minder.v1.VerifyProviderTokenFromRequest.context:type_name -> minder.v1.Context - 99, // 50: minder.v1.VerifyProviderCredentialRequest.context:type_name -> minder.v1.Context - 212, // 51: minder.v1.CreateUserResponse.created_at:type_name -> google.protobuf.Timestamp - 99, // 52: minder.v1.CreateUserResponse.context:type_name -> minder.v1.Context - 212, // 53: minder.v1.UserRecord.created_at:type_name -> google.protobuf.Timestamp - 212, // 54: minder.v1.UserRecord.updated_at:type_name -> google.protobuf.Timestamp - 148, // 55: minder.v1.ProjectRole.role:type_name -> minder.v1.Role - 34, // 56: minder.v1.ProjectRole.project:type_name -> minder.v1.Project - 64, // 57: minder.v1.GetUserResponse.user:type_name -> minder.v1.UserRecord - 34, // 58: minder.v1.GetUserResponse.projects:type_name -> minder.v1.Project - 65, // 59: minder.v1.GetUserResponse.project_roles:type_name -> minder.v1.ProjectRole - 122, // 60: minder.v1.CreateProfileRequest.profile:type_name -> minder.v1.Profile - 122, // 61: minder.v1.CreateProfileResponse.profile:type_name -> minder.v1.Profile - 122, // 62: minder.v1.UpdateProfileRequest.profile:type_name -> minder.v1.Profile - 122, // 63: minder.v1.UpdateProfileResponse.profile:type_name -> minder.v1.Profile - 99, // 64: minder.v1.PatchProfileRequest.context:type_name -> minder.v1.Context - 122, // 65: minder.v1.PatchProfileRequest.patch:type_name -> minder.v1.Profile - 214, // 66: minder.v1.PatchProfileRequest.update_mask:type_name -> google.protobuf.FieldMask - 122, // 67: minder.v1.PatchProfileResponse.profile:type_name -> minder.v1.Profile - 99, // 68: minder.v1.DeleteProfileRequest.context:type_name -> minder.v1.Context - 99, // 69: minder.v1.ListProfilesRequest.context:type_name -> minder.v1.Context - 122, // 70: minder.v1.ListProfilesResponse.profiles:type_name -> minder.v1.Profile - 99, // 71: minder.v1.GetProfileByIdRequest.context:type_name -> minder.v1.Context - 122, // 72: minder.v1.GetProfileByIdResponse.profile:type_name -> minder.v1.Profile - 99, // 73: minder.v1.GetProfileByNameRequest.context:type_name -> minder.v1.Context - 122, // 74: minder.v1.GetProfileByNameResponse.profile:type_name -> minder.v1.Profile - 212, // 75: minder.v1.ProfileStatus.last_updated:type_name -> google.protobuf.Timestamp - 212, // 76: minder.v1.EvalResultAlert.last_updated:type_name -> google.protobuf.Timestamp - 212, // 77: minder.v1.RuleEvaluationStatus.last_updated:type_name -> google.protobuf.Timestamp - 188, // 78: minder.v1.RuleEvaluationStatus.entity_info:type_name -> minder.v1.RuleEvaluationStatus.EntityInfoEntry - 212, // 79: minder.v1.RuleEvaluationStatus.remediation_last_updated:type_name -> google.protobuf.Timestamp - 83, // 80: minder.v1.RuleEvaluationStatus.alert:type_name -> minder.v1.EvalResultAlert - 120, // 81: minder.v1.RuleEvaluationStatus.severity:type_name -> minder.v1.Severity - 4, // 82: minder.v1.RuleEvaluationStatus.release_phase:type_name -> minder.v1.RuleTypeReleasePhase - 3, // 83: minder.v1.EntityTypedId.type:type_name -> minder.v1.Entity - 99, // 84: minder.v1.GetProfileStatusByNameRequest.context:type_name -> minder.v1.Context - 85, // 85: minder.v1.GetProfileStatusByNameRequest.entity:type_name -> minder.v1.EntityTypedId - 82, // 86: minder.v1.GetProfileStatusByNameResponse.profile_status:type_name -> minder.v1.ProfileStatus - 84, // 87: minder.v1.GetProfileStatusByNameResponse.rule_evaluation_status:type_name -> minder.v1.RuleEvaluationStatus - 99, // 88: minder.v1.GetProfileStatusByProjectRequest.context:type_name -> minder.v1.Context - 82, // 89: minder.v1.GetProfileStatusByProjectResponse.profile_status:type_name -> minder.v1.ProfileStatus - 189, // 90: minder.v1.AutoRegistration.entities:type_name -> minder.v1.AutoRegistration.EntitiesEntry - 91, // 91: minder.v1.ProviderConfig.auto_registration:type_name -> minder.v1.AutoRegistration - 99, // 92: minder.v1.ListRuleTypesRequest.context:type_name -> minder.v1.Context - 121, // 93: minder.v1.ListRuleTypesResponse.rule_types:type_name -> minder.v1.RuleType - 99, // 94: minder.v1.GetRuleTypeByNameRequest.context:type_name -> minder.v1.Context - 121, // 95: minder.v1.GetRuleTypeByNameResponse.rule_type:type_name -> minder.v1.RuleType - 99, // 96: minder.v1.GetRuleTypeByIdRequest.context:type_name -> minder.v1.Context - 121, // 97: minder.v1.GetRuleTypeByIdResponse.rule_type:type_name -> minder.v1.RuleType - 121, // 98: minder.v1.CreateRuleTypeRequest.rule_type:type_name -> minder.v1.RuleType - 121, // 99: minder.v1.CreateRuleTypeResponse.rule_type:type_name -> minder.v1.RuleType - 121, // 100: minder.v1.UpdateRuleTypeRequest.rule_type:type_name -> minder.v1.RuleType - 121, // 101: minder.v1.UpdateRuleTypeResponse.rule_type:type_name -> minder.v1.RuleType - 99, // 102: minder.v1.DeleteRuleTypeRequest.context:type_name -> minder.v1.Context - 99, // 103: minder.v1.ListEvaluationResultsRequest.context:type_name -> minder.v1.Context - 85, // 104: minder.v1.ListEvaluationResultsRequest.entity:type_name -> minder.v1.EntityTypedId - 191, // 105: minder.v1.ListEvaluationResultsResponse.entities:type_name -> minder.v1.ListEvaluationResultsResponse.EntityEvaluationResults - 192, // 106: minder.v1.RestType.fallback:type_name -> minder.v1.RestType.Fallback - 193, // 107: minder.v1.DiffType.ecosystems:type_name -> minder.v1.DiffType.Ecosystem - 9, // 108: minder.v1.Severity.value:type_name -> minder.v1.Severity.Value - 99, // 109: minder.v1.RuleType.context:type_name -> minder.v1.Context - 194, // 110: minder.v1.RuleType.def:type_name -> minder.v1.RuleType.Definition - 120, // 111: minder.v1.RuleType.severity:type_name -> minder.v1.Severity - 4, // 112: minder.v1.RuleType.release_phase:type_name -> minder.v1.RuleTypeReleasePhase - 99, // 113: minder.v1.Profile.context:type_name -> minder.v1.Context - 210, // 114: minder.v1.Profile.repository:type_name -> minder.v1.Profile.Rule - 210, // 115: minder.v1.Profile.build_environment:type_name -> minder.v1.Profile.Rule - 210, // 116: minder.v1.Profile.artifact:type_name -> minder.v1.Profile.Rule - 210, // 117: minder.v1.Profile.pull_request:type_name -> minder.v1.Profile.Rule - 210, // 118: minder.v1.Profile.release:type_name -> minder.v1.Profile.Rule - 210, // 119: minder.v1.Profile.pipeline_run:type_name -> minder.v1.Profile.Rule - 210, // 120: minder.v1.Profile.task_run:type_name -> minder.v1.Profile.Rule - 210, // 121: minder.v1.Profile.build:type_name -> minder.v1.Profile.Rule - 211, // 122: minder.v1.Profile.selection:type_name -> minder.v1.Profile.Selector - 34, // 123: minder.v1.ListProjectsResponse.projects:type_name -> minder.v1.Project - 99, // 124: minder.v1.CreateProjectRequest.context:type_name -> minder.v1.Context - 34, // 125: minder.v1.CreateProjectResponse.project:type_name -> minder.v1.Project - 99, // 126: minder.v1.DeleteProjectRequest.context:type_name -> minder.v1.Context - 99, // 127: minder.v1.UpdateProjectRequest.context:type_name -> minder.v1.Context - 34, // 128: minder.v1.UpdateProjectResponse.project:type_name -> minder.v1.Project - 99, // 129: minder.v1.PatchProjectRequest.context:type_name -> minder.v1.Context - 131, // 130: minder.v1.PatchProjectRequest.patch:type_name -> minder.v1.ProjectPatch - 214, // 131: minder.v1.PatchProjectRequest.update_mask:type_name -> google.protobuf.FieldMask - 34, // 132: minder.v1.PatchProjectResponse.project:type_name -> minder.v1.Project - 100, // 133: minder.v1.ListChildProjectsRequest.context:type_name -> minder.v1.ContextV2 - 34, // 134: minder.v1.ListChildProjectsResponse.projects:type_name -> minder.v1.Project - 85, // 135: minder.v1.CreateEntityReconciliationTaskRequest.entity:type_name -> minder.v1.EntityTypedId - 99, // 136: minder.v1.CreateEntityReconciliationTaskRequest.context:type_name -> minder.v1.Context - 99, // 137: minder.v1.ListRolesRequest.context:type_name -> minder.v1.Context - 148, // 138: minder.v1.ListRolesResponse.roles:type_name -> minder.v1.Role - 99, // 139: minder.v1.ListRoleAssignmentsRequest.context:type_name -> minder.v1.Context - 149, // 140: minder.v1.ListRoleAssignmentsResponse.role_assignments:type_name -> minder.v1.RoleAssignment - 154, // 141: minder.v1.ListRoleAssignmentsResponse.invitations:type_name -> minder.v1.Invitation - 99, // 142: minder.v1.AssignRoleRequest.context:type_name -> minder.v1.Context - 149, // 143: minder.v1.AssignRoleRequest.role_assignment:type_name -> minder.v1.RoleAssignment - 149, // 144: minder.v1.AssignRoleResponse.role_assignment:type_name -> minder.v1.RoleAssignment - 154, // 145: minder.v1.AssignRoleResponse.invitation:type_name -> minder.v1.Invitation - 99, // 146: minder.v1.UpdateRoleRequest.context:type_name -> minder.v1.Context - 149, // 147: minder.v1.UpdateRoleResponse.role_assignments:type_name -> minder.v1.RoleAssignment - 154, // 148: minder.v1.UpdateRoleResponse.invitations:type_name -> minder.v1.Invitation - 99, // 149: minder.v1.RemoveRoleRequest.context:type_name -> minder.v1.Context - 149, // 150: minder.v1.RemoveRoleRequest.role_assignment:type_name -> minder.v1.RoleAssignment - 149, // 151: minder.v1.RemoveRoleResponse.role_assignment:type_name -> minder.v1.RoleAssignment - 154, // 152: minder.v1.RemoveRoleResponse.invitation:type_name -> minder.v1.Invitation - 154, // 153: minder.v1.ListInvitationsResponse.invitations:type_name -> minder.v1.Invitation - 212, // 154: minder.v1.Invitation.created_at:type_name -> google.protobuf.Timestamp - 212, // 155: minder.v1.Invitation.expires_at:type_name -> google.protobuf.Timestamp - 99, // 156: minder.v1.GetProviderRequest.context:type_name -> minder.v1.Context - 174, // 157: minder.v1.GetProviderResponse.provider:type_name -> minder.v1.Provider - 99, // 158: minder.v1.ListProvidersRequest.context:type_name -> minder.v1.Context - 174, // 159: minder.v1.ListProvidersResponse.providers:type_name -> minder.v1.Provider - 99, // 160: minder.v1.CreateProviderRequest.context:type_name -> minder.v1.Context - 174, // 161: minder.v1.CreateProviderRequest.provider:type_name -> minder.v1.Provider - 174, // 162: minder.v1.CreateProviderResponse.provider:type_name -> minder.v1.Provider - 171, // 163: minder.v1.CreateProviderResponse.authorization:type_name -> minder.v1.AuthorizationParams - 99, // 164: minder.v1.DeleteProviderRequest.context:type_name -> minder.v1.Context - 99, // 165: minder.v1.DeleteProviderByIDRequest.context:type_name -> minder.v1.Context - 99, // 166: minder.v1.GetUnclaimedProvidersRequest.context:type_name -> minder.v1.Context - 172, // 167: minder.v1.GetUnclaimedProvidersResponse.providers:type_name -> minder.v1.ProviderParameter - 99, // 168: minder.v1.ListProviderClassesRequest.context:type_name -> minder.v1.Context - 99, // 169: minder.v1.PatchProviderRequest.context:type_name -> minder.v1.Context - 174, // 170: minder.v1.PatchProviderRequest.patch:type_name -> minder.v1.Provider - 214, // 171: minder.v1.PatchProviderRequest.update_mask:type_name -> google.protobuf.FieldMask - 174, // 172: minder.v1.PatchProviderResponse.provider:type_name -> minder.v1.Provider - 173, // 173: minder.v1.ProviderParameter.github_app:type_name -> minder.v1.GitHubAppParams - 5, // 174: minder.v1.Provider.implements:type_name -> minder.v1.ProviderType - 213, // 175: minder.v1.Provider.config:type_name -> google.protobuf.Struct - 7, // 176: minder.v1.Provider.auth_flows:type_name -> minder.v1.AuthorizationFlow - 172, // 177: minder.v1.Provider.parameters:type_name -> minder.v1.ProviderParameter - 99, // 178: minder.v1.GetEvaluationHistoryRequest.context:type_name -> minder.v1.Context - 99, // 179: minder.v1.ListEvaluationHistoryRequest.context:type_name -> minder.v1.Context - 212, // 180: minder.v1.ListEvaluationHistoryRequest.from:type_name -> google.protobuf.Timestamp - 212, // 181: minder.v1.ListEvaluationHistoryRequest.to:type_name -> google.protobuf.Timestamp - 11, // 182: minder.v1.ListEvaluationHistoryRequest.cursor:type_name -> minder.v1.Cursor - 179, // 183: minder.v1.GetEvaluationHistoryResponse.evaluation:type_name -> minder.v1.EvaluationHistory - 179, // 184: minder.v1.ListEvaluationHistoryResponse.data:type_name -> minder.v1.EvaluationHistory - 12, // 185: minder.v1.ListEvaluationHistoryResponse.page:type_name -> minder.v1.CursorPage - 180, // 186: minder.v1.EvaluationHistory.entity:type_name -> minder.v1.EvaluationHistoryEntity - 181, // 187: minder.v1.EvaluationHistory.rule:type_name -> minder.v1.EvaluationHistoryRule - 182, // 188: minder.v1.EvaluationHistory.status:type_name -> minder.v1.EvaluationHistoryStatus - 184, // 189: minder.v1.EvaluationHistory.alert:type_name -> minder.v1.EvaluationHistoryAlert - 183, // 190: minder.v1.EvaluationHistory.remediation:type_name -> minder.v1.EvaluationHistoryRemediation - 212, // 191: minder.v1.EvaluationHistory.evaluated_at:type_name -> google.protobuf.Timestamp - 3, // 192: minder.v1.EvaluationHistoryEntity.type:type_name -> minder.v1.Entity - 120, // 193: minder.v1.EvaluationHistoryRule.severity:type_name -> minder.v1.Severity - 100, // 194: minder.v1.EntityInstance.context:type_name -> minder.v1.ContextV2 - 3, // 195: minder.v1.EntityInstance.type:type_name -> minder.v1.Entity - 213, // 196: minder.v1.EntityInstance.properties:type_name -> google.protobuf.Struct - 100, // 197: minder.v1.UpstreamEntityRef.context:type_name -> minder.v1.ContextV2 - 3, // 198: minder.v1.UpstreamEntityRef.type:type_name -> minder.v1.Entity - 213, // 199: minder.v1.UpstreamEntityRef.properties:type_name -> google.protobuf.Struct - 90, // 200: minder.v1.AutoRegistration.EntitiesEntry.value:type_name -> minder.v1.EntityAutoRegistrationConfig - 82, // 201: minder.v1.ListEvaluationResultsResponse.EntityProfileEvaluationResults.profile_status:type_name -> minder.v1.ProfileStatus - 84, // 202: minder.v1.ListEvaluationResultsResponse.EntityProfileEvaluationResults.results:type_name -> minder.v1.RuleEvaluationStatus - 85, // 203: minder.v1.ListEvaluationResultsResponse.EntityEvaluationResults.entity:type_name -> minder.v1.EntityTypedId - 190, // 204: minder.v1.ListEvaluationResultsResponse.EntityEvaluationResults.profiles:type_name -> minder.v1.ListEvaluationResultsResponse.EntityProfileEvaluationResults - 213, // 205: minder.v1.RuleType.Definition.rule_schema:type_name -> google.protobuf.Struct - 213, // 206: minder.v1.RuleType.Definition.param_schema:type_name -> google.protobuf.Struct - 195, // 207: minder.v1.RuleType.Definition.ingest:type_name -> minder.v1.RuleType.Definition.Ingest - 196, // 208: minder.v1.RuleType.Definition.eval:type_name -> minder.v1.RuleType.Definition.Eval - 197, // 209: minder.v1.RuleType.Definition.remediate:type_name -> minder.v1.RuleType.Definition.Remediate - 198, // 210: minder.v1.RuleType.Definition.alert:type_name -> minder.v1.RuleType.Definition.Alert - 115, // 211: minder.v1.RuleType.Definition.Ingest.rest:type_name -> minder.v1.RestType - 116, // 212: minder.v1.RuleType.Definition.Ingest.builtin:type_name -> minder.v1.BuiltinType - 117, // 213: minder.v1.RuleType.Definition.Ingest.artifact:type_name -> minder.v1.ArtifactType - 118, // 214: minder.v1.RuleType.Definition.Ingest.git:type_name -> minder.v1.GitType - 119, // 215: minder.v1.RuleType.Definition.Ingest.diff:type_name -> minder.v1.DiffType - 199, // 216: minder.v1.RuleType.Definition.Eval.jq:type_name -> minder.v1.RuleType.Definition.Eval.JQComparison - 200, // 217: minder.v1.RuleType.Definition.Eval.rego:type_name -> minder.v1.RuleType.Definition.Eval.Rego - 201, // 218: minder.v1.RuleType.Definition.Eval.vulncheck:type_name -> minder.v1.RuleType.Definition.Eval.Vulncheck - 202, // 219: minder.v1.RuleType.Definition.Eval.trusty:type_name -> minder.v1.RuleType.Definition.Eval.Trusty - 203, // 220: minder.v1.RuleType.Definition.Eval.homoglyphs:type_name -> minder.v1.RuleType.Definition.Eval.Homoglyphs - 115, // 221: minder.v1.RuleType.Definition.Remediate.rest:type_name -> minder.v1.RestType - 205, // 222: minder.v1.RuleType.Definition.Remediate.gh_branch_protection:type_name -> minder.v1.RuleType.Definition.Remediate.GhBranchProtectionType - 206, // 223: minder.v1.RuleType.Definition.Remediate.pull_request:type_name -> minder.v1.RuleType.Definition.Remediate.PullRequestRemediation - 209, // 224: minder.v1.RuleType.Definition.Alert.security_advisory:type_name -> minder.v1.RuleType.Definition.Alert.AlertTypeSA - 204, // 225: minder.v1.RuleType.Definition.Eval.JQComparison.ingested:type_name -> minder.v1.RuleType.Definition.Eval.JQComparison.Operator - 204, // 226: minder.v1.RuleType.Definition.Eval.JQComparison.profile:type_name -> minder.v1.RuleType.Definition.Eval.JQComparison.Operator - 215, // 227: minder.v1.RuleType.Definition.Eval.JQComparison.constant:type_name -> google.protobuf.Value - 207, // 228: minder.v1.RuleType.Definition.Remediate.PullRequestRemediation.contents:type_name -> minder.v1.RuleType.Definition.Remediate.PullRequestRemediation.Content - 208, // 229: minder.v1.RuleType.Definition.Remediate.PullRequestRemediation.actions_replace_tags_with_sha:type_name -> minder.v1.RuleType.Definition.Remediate.PullRequestRemediation.ActionsReplaceTagsWithSha - 213, // 230: minder.v1.Profile.Rule.params:type_name -> google.protobuf.Struct - 213, // 231: minder.v1.Profile.Rule.def:type_name -> google.protobuf.Struct - 216, // 232: minder.v1.name:extendee -> google.protobuf.EnumValueOptions - 217, // 233: minder.v1.rpc_options:extendee -> google.protobuf.MethodOptions - 10, // 234: minder.v1.rpc_options:type_name -> minder.v1.RpcOptions - 28, // 235: minder.v1.HealthService.CheckHealth:input_type -> minder.v1.CheckHealthRequest - 13, // 236: minder.v1.ArtifactService.ListArtifacts:input_type -> minder.v1.ListArtifactsRequest - 17, // 237: minder.v1.ArtifactService.GetArtifactById:input_type -> minder.v1.GetArtifactByIdRequest - 19, // 238: minder.v1.ArtifactService.GetArtifactByName:input_type -> minder.v1.GetArtifactByNameRequest - 30, // 239: minder.v1.OAuthService.GetAuthorizationURL:input_type -> minder.v1.GetAuthorizationURLRequest - 32, // 240: minder.v1.OAuthService.StoreProviderToken:input_type -> minder.v1.StoreProviderTokenRequest - 55, // 241: minder.v1.OAuthService.VerifyProviderTokenFrom:input_type -> minder.v1.VerifyProviderTokenFromRequest - 57, // 242: minder.v1.OAuthService.VerifyProviderCredential:input_type -> minder.v1.VerifyProviderCredentialRequest - 40, // 243: minder.v1.RepositoryService.RegisterRepository:input_type -> minder.v1.RegisterRepositoryRequest - 35, // 244: minder.v1.RepositoryService.ListRemoteRepositoriesFromProvider:input_type -> minder.v1.ListRemoteRepositoriesFromProviderRequest - 51, // 245: minder.v1.RepositoryService.ListRepositories:input_type -> minder.v1.ListRepositoriesRequest - 43, // 246: minder.v1.RepositoryService.GetRepositoryById:input_type -> minder.v1.GetRepositoryByIdRequest - 47, // 247: minder.v1.RepositoryService.GetRepositoryByName:input_type -> minder.v1.GetRepositoryByNameRequest - 45, // 248: minder.v1.RepositoryService.DeleteRepositoryById:input_type -> minder.v1.DeleteRepositoryByIdRequest - 49, // 249: minder.v1.RepositoryService.DeleteRepositoryByName:input_type -> minder.v1.DeleteRepositoryByNameRequest - 60, // 250: minder.v1.UserService.CreateUser:input_type -> minder.v1.CreateUserRequest - 62, // 251: minder.v1.UserService.DeleteUser:input_type -> minder.v1.DeleteUserRequest - 66, // 252: minder.v1.UserService.GetUser:input_type -> minder.v1.GetUserRequest - 150, // 253: minder.v1.UserService.ListInvitations:input_type -> minder.v1.ListInvitationsRequest - 152, // 254: minder.v1.UserService.ResolveInvitation:input_type -> minder.v1.ResolveInvitationRequest - 68, // 255: minder.v1.ProfileService.CreateProfile:input_type -> minder.v1.CreateProfileRequest - 70, // 256: minder.v1.ProfileService.UpdateProfile:input_type -> minder.v1.UpdateProfileRequest - 72, // 257: minder.v1.ProfileService.PatchProfile:input_type -> minder.v1.PatchProfileRequest - 74, // 258: minder.v1.ProfileService.DeleteProfile:input_type -> minder.v1.DeleteProfileRequest - 76, // 259: minder.v1.ProfileService.ListProfiles:input_type -> minder.v1.ListProfilesRequest - 78, // 260: minder.v1.ProfileService.GetProfileById:input_type -> minder.v1.GetProfileByIdRequest - 80, // 261: minder.v1.ProfileService.GetProfileByName:input_type -> minder.v1.GetProfileByNameRequest - 86, // 262: minder.v1.ProfileService.GetProfileStatusByName:input_type -> minder.v1.GetProfileStatusByNameRequest - 88, // 263: minder.v1.ProfileService.GetProfileStatusByProject:input_type -> minder.v1.GetProfileStatusByProjectRequest - 101, // 264: minder.v1.RuleTypeService.ListRuleTypes:input_type -> minder.v1.ListRuleTypesRequest - 103, // 265: minder.v1.RuleTypeService.GetRuleTypeByName:input_type -> minder.v1.GetRuleTypeByNameRequest - 105, // 266: minder.v1.RuleTypeService.GetRuleTypeById:input_type -> minder.v1.GetRuleTypeByIdRequest - 107, // 267: minder.v1.RuleTypeService.CreateRuleType:input_type -> minder.v1.CreateRuleTypeRequest - 109, // 268: minder.v1.RuleTypeService.UpdateRuleType:input_type -> minder.v1.UpdateRuleTypeRequest - 111, // 269: minder.v1.RuleTypeService.DeleteRuleType:input_type -> minder.v1.DeleteRuleTypeRequest - 113, // 270: minder.v1.EvalResultsService.ListEvaluationResults:input_type -> minder.v1.ListEvaluationResultsRequest - 176, // 271: minder.v1.EvalResultsService.ListEvaluationHistory:input_type -> minder.v1.ListEvaluationHistoryRequest - 175, // 272: minder.v1.EvalResultsService.GetEvaluationHistory:input_type -> minder.v1.GetEvaluationHistoryRequest - 138, // 273: minder.v1.PermissionsService.ListRoles:input_type -> minder.v1.ListRolesRequest - 140, // 274: minder.v1.PermissionsService.ListRoleAssignments:input_type -> minder.v1.ListRoleAssignmentsRequest - 142, // 275: minder.v1.PermissionsService.AssignRole:input_type -> minder.v1.AssignRoleRequest - 144, // 276: minder.v1.PermissionsService.UpdateRole:input_type -> minder.v1.UpdateRoleRequest - 146, // 277: minder.v1.PermissionsService.RemoveRole:input_type -> minder.v1.RemoveRoleRequest - 123, // 278: minder.v1.ProjectsService.ListProjects:input_type -> minder.v1.ListProjectsRequest - 125, // 279: minder.v1.ProjectsService.CreateProject:input_type -> minder.v1.CreateProjectRequest - 134, // 280: minder.v1.ProjectsService.ListChildProjects:input_type -> minder.v1.ListChildProjectsRequest - 127, // 281: minder.v1.ProjectsService.DeleteProject:input_type -> minder.v1.DeleteProjectRequest - 129, // 282: minder.v1.ProjectsService.UpdateProject:input_type -> minder.v1.UpdateProjectRequest - 132, // 283: minder.v1.ProjectsService.PatchProject:input_type -> minder.v1.PatchProjectRequest - 136, // 284: minder.v1.ProjectsService.CreateEntityReconciliationTask:input_type -> minder.v1.CreateEntityReconciliationTaskRequest - 169, // 285: minder.v1.ProvidersService.PatchProvider:input_type -> minder.v1.PatchProviderRequest - 155, // 286: minder.v1.ProvidersService.GetProvider:input_type -> minder.v1.GetProviderRequest - 157, // 287: minder.v1.ProvidersService.ListProviders:input_type -> minder.v1.ListProvidersRequest - 159, // 288: minder.v1.ProvidersService.CreateProvider:input_type -> minder.v1.CreateProviderRequest - 161, // 289: minder.v1.ProvidersService.DeleteProvider:input_type -> minder.v1.DeleteProviderRequest - 163, // 290: minder.v1.ProvidersService.DeleteProviderByID:input_type -> minder.v1.DeleteProviderByIDRequest - 165, // 291: minder.v1.ProvidersService.GetUnclaimedProviders:input_type -> minder.v1.GetUnclaimedProvidersRequest - 167, // 292: minder.v1.ProvidersService.ListProviderClasses:input_type -> minder.v1.ListProviderClassesRequest - 53, // 293: minder.v1.ProvidersService.ReconcileEntityRegistration:input_type -> minder.v1.ReconcileEntityRegistrationRequest - 26, // 294: minder.v1.InviteService.GetInviteDetails:input_type -> minder.v1.GetInviteDetailsRequest - 29, // 295: minder.v1.HealthService.CheckHealth:output_type -> minder.v1.CheckHealthResponse - 14, // 296: minder.v1.ArtifactService.ListArtifacts:output_type -> minder.v1.ListArtifactsResponse - 18, // 297: minder.v1.ArtifactService.GetArtifactById:output_type -> minder.v1.GetArtifactByIdResponse - 20, // 298: minder.v1.ArtifactService.GetArtifactByName:output_type -> minder.v1.GetArtifactByNameResponse - 31, // 299: minder.v1.OAuthService.GetAuthorizationURL:output_type -> minder.v1.GetAuthorizationURLResponse - 33, // 300: minder.v1.OAuthService.StoreProviderToken:output_type -> minder.v1.StoreProviderTokenResponse - 56, // 301: minder.v1.OAuthService.VerifyProviderTokenFrom:output_type -> minder.v1.VerifyProviderTokenFromResponse - 58, // 302: minder.v1.OAuthService.VerifyProviderCredential:output_type -> minder.v1.VerifyProviderCredentialResponse - 42, // 303: minder.v1.RepositoryService.RegisterRepository:output_type -> minder.v1.RegisterRepositoryResponse - 36, // 304: minder.v1.RepositoryService.ListRemoteRepositoriesFromProvider:output_type -> minder.v1.ListRemoteRepositoriesFromProviderResponse - 52, // 305: minder.v1.RepositoryService.ListRepositories:output_type -> minder.v1.ListRepositoriesResponse - 44, // 306: minder.v1.RepositoryService.GetRepositoryById:output_type -> minder.v1.GetRepositoryByIdResponse - 48, // 307: minder.v1.RepositoryService.GetRepositoryByName:output_type -> minder.v1.GetRepositoryByNameResponse - 46, // 308: minder.v1.RepositoryService.DeleteRepositoryById:output_type -> minder.v1.DeleteRepositoryByIdResponse - 50, // 309: minder.v1.RepositoryService.DeleteRepositoryByName:output_type -> minder.v1.DeleteRepositoryByNameResponse - 61, // 310: minder.v1.UserService.CreateUser:output_type -> minder.v1.CreateUserResponse - 63, // 311: minder.v1.UserService.DeleteUser:output_type -> minder.v1.DeleteUserResponse - 67, // 312: minder.v1.UserService.GetUser:output_type -> minder.v1.GetUserResponse - 151, // 313: minder.v1.UserService.ListInvitations:output_type -> minder.v1.ListInvitationsResponse - 153, // 314: minder.v1.UserService.ResolveInvitation:output_type -> minder.v1.ResolveInvitationResponse - 69, // 315: minder.v1.ProfileService.CreateProfile:output_type -> minder.v1.CreateProfileResponse - 71, // 316: minder.v1.ProfileService.UpdateProfile:output_type -> minder.v1.UpdateProfileResponse - 73, // 317: minder.v1.ProfileService.PatchProfile:output_type -> minder.v1.PatchProfileResponse - 75, // 318: minder.v1.ProfileService.DeleteProfile:output_type -> minder.v1.DeleteProfileResponse - 77, // 319: minder.v1.ProfileService.ListProfiles:output_type -> minder.v1.ListProfilesResponse - 79, // 320: minder.v1.ProfileService.GetProfileById:output_type -> minder.v1.GetProfileByIdResponse - 81, // 321: minder.v1.ProfileService.GetProfileByName:output_type -> minder.v1.GetProfileByNameResponse - 87, // 322: minder.v1.ProfileService.GetProfileStatusByName:output_type -> minder.v1.GetProfileStatusByNameResponse - 89, // 323: minder.v1.ProfileService.GetProfileStatusByProject:output_type -> minder.v1.GetProfileStatusByProjectResponse - 102, // 324: minder.v1.RuleTypeService.ListRuleTypes:output_type -> minder.v1.ListRuleTypesResponse - 104, // 325: minder.v1.RuleTypeService.GetRuleTypeByName:output_type -> minder.v1.GetRuleTypeByNameResponse - 106, // 326: minder.v1.RuleTypeService.GetRuleTypeById:output_type -> minder.v1.GetRuleTypeByIdResponse - 108, // 327: minder.v1.RuleTypeService.CreateRuleType:output_type -> minder.v1.CreateRuleTypeResponse - 110, // 328: minder.v1.RuleTypeService.UpdateRuleType:output_type -> minder.v1.UpdateRuleTypeResponse - 112, // 329: minder.v1.RuleTypeService.DeleteRuleType:output_type -> minder.v1.DeleteRuleTypeResponse - 114, // 330: minder.v1.EvalResultsService.ListEvaluationResults:output_type -> minder.v1.ListEvaluationResultsResponse - 178, // 331: minder.v1.EvalResultsService.ListEvaluationHistory:output_type -> minder.v1.ListEvaluationHistoryResponse - 177, // 332: minder.v1.EvalResultsService.GetEvaluationHistory:output_type -> minder.v1.GetEvaluationHistoryResponse - 139, // 333: minder.v1.PermissionsService.ListRoles:output_type -> minder.v1.ListRolesResponse - 141, // 334: minder.v1.PermissionsService.ListRoleAssignments:output_type -> minder.v1.ListRoleAssignmentsResponse - 143, // 335: minder.v1.PermissionsService.AssignRole:output_type -> minder.v1.AssignRoleResponse - 145, // 336: minder.v1.PermissionsService.UpdateRole:output_type -> minder.v1.UpdateRoleResponse - 147, // 337: minder.v1.PermissionsService.RemoveRole:output_type -> minder.v1.RemoveRoleResponse - 124, // 338: minder.v1.ProjectsService.ListProjects:output_type -> minder.v1.ListProjectsResponse - 126, // 339: minder.v1.ProjectsService.CreateProject:output_type -> minder.v1.CreateProjectResponse - 135, // 340: minder.v1.ProjectsService.ListChildProjects:output_type -> minder.v1.ListChildProjectsResponse - 128, // 341: minder.v1.ProjectsService.DeleteProject:output_type -> minder.v1.DeleteProjectResponse - 130, // 342: minder.v1.ProjectsService.UpdateProject:output_type -> minder.v1.UpdateProjectResponse - 133, // 343: minder.v1.ProjectsService.PatchProject:output_type -> minder.v1.PatchProjectResponse - 137, // 344: minder.v1.ProjectsService.CreateEntityReconciliationTask:output_type -> minder.v1.CreateEntityReconciliationTaskResponse - 170, // 345: minder.v1.ProvidersService.PatchProvider:output_type -> minder.v1.PatchProviderResponse - 156, // 346: minder.v1.ProvidersService.GetProvider:output_type -> minder.v1.GetProviderResponse - 158, // 347: minder.v1.ProvidersService.ListProviders:output_type -> minder.v1.ListProvidersResponse - 160, // 348: minder.v1.ProvidersService.CreateProvider:output_type -> minder.v1.CreateProviderResponse - 162, // 349: minder.v1.ProvidersService.DeleteProvider:output_type -> minder.v1.DeleteProviderResponse - 164, // 350: minder.v1.ProvidersService.DeleteProviderByID:output_type -> minder.v1.DeleteProviderByIDResponse - 166, // 351: minder.v1.ProvidersService.GetUnclaimedProviders:output_type -> minder.v1.GetUnclaimedProvidersResponse - 168, // 352: minder.v1.ProvidersService.ListProviderClasses:output_type -> minder.v1.ListProviderClassesResponse - 54, // 353: minder.v1.ProvidersService.ReconcileEntityRegistration:output_type -> minder.v1.ReconcileEntityRegistrationResponse - 27, // 354: minder.v1.InviteService.GetInviteDetails:output_type -> minder.v1.GetInviteDetailsResponse - 295, // [295:355] is the sub-list for method output_type - 235, // [235:295] is the sub-list for method input_type - 234, // [234:235] is the sub-list for extension type_name - 232, // [232:234] is the sub-list for extension extendee - 0, // [0:232] is the sub-list for field type_name + 237, // 16: minder.v1.GetInviteDetailsResponse.expires_at:type_name -> google.protobuf.Timestamp + 111, // 17: minder.v1.GetAuthorizationURLRequest.context:type_name -> minder.v1.Context + 238, // 18: minder.v1.GetAuthorizationURLRequest.config:type_name -> google.protobuf.Struct + 111, // 19: minder.v1.StoreProviderTokenRequest.context:type_name -> minder.v1.Context + 237, // 20: minder.v1.Project.created_at:type_name -> google.protobuf.Timestamp + 237, // 21: minder.v1.Project.updated_at:type_name -> google.protobuf.Timestamp + 111, // 22: minder.v1.ListRemoteRepositoriesFromProviderRequest.context:type_name -> minder.v1.Context + 37, // 23: minder.v1.ListRemoteRepositoriesFromProviderResponse.results:type_name -> minder.v1.UpstreamRepositoryRef + 36, // 24: minder.v1.ListRemoteRepositoriesFromProviderResponse.entities:type_name -> minder.v1.RegistrableUpstreamEntityRef + 197, // 25: minder.v1.RegistrableUpstreamEntityRef.entity:type_name -> minder.v1.UpstreamEntityRef + 111, // 26: minder.v1.UpstreamRepositoryRef.context:type_name -> minder.v1.Context + 111, // 27: minder.v1.Repository.context:type_name -> minder.v1.Context + 237, // 28: minder.v1.Repository.created_at:type_name -> google.protobuf.Timestamp + 237, // 29: minder.v1.Repository.updated_at:type_name -> google.protobuf.Timestamp + 238, // 30: minder.v1.Repository.properties:type_name -> google.protobuf.Struct + 37, // 31: minder.v1.RegisterRepositoryRequest.repository:type_name -> minder.v1.UpstreamRepositoryRef + 111, // 32: minder.v1.RegisterRepositoryRequest.context:type_name -> minder.v1.Context + 197, // 33: minder.v1.RegisterRepositoryRequest.entity:type_name -> minder.v1.UpstreamEntityRef + 38, // 34: minder.v1.RegisterRepoResult.repository:type_name -> minder.v1.Repository + 202, // 35: minder.v1.RegisterRepoResult.status:type_name -> minder.v1.RegisterRepoResult.Status + 40, // 36: minder.v1.RegisterRepositoryResponse.result:type_name -> minder.v1.RegisterRepoResult + 111, // 37: minder.v1.GetRepositoryByIdRequest.context:type_name -> minder.v1.Context + 38, // 38: minder.v1.GetRepositoryByIdResponse.repository:type_name -> minder.v1.Repository + 111, // 39: minder.v1.DeleteRepositoryByIdRequest.context:type_name -> minder.v1.Context + 111, // 40: minder.v1.GetRepositoryByNameRequest.context:type_name -> minder.v1.Context + 38, // 41: minder.v1.GetRepositoryByNameResponse.repository:type_name -> minder.v1.Repository + 111, // 42: minder.v1.DeleteRepositoryByNameRequest.context:type_name -> minder.v1.Context + 111, // 43: minder.v1.ListRepositoriesRequest.context:type_name -> minder.v1.Context + 38, // 44: minder.v1.ListRepositoriesResponse.results:type_name -> minder.v1.Repository + 111, // 45: minder.v1.ReconcileEntityRegistrationRequest.context:type_name -> minder.v1.Context + 237, // 46: minder.v1.VerifyProviderTokenFromRequest.timestamp:type_name -> google.protobuf.Timestamp + 111, // 47: minder.v1.VerifyProviderTokenFromRequest.context:type_name -> minder.v1.Context + 111, // 48: minder.v1.VerifyProviderCredentialRequest.context:type_name -> minder.v1.Context + 237, // 49: minder.v1.CreateUserResponse.created_at:type_name -> google.protobuf.Timestamp + 111, // 50: minder.v1.CreateUserResponse.context:type_name -> minder.v1.Context + 237, // 51: minder.v1.UserRecord.created_at:type_name -> google.protobuf.Timestamp + 237, // 52: minder.v1.UserRecord.updated_at:type_name -> google.protobuf.Timestamp + 161, // 53: minder.v1.ProjectRole.role:type_name -> minder.v1.Role + 33, // 54: minder.v1.ProjectRole.project:type_name -> minder.v1.Project + 62, // 55: minder.v1.GetUserResponse.user:type_name -> minder.v1.UserRecord + 33, // 56: minder.v1.GetUserResponse.projects:type_name -> minder.v1.Project + 63, // 57: minder.v1.GetUserResponse.project_roles:type_name -> minder.v1.ProjectRole + 198, // 58: minder.v1.CreateDataSourceRequest.data_source:type_name -> minder.v1.DataSource + 198, // 59: minder.v1.CreateDataSourceResponse.data_source:type_name -> minder.v1.DataSource + 112, // 60: minder.v1.GetDataSourceByIdRequest.context:type_name -> minder.v1.ContextV2 + 198, // 61: minder.v1.GetDataSourceByIdResponse.data_source:type_name -> minder.v1.DataSource + 112, // 62: minder.v1.GetDataSourceByNameRequest.context:type_name -> minder.v1.ContextV2 + 198, // 63: minder.v1.GetDataSourceByNameResponse.data_source:type_name -> minder.v1.DataSource + 112, // 64: minder.v1.ListDataSourcesRequest.context:type_name -> minder.v1.ContextV2 + 198, // 65: minder.v1.ListDataSourcesResponse.data_sources:type_name -> minder.v1.DataSource + 198, // 66: minder.v1.UpdateDataSourceRequest.data_source:type_name -> minder.v1.DataSource + 198, // 67: minder.v1.UpdateDataSourceResponse.data_source:type_name -> minder.v1.DataSource + 112, // 68: minder.v1.DeleteDataSourceByIdRequest.context:type_name -> minder.v1.ContextV2 + 112, // 69: minder.v1.DeleteDataSourceByNameRequest.context:type_name -> minder.v1.ContextV2 + 135, // 70: minder.v1.CreateProfileRequest.profile:type_name -> minder.v1.Profile + 135, // 71: minder.v1.CreateProfileResponse.profile:type_name -> minder.v1.Profile + 135, // 72: minder.v1.UpdateProfileRequest.profile:type_name -> minder.v1.Profile + 135, // 73: minder.v1.UpdateProfileResponse.profile:type_name -> minder.v1.Profile + 111, // 74: minder.v1.PatchProfileRequest.context:type_name -> minder.v1.Context + 135, // 75: minder.v1.PatchProfileRequest.patch:type_name -> minder.v1.Profile + 239, // 76: minder.v1.PatchProfileRequest.update_mask:type_name -> google.protobuf.FieldMask + 135, // 77: minder.v1.PatchProfileResponse.profile:type_name -> minder.v1.Profile + 111, // 78: minder.v1.DeleteProfileRequest.context:type_name -> minder.v1.Context + 111, // 79: minder.v1.ListProfilesRequest.context:type_name -> minder.v1.Context + 135, // 80: minder.v1.ListProfilesResponse.profiles:type_name -> minder.v1.Profile + 111, // 81: minder.v1.GetProfileByIdRequest.context:type_name -> minder.v1.Context + 135, // 82: minder.v1.GetProfileByIdResponse.profile:type_name -> minder.v1.Profile + 111, // 83: minder.v1.GetProfileByNameRequest.context:type_name -> minder.v1.Context + 135, // 84: minder.v1.GetProfileByNameResponse.profile:type_name -> minder.v1.Profile + 237, // 85: minder.v1.ProfileStatus.last_updated:type_name -> google.protobuf.Timestamp + 237, // 86: minder.v1.EvalResultAlert.last_updated:type_name -> google.protobuf.Timestamp + 237, // 87: minder.v1.RuleEvaluationStatus.last_updated:type_name -> google.protobuf.Timestamp + 203, // 88: minder.v1.RuleEvaluationStatus.entity_info:type_name -> minder.v1.RuleEvaluationStatus.EntityInfoEntry + 237, // 89: minder.v1.RuleEvaluationStatus.remediation_last_updated:type_name -> google.protobuf.Timestamp + 95, // 90: minder.v1.RuleEvaluationStatus.alert:type_name -> minder.v1.EvalResultAlert + 133, // 91: minder.v1.RuleEvaluationStatus.severity:type_name -> minder.v1.Severity + 4, // 92: minder.v1.RuleEvaluationStatus.release_phase:type_name -> minder.v1.RuleTypeReleasePhase + 3, // 93: minder.v1.EntityTypedId.type:type_name -> minder.v1.Entity + 111, // 94: minder.v1.GetProfileStatusByNameRequest.context:type_name -> minder.v1.Context + 97, // 95: minder.v1.GetProfileStatusByNameRequest.entity:type_name -> minder.v1.EntityTypedId + 94, // 96: minder.v1.GetProfileStatusByNameResponse.profile_status:type_name -> minder.v1.ProfileStatus + 96, // 97: minder.v1.GetProfileStatusByNameResponse.rule_evaluation_status:type_name -> minder.v1.RuleEvaluationStatus + 111, // 98: minder.v1.GetProfileStatusByProjectRequest.context:type_name -> minder.v1.Context + 94, // 99: minder.v1.GetProfileStatusByProjectResponse.profile_status:type_name -> minder.v1.ProfileStatus + 204, // 100: minder.v1.AutoRegistration.entities:type_name -> minder.v1.AutoRegistration.EntitiesEntry + 103, // 101: minder.v1.ProviderConfig.auto_registration:type_name -> minder.v1.AutoRegistration + 111, // 102: minder.v1.ListRuleTypesRequest.context:type_name -> minder.v1.Context + 134, // 103: minder.v1.ListRuleTypesResponse.rule_types:type_name -> minder.v1.RuleType + 111, // 104: minder.v1.GetRuleTypeByNameRequest.context:type_name -> minder.v1.Context + 134, // 105: minder.v1.GetRuleTypeByNameResponse.rule_type:type_name -> minder.v1.RuleType + 111, // 106: minder.v1.GetRuleTypeByIdRequest.context:type_name -> minder.v1.Context + 134, // 107: minder.v1.GetRuleTypeByIdResponse.rule_type:type_name -> minder.v1.RuleType + 134, // 108: minder.v1.CreateRuleTypeRequest.rule_type:type_name -> minder.v1.RuleType + 134, // 109: minder.v1.CreateRuleTypeResponse.rule_type:type_name -> minder.v1.RuleType + 134, // 110: minder.v1.UpdateRuleTypeRequest.rule_type:type_name -> minder.v1.RuleType + 134, // 111: minder.v1.UpdateRuleTypeResponse.rule_type:type_name -> minder.v1.RuleType + 111, // 112: minder.v1.DeleteRuleTypeRequest.context:type_name -> minder.v1.Context + 111, // 113: minder.v1.ListEvaluationResultsRequest.context:type_name -> minder.v1.Context + 97, // 114: minder.v1.ListEvaluationResultsRequest.entity:type_name -> minder.v1.EntityTypedId + 206, // 115: minder.v1.ListEvaluationResultsResponse.entities:type_name -> minder.v1.ListEvaluationResultsResponse.EntityEvaluationResults + 207, // 116: minder.v1.RestType.fallback:type_name -> minder.v1.RestType.Fallback + 208, // 117: minder.v1.DiffType.ecosystems:type_name -> minder.v1.DiffType.Ecosystem + 209, // 118: minder.v1.DepsType.repo:type_name -> minder.v1.DepsType.RepoConfigs + 210, // 119: minder.v1.DepsType.pr:type_name -> minder.v1.DepsType.PullRequestConfigs + 9, // 120: minder.v1.Severity.value:type_name -> minder.v1.Severity.Value + 111, // 121: minder.v1.RuleType.context:type_name -> minder.v1.Context + 211, // 122: minder.v1.RuleType.def:type_name -> minder.v1.RuleType.Definition + 133, // 123: minder.v1.RuleType.severity:type_name -> minder.v1.Severity + 4, // 124: minder.v1.RuleType.release_phase:type_name -> minder.v1.RuleTypeReleasePhase + 111, // 125: minder.v1.Profile.context:type_name -> minder.v1.Context + 228, // 126: minder.v1.Profile.repository:type_name -> minder.v1.Profile.Rule + 228, // 127: minder.v1.Profile.build_environment:type_name -> minder.v1.Profile.Rule + 228, // 128: minder.v1.Profile.artifact:type_name -> minder.v1.Profile.Rule + 228, // 129: minder.v1.Profile.pull_request:type_name -> minder.v1.Profile.Rule + 228, // 130: minder.v1.Profile.release:type_name -> minder.v1.Profile.Rule + 228, // 131: minder.v1.Profile.pipeline_run:type_name -> minder.v1.Profile.Rule + 228, // 132: minder.v1.Profile.task_run:type_name -> minder.v1.Profile.Rule + 228, // 133: minder.v1.Profile.build:type_name -> minder.v1.Profile.Rule + 229, // 134: minder.v1.Profile.selection:type_name -> minder.v1.Profile.Selector + 33, // 135: minder.v1.ListProjectsResponse.projects:type_name -> minder.v1.Project + 111, // 136: minder.v1.CreateProjectRequest.context:type_name -> minder.v1.Context + 33, // 137: minder.v1.CreateProjectResponse.project:type_name -> minder.v1.Project + 111, // 138: minder.v1.DeleteProjectRequest.context:type_name -> minder.v1.Context + 111, // 139: minder.v1.UpdateProjectRequest.context:type_name -> minder.v1.Context + 33, // 140: minder.v1.UpdateProjectResponse.project:type_name -> minder.v1.Project + 111, // 141: minder.v1.PatchProjectRequest.context:type_name -> minder.v1.Context + 144, // 142: minder.v1.PatchProjectRequest.patch:type_name -> minder.v1.ProjectPatch + 239, // 143: minder.v1.PatchProjectRequest.update_mask:type_name -> google.protobuf.FieldMask + 33, // 144: minder.v1.PatchProjectResponse.project:type_name -> minder.v1.Project + 112, // 145: minder.v1.ListChildProjectsRequest.context:type_name -> minder.v1.ContextV2 + 33, // 146: minder.v1.ListChildProjectsResponse.projects:type_name -> minder.v1.Project + 97, // 147: minder.v1.CreateEntityReconciliationTaskRequest.entity:type_name -> minder.v1.EntityTypedId + 111, // 148: minder.v1.CreateEntityReconciliationTaskRequest.context:type_name -> minder.v1.Context + 111, // 149: minder.v1.ListRolesRequest.context:type_name -> minder.v1.Context + 161, // 150: minder.v1.ListRolesResponse.roles:type_name -> minder.v1.Role + 111, // 151: minder.v1.ListRoleAssignmentsRequest.context:type_name -> minder.v1.Context + 162, // 152: minder.v1.ListRoleAssignmentsResponse.role_assignments:type_name -> minder.v1.RoleAssignment + 167, // 153: minder.v1.ListRoleAssignmentsResponse.invitations:type_name -> minder.v1.Invitation + 111, // 154: minder.v1.AssignRoleRequest.context:type_name -> minder.v1.Context + 162, // 155: minder.v1.AssignRoleRequest.role_assignment:type_name -> minder.v1.RoleAssignment + 162, // 156: minder.v1.AssignRoleResponse.role_assignment:type_name -> minder.v1.RoleAssignment + 167, // 157: minder.v1.AssignRoleResponse.invitation:type_name -> minder.v1.Invitation + 111, // 158: minder.v1.UpdateRoleRequest.context:type_name -> minder.v1.Context + 162, // 159: minder.v1.UpdateRoleResponse.role_assignments:type_name -> minder.v1.RoleAssignment + 167, // 160: minder.v1.UpdateRoleResponse.invitations:type_name -> minder.v1.Invitation + 111, // 161: minder.v1.RemoveRoleRequest.context:type_name -> minder.v1.Context + 162, // 162: minder.v1.RemoveRoleRequest.role_assignment:type_name -> minder.v1.RoleAssignment + 162, // 163: minder.v1.RemoveRoleResponse.role_assignment:type_name -> minder.v1.RoleAssignment + 167, // 164: minder.v1.RemoveRoleResponse.invitation:type_name -> minder.v1.Invitation + 167, // 165: minder.v1.ListInvitationsResponse.invitations:type_name -> minder.v1.Invitation + 237, // 166: minder.v1.Invitation.created_at:type_name -> google.protobuf.Timestamp + 237, // 167: minder.v1.Invitation.expires_at:type_name -> google.protobuf.Timestamp + 111, // 168: minder.v1.GetProviderRequest.context:type_name -> minder.v1.Context + 185, // 169: minder.v1.GetProviderResponse.provider:type_name -> minder.v1.Provider + 111, // 170: minder.v1.ListProvidersRequest.context:type_name -> minder.v1.Context + 185, // 171: minder.v1.ListProvidersResponse.providers:type_name -> minder.v1.Provider + 111, // 172: minder.v1.CreateProviderRequest.context:type_name -> minder.v1.Context + 185, // 173: minder.v1.CreateProviderRequest.provider:type_name -> minder.v1.Provider + 185, // 174: minder.v1.CreateProviderResponse.provider:type_name -> minder.v1.Provider + 182, // 175: minder.v1.CreateProviderResponse.authorization:type_name -> minder.v1.AuthorizationParams + 111, // 176: minder.v1.DeleteProviderRequest.context:type_name -> minder.v1.Context + 111, // 177: minder.v1.DeleteProviderByIDRequest.context:type_name -> minder.v1.Context + 111, // 178: minder.v1.ListProviderClassesRequest.context:type_name -> minder.v1.Context + 111, // 179: minder.v1.PatchProviderRequest.context:type_name -> minder.v1.Context + 185, // 180: minder.v1.PatchProviderRequest.patch:type_name -> minder.v1.Provider + 239, // 181: minder.v1.PatchProviderRequest.update_mask:type_name -> google.protobuf.FieldMask + 185, // 182: minder.v1.PatchProviderResponse.provider:type_name -> minder.v1.Provider + 184, // 183: minder.v1.ProviderParameter.github_app:type_name -> minder.v1.GitHubAppParams + 5, // 184: minder.v1.Provider.implements:type_name -> minder.v1.ProviderType + 238, // 185: minder.v1.Provider.config:type_name -> google.protobuf.Struct + 7, // 186: minder.v1.Provider.auth_flows:type_name -> minder.v1.AuthorizationFlow + 183, // 187: minder.v1.Provider.parameters:type_name -> minder.v1.ProviderParameter + 111, // 188: minder.v1.GetEvaluationHistoryRequest.context:type_name -> minder.v1.Context + 111, // 189: minder.v1.ListEvaluationHistoryRequest.context:type_name -> minder.v1.Context + 237, // 190: minder.v1.ListEvaluationHistoryRequest.from:type_name -> google.protobuf.Timestamp + 237, // 191: minder.v1.ListEvaluationHistoryRequest.to:type_name -> google.protobuf.Timestamp + 11, // 192: minder.v1.ListEvaluationHistoryRequest.cursor:type_name -> minder.v1.Cursor + 190, // 193: minder.v1.GetEvaluationHistoryResponse.evaluation:type_name -> minder.v1.EvaluationHistory + 190, // 194: minder.v1.ListEvaluationHistoryResponse.data:type_name -> minder.v1.EvaluationHistory + 12, // 195: minder.v1.ListEvaluationHistoryResponse.page:type_name -> minder.v1.CursorPage + 191, // 196: minder.v1.EvaluationHistory.entity:type_name -> minder.v1.EvaluationHistoryEntity + 192, // 197: minder.v1.EvaluationHistory.rule:type_name -> minder.v1.EvaluationHistoryRule + 193, // 198: minder.v1.EvaluationHistory.status:type_name -> minder.v1.EvaluationHistoryStatus + 195, // 199: minder.v1.EvaluationHistory.alert:type_name -> minder.v1.EvaluationHistoryAlert + 194, // 200: minder.v1.EvaluationHistory.remediation:type_name -> minder.v1.EvaluationHistoryRemediation + 237, // 201: minder.v1.EvaluationHistory.evaluated_at:type_name -> google.protobuf.Timestamp + 3, // 202: minder.v1.EvaluationHistoryEntity.type:type_name -> minder.v1.Entity + 133, // 203: minder.v1.EvaluationHistoryRule.severity:type_name -> minder.v1.Severity + 112, // 204: minder.v1.EntityInstance.context:type_name -> minder.v1.ContextV2 + 3, // 205: minder.v1.EntityInstance.type:type_name -> minder.v1.Entity + 238, // 206: minder.v1.EntityInstance.properties:type_name -> google.protobuf.Struct + 112, // 207: minder.v1.UpstreamEntityRef.context:type_name -> minder.v1.ContextV2 + 3, // 208: minder.v1.UpstreamEntityRef.type:type_name -> minder.v1.Entity + 238, // 209: minder.v1.UpstreamEntityRef.properties:type_name -> google.protobuf.Struct + 112, // 210: minder.v1.DataSource.context:type_name -> minder.v1.ContextV2 + 199, // 211: minder.v1.DataSource.structured:type_name -> minder.v1.StructDataSource + 200, // 212: minder.v1.DataSource.rest:type_name -> minder.v1.RestDataSource + 231, // 213: minder.v1.StructDataSource.def:type_name -> minder.v1.StructDataSource.DefEntry + 234, // 214: minder.v1.RestDataSource.def:type_name -> minder.v1.RestDataSource.DefEntry + 102, // 215: minder.v1.AutoRegistration.EntitiesEntry.value:type_name -> minder.v1.EntityAutoRegistrationConfig + 94, // 216: minder.v1.ListEvaluationResultsResponse.EntityProfileEvaluationResults.profile_status:type_name -> minder.v1.ProfileStatus + 96, // 217: minder.v1.ListEvaluationResultsResponse.EntityProfileEvaluationResults.results:type_name -> minder.v1.RuleEvaluationStatus + 97, // 218: minder.v1.ListEvaluationResultsResponse.EntityEvaluationResults.entity:type_name -> minder.v1.EntityTypedId + 205, // 219: minder.v1.ListEvaluationResultsResponse.EntityEvaluationResults.profiles:type_name -> minder.v1.ListEvaluationResultsResponse.EntityProfileEvaluationResults + 238, // 220: minder.v1.RuleType.Definition.rule_schema:type_name -> google.protobuf.Struct + 238, // 221: minder.v1.RuleType.Definition.param_schema:type_name -> google.protobuf.Struct + 212, // 222: minder.v1.RuleType.Definition.ingest:type_name -> minder.v1.RuleType.Definition.Ingest + 213, // 223: minder.v1.RuleType.Definition.eval:type_name -> minder.v1.RuleType.Definition.Eval + 214, // 224: minder.v1.RuleType.Definition.remediate:type_name -> minder.v1.RuleType.Definition.Remediate + 215, // 225: minder.v1.RuleType.Definition.alert:type_name -> minder.v1.RuleType.Definition.Alert + 127, // 226: minder.v1.RuleType.Definition.Ingest.rest:type_name -> minder.v1.RestType + 128, // 227: minder.v1.RuleType.Definition.Ingest.builtin:type_name -> minder.v1.BuiltinType + 129, // 228: minder.v1.RuleType.Definition.Ingest.artifact:type_name -> minder.v1.ArtifactType + 130, // 229: minder.v1.RuleType.Definition.Ingest.git:type_name -> minder.v1.GitType + 131, // 230: minder.v1.RuleType.Definition.Ingest.diff:type_name -> minder.v1.DiffType + 132, // 231: minder.v1.RuleType.Definition.Ingest.deps:type_name -> minder.v1.DepsType + 216, // 232: minder.v1.RuleType.Definition.Eval.jq:type_name -> minder.v1.RuleType.Definition.Eval.JQComparison + 217, // 233: minder.v1.RuleType.Definition.Eval.rego:type_name -> minder.v1.RuleType.Definition.Eval.Rego + 218, // 234: minder.v1.RuleType.Definition.Eval.vulncheck:type_name -> minder.v1.RuleType.Definition.Eval.Vulncheck + 219, // 235: minder.v1.RuleType.Definition.Eval.trusty:type_name -> minder.v1.RuleType.Definition.Eval.Trusty + 220, // 236: minder.v1.RuleType.Definition.Eval.homoglyphs:type_name -> minder.v1.RuleType.Definition.Eval.Homoglyphs + 201, // 237: minder.v1.RuleType.Definition.Eval.data_sources:type_name -> minder.v1.DataSourceReference + 127, // 238: minder.v1.RuleType.Definition.Remediate.rest:type_name -> minder.v1.RestType + 222, // 239: minder.v1.RuleType.Definition.Remediate.gh_branch_protection:type_name -> minder.v1.RuleType.Definition.Remediate.GhBranchProtectionType + 223, // 240: minder.v1.RuleType.Definition.Remediate.pull_request:type_name -> minder.v1.RuleType.Definition.Remediate.PullRequestRemediation + 226, // 241: minder.v1.RuleType.Definition.Alert.security_advisory:type_name -> minder.v1.RuleType.Definition.Alert.AlertTypeSA + 227, // 242: minder.v1.RuleType.Definition.Alert.pull_request_comment:type_name -> minder.v1.RuleType.Definition.Alert.AlertTypePRComment + 221, // 243: minder.v1.RuleType.Definition.Eval.JQComparison.ingested:type_name -> minder.v1.RuleType.Definition.Eval.JQComparison.Operator + 221, // 244: minder.v1.RuleType.Definition.Eval.JQComparison.profile:type_name -> minder.v1.RuleType.Definition.Eval.JQComparison.Operator + 240, // 245: minder.v1.RuleType.Definition.Eval.JQComparison.constant:type_name -> google.protobuf.Value + 224, // 246: minder.v1.RuleType.Definition.Remediate.PullRequestRemediation.contents:type_name -> minder.v1.RuleType.Definition.Remediate.PullRequestRemediation.Content + 238, // 247: minder.v1.RuleType.Definition.Remediate.PullRequestRemediation.params:type_name -> google.protobuf.Struct + 225, // 248: minder.v1.RuleType.Definition.Remediate.PullRequestRemediation.actions_replace_tags_with_sha:type_name -> minder.v1.RuleType.Definition.Remediate.PullRequestRemediation.ActionsReplaceTagsWithSha + 238, // 249: minder.v1.Profile.Rule.params:type_name -> google.protobuf.Struct + 238, // 250: minder.v1.Profile.Rule.def:type_name -> google.protobuf.Struct + 232, // 251: minder.v1.StructDataSource.Def.path:type_name -> minder.v1.StructDataSource.Def.Path + 230, // 252: minder.v1.StructDataSource.DefEntry.value:type_name -> minder.v1.StructDataSource.Def + 235, // 253: minder.v1.RestDataSource.Def.headers:type_name -> minder.v1.RestDataSource.Def.HeadersEntry + 238, // 254: minder.v1.RestDataSource.Def.bodyobj:type_name -> google.protobuf.Struct + 236, // 255: minder.v1.RestDataSource.Def.fallback:type_name -> minder.v1.RestDataSource.Def.Fallback + 238, // 256: minder.v1.RestDataSource.Def.input_schema:type_name -> google.protobuf.Struct + 233, // 257: minder.v1.RestDataSource.DefEntry.value:type_name -> minder.v1.RestDataSource.Def + 241, // 258: minder.v1.name:extendee -> google.protobuf.EnumValueOptions + 242, // 259: minder.v1.rpc_options:extendee -> google.protobuf.MethodOptions + 10, // 260: minder.v1.rpc_options:type_name -> minder.v1.RpcOptions + 27, // 261: minder.v1.HealthService.CheckHealth:input_type -> minder.v1.CheckHealthRequest + 13, // 262: minder.v1.ArtifactService.ListArtifacts:input_type -> minder.v1.ListArtifactsRequest + 17, // 263: minder.v1.ArtifactService.GetArtifactById:input_type -> minder.v1.GetArtifactByIdRequest + 19, // 264: minder.v1.ArtifactService.GetArtifactByName:input_type -> minder.v1.GetArtifactByNameRequest + 29, // 265: minder.v1.OAuthService.GetAuthorizationURL:input_type -> minder.v1.GetAuthorizationURLRequest + 31, // 266: minder.v1.OAuthService.StoreProviderToken:input_type -> minder.v1.StoreProviderTokenRequest + 54, // 267: minder.v1.OAuthService.VerifyProviderTokenFrom:input_type -> minder.v1.VerifyProviderTokenFromRequest + 56, // 268: minder.v1.OAuthService.VerifyProviderCredential:input_type -> minder.v1.VerifyProviderCredentialRequest + 39, // 269: minder.v1.RepositoryService.RegisterRepository:input_type -> minder.v1.RegisterRepositoryRequest + 34, // 270: minder.v1.RepositoryService.ListRemoteRepositoriesFromProvider:input_type -> minder.v1.ListRemoteRepositoriesFromProviderRequest + 50, // 271: minder.v1.RepositoryService.ListRepositories:input_type -> minder.v1.ListRepositoriesRequest + 42, // 272: minder.v1.RepositoryService.GetRepositoryById:input_type -> minder.v1.GetRepositoryByIdRequest + 46, // 273: minder.v1.RepositoryService.GetRepositoryByName:input_type -> minder.v1.GetRepositoryByNameRequest + 44, // 274: minder.v1.RepositoryService.DeleteRepositoryById:input_type -> minder.v1.DeleteRepositoryByIdRequest + 48, // 275: minder.v1.RepositoryService.DeleteRepositoryByName:input_type -> minder.v1.DeleteRepositoryByNameRequest + 58, // 276: minder.v1.UserService.CreateUser:input_type -> minder.v1.CreateUserRequest + 60, // 277: minder.v1.UserService.DeleteUser:input_type -> minder.v1.DeleteUserRequest + 64, // 278: minder.v1.UserService.GetUser:input_type -> minder.v1.GetUserRequest + 163, // 279: minder.v1.UserService.ListInvitations:input_type -> minder.v1.ListInvitationsRequest + 165, // 280: minder.v1.UserService.ResolveInvitation:input_type -> minder.v1.ResolveInvitationRequest + 80, // 281: minder.v1.ProfileService.CreateProfile:input_type -> minder.v1.CreateProfileRequest + 82, // 282: minder.v1.ProfileService.UpdateProfile:input_type -> minder.v1.UpdateProfileRequest + 84, // 283: minder.v1.ProfileService.PatchProfile:input_type -> minder.v1.PatchProfileRequest + 86, // 284: minder.v1.ProfileService.DeleteProfile:input_type -> minder.v1.DeleteProfileRequest + 88, // 285: minder.v1.ProfileService.ListProfiles:input_type -> minder.v1.ListProfilesRequest + 90, // 286: minder.v1.ProfileService.GetProfileById:input_type -> minder.v1.GetProfileByIdRequest + 92, // 287: minder.v1.ProfileService.GetProfileByName:input_type -> minder.v1.GetProfileByNameRequest + 98, // 288: minder.v1.ProfileService.GetProfileStatusByName:input_type -> minder.v1.GetProfileStatusByNameRequest + 100, // 289: minder.v1.ProfileService.GetProfileStatusByProject:input_type -> minder.v1.GetProfileStatusByProjectRequest + 66, // 290: minder.v1.DataSourceService.CreateDataSource:input_type -> minder.v1.CreateDataSourceRequest + 68, // 291: minder.v1.DataSourceService.GetDataSourceById:input_type -> minder.v1.GetDataSourceByIdRequest + 70, // 292: minder.v1.DataSourceService.GetDataSourceByName:input_type -> minder.v1.GetDataSourceByNameRequest + 72, // 293: minder.v1.DataSourceService.ListDataSources:input_type -> minder.v1.ListDataSourcesRequest + 74, // 294: minder.v1.DataSourceService.UpdateDataSource:input_type -> minder.v1.UpdateDataSourceRequest + 76, // 295: minder.v1.DataSourceService.DeleteDataSourceById:input_type -> minder.v1.DeleteDataSourceByIdRequest + 78, // 296: minder.v1.DataSourceService.DeleteDataSourceByName:input_type -> minder.v1.DeleteDataSourceByNameRequest + 113, // 297: minder.v1.RuleTypeService.ListRuleTypes:input_type -> minder.v1.ListRuleTypesRequest + 115, // 298: minder.v1.RuleTypeService.GetRuleTypeByName:input_type -> minder.v1.GetRuleTypeByNameRequest + 117, // 299: minder.v1.RuleTypeService.GetRuleTypeById:input_type -> minder.v1.GetRuleTypeByIdRequest + 119, // 300: minder.v1.RuleTypeService.CreateRuleType:input_type -> minder.v1.CreateRuleTypeRequest + 121, // 301: minder.v1.RuleTypeService.UpdateRuleType:input_type -> minder.v1.UpdateRuleTypeRequest + 123, // 302: minder.v1.RuleTypeService.DeleteRuleType:input_type -> minder.v1.DeleteRuleTypeRequest + 125, // 303: minder.v1.EvalResultsService.ListEvaluationResults:input_type -> minder.v1.ListEvaluationResultsRequest + 187, // 304: minder.v1.EvalResultsService.ListEvaluationHistory:input_type -> minder.v1.ListEvaluationHistoryRequest + 186, // 305: minder.v1.EvalResultsService.GetEvaluationHistory:input_type -> minder.v1.GetEvaluationHistoryRequest + 151, // 306: minder.v1.PermissionsService.ListRoles:input_type -> minder.v1.ListRolesRequest + 153, // 307: minder.v1.PermissionsService.ListRoleAssignments:input_type -> minder.v1.ListRoleAssignmentsRequest + 155, // 308: minder.v1.PermissionsService.AssignRole:input_type -> minder.v1.AssignRoleRequest + 157, // 309: minder.v1.PermissionsService.UpdateRole:input_type -> minder.v1.UpdateRoleRequest + 159, // 310: minder.v1.PermissionsService.RemoveRole:input_type -> minder.v1.RemoveRoleRequest + 136, // 311: minder.v1.ProjectsService.ListProjects:input_type -> minder.v1.ListProjectsRequest + 138, // 312: minder.v1.ProjectsService.CreateProject:input_type -> minder.v1.CreateProjectRequest + 147, // 313: minder.v1.ProjectsService.ListChildProjects:input_type -> minder.v1.ListChildProjectsRequest + 140, // 314: minder.v1.ProjectsService.DeleteProject:input_type -> minder.v1.DeleteProjectRequest + 142, // 315: minder.v1.ProjectsService.UpdateProject:input_type -> minder.v1.UpdateProjectRequest + 145, // 316: minder.v1.ProjectsService.PatchProject:input_type -> minder.v1.PatchProjectRequest + 149, // 317: minder.v1.ProjectsService.CreateEntityReconciliationTask:input_type -> minder.v1.CreateEntityReconciliationTaskRequest + 180, // 318: minder.v1.ProvidersService.PatchProvider:input_type -> minder.v1.PatchProviderRequest + 168, // 319: minder.v1.ProvidersService.GetProvider:input_type -> minder.v1.GetProviderRequest + 170, // 320: minder.v1.ProvidersService.ListProviders:input_type -> minder.v1.ListProvidersRequest + 172, // 321: minder.v1.ProvidersService.CreateProvider:input_type -> minder.v1.CreateProviderRequest + 174, // 322: minder.v1.ProvidersService.DeleteProvider:input_type -> minder.v1.DeleteProviderRequest + 176, // 323: minder.v1.ProvidersService.DeleteProviderByID:input_type -> minder.v1.DeleteProviderByIDRequest + 178, // 324: minder.v1.ProvidersService.ListProviderClasses:input_type -> minder.v1.ListProviderClassesRequest + 52, // 325: minder.v1.ProvidersService.ReconcileEntityRegistration:input_type -> minder.v1.ReconcileEntityRegistrationRequest + 25, // 326: minder.v1.InviteService.GetInviteDetails:input_type -> minder.v1.GetInviteDetailsRequest + 28, // 327: minder.v1.HealthService.CheckHealth:output_type -> minder.v1.CheckHealthResponse + 14, // 328: minder.v1.ArtifactService.ListArtifacts:output_type -> minder.v1.ListArtifactsResponse + 18, // 329: minder.v1.ArtifactService.GetArtifactById:output_type -> minder.v1.GetArtifactByIdResponse + 20, // 330: minder.v1.ArtifactService.GetArtifactByName:output_type -> minder.v1.GetArtifactByNameResponse + 30, // 331: minder.v1.OAuthService.GetAuthorizationURL:output_type -> minder.v1.GetAuthorizationURLResponse + 32, // 332: minder.v1.OAuthService.StoreProviderToken:output_type -> minder.v1.StoreProviderTokenResponse + 55, // 333: minder.v1.OAuthService.VerifyProviderTokenFrom:output_type -> minder.v1.VerifyProviderTokenFromResponse + 57, // 334: minder.v1.OAuthService.VerifyProviderCredential:output_type -> minder.v1.VerifyProviderCredentialResponse + 41, // 335: minder.v1.RepositoryService.RegisterRepository:output_type -> minder.v1.RegisterRepositoryResponse + 35, // 336: minder.v1.RepositoryService.ListRemoteRepositoriesFromProvider:output_type -> minder.v1.ListRemoteRepositoriesFromProviderResponse + 51, // 337: minder.v1.RepositoryService.ListRepositories:output_type -> minder.v1.ListRepositoriesResponse + 43, // 338: minder.v1.RepositoryService.GetRepositoryById:output_type -> minder.v1.GetRepositoryByIdResponse + 47, // 339: minder.v1.RepositoryService.GetRepositoryByName:output_type -> minder.v1.GetRepositoryByNameResponse + 45, // 340: minder.v1.RepositoryService.DeleteRepositoryById:output_type -> minder.v1.DeleteRepositoryByIdResponse + 49, // 341: minder.v1.RepositoryService.DeleteRepositoryByName:output_type -> minder.v1.DeleteRepositoryByNameResponse + 59, // 342: minder.v1.UserService.CreateUser:output_type -> minder.v1.CreateUserResponse + 61, // 343: minder.v1.UserService.DeleteUser:output_type -> minder.v1.DeleteUserResponse + 65, // 344: minder.v1.UserService.GetUser:output_type -> minder.v1.GetUserResponse + 164, // 345: minder.v1.UserService.ListInvitations:output_type -> minder.v1.ListInvitationsResponse + 166, // 346: minder.v1.UserService.ResolveInvitation:output_type -> minder.v1.ResolveInvitationResponse + 81, // 347: minder.v1.ProfileService.CreateProfile:output_type -> minder.v1.CreateProfileResponse + 83, // 348: minder.v1.ProfileService.UpdateProfile:output_type -> minder.v1.UpdateProfileResponse + 85, // 349: minder.v1.ProfileService.PatchProfile:output_type -> minder.v1.PatchProfileResponse + 87, // 350: minder.v1.ProfileService.DeleteProfile:output_type -> minder.v1.DeleteProfileResponse + 89, // 351: minder.v1.ProfileService.ListProfiles:output_type -> minder.v1.ListProfilesResponse + 91, // 352: minder.v1.ProfileService.GetProfileById:output_type -> minder.v1.GetProfileByIdResponse + 93, // 353: minder.v1.ProfileService.GetProfileByName:output_type -> minder.v1.GetProfileByNameResponse + 99, // 354: minder.v1.ProfileService.GetProfileStatusByName:output_type -> minder.v1.GetProfileStatusByNameResponse + 101, // 355: minder.v1.ProfileService.GetProfileStatusByProject:output_type -> minder.v1.GetProfileStatusByProjectResponse + 67, // 356: minder.v1.DataSourceService.CreateDataSource:output_type -> minder.v1.CreateDataSourceResponse + 69, // 357: minder.v1.DataSourceService.GetDataSourceById:output_type -> minder.v1.GetDataSourceByIdResponse + 71, // 358: minder.v1.DataSourceService.GetDataSourceByName:output_type -> minder.v1.GetDataSourceByNameResponse + 73, // 359: minder.v1.DataSourceService.ListDataSources:output_type -> minder.v1.ListDataSourcesResponse + 75, // 360: minder.v1.DataSourceService.UpdateDataSource:output_type -> minder.v1.UpdateDataSourceResponse + 77, // 361: minder.v1.DataSourceService.DeleteDataSourceById:output_type -> minder.v1.DeleteDataSourceByIdResponse + 79, // 362: minder.v1.DataSourceService.DeleteDataSourceByName:output_type -> minder.v1.DeleteDataSourceByNameResponse + 114, // 363: minder.v1.RuleTypeService.ListRuleTypes:output_type -> minder.v1.ListRuleTypesResponse + 116, // 364: minder.v1.RuleTypeService.GetRuleTypeByName:output_type -> minder.v1.GetRuleTypeByNameResponse + 118, // 365: minder.v1.RuleTypeService.GetRuleTypeById:output_type -> minder.v1.GetRuleTypeByIdResponse + 120, // 366: minder.v1.RuleTypeService.CreateRuleType:output_type -> minder.v1.CreateRuleTypeResponse + 122, // 367: minder.v1.RuleTypeService.UpdateRuleType:output_type -> minder.v1.UpdateRuleTypeResponse + 124, // 368: minder.v1.RuleTypeService.DeleteRuleType:output_type -> minder.v1.DeleteRuleTypeResponse + 126, // 369: minder.v1.EvalResultsService.ListEvaluationResults:output_type -> minder.v1.ListEvaluationResultsResponse + 189, // 370: minder.v1.EvalResultsService.ListEvaluationHistory:output_type -> minder.v1.ListEvaluationHistoryResponse + 188, // 371: minder.v1.EvalResultsService.GetEvaluationHistory:output_type -> minder.v1.GetEvaluationHistoryResponse + 152, // 372: minder.v1.PermissionsService.ListRoles:output_type -> minder.v1.ListRolesResponse + 154, // 373: minder.v1.PermissionsService.ListRoleAssignments:output_type -> minder.v1.ListRoleAssignmentsResponse + 156, // 374: minder.v1.PermissionsService.AssignRole:output_type -> minder.v1.AssignRoleResponse + 158, // 375: minder.v1.PermissionsService.UpdateRole:output_type -> minder.v1.UpdateRoleResponse + 160, // 376: minder.v1.PermissionsService.RemoveRole:output_type -> minder.v1.RemoveRoleResponse + 137, // 377: minder.v1.ProjectsService.ListProjects:output_type -> minder.v1.ListProjectsResponse + 139, // 378: minder.v1.ProjectsService.CreateProject:output_type -> minder.v1.CreateProjectResponse + 148, // 379: minder.v1.ProjectsService.ListChildProjects:output_type -> minder.v1.ListChildProjectsResponse + 141, // 380: minder.v1.ProjectsService.DeleteProject:output_type -> minder.v1.DeleteProjectResponse + 143, // 381: minder.v1.ProjectsService.UpdateProject:output_type -> minder.v1.UpdateProjectResponse + 146, // 382: minder.v1.ProjectsService.PatchProject:output_type -> minder.v1.PatchProjectResponse + 150, // 383: minder.v1.ProjectsService.CreateEntityReconciliationTask:output_type -> minder.v1.CreateEntityReconciliationTaskResponse + 181, // 384: minder.v1.ProvidersService.PatchProvider:output_type -> minder.v1.PatchProviderResponse + 169, // 385: minder.v1.ProvidersService.GetProvider:output_type -> minder.v1.GetProviderResponse + 171, // 386: minder.v1.ProvidersService.ListProviders:output_type -> minder.v1.ListProvidersResponse + 173, // 387: minder.v1.ProvidersService.CreateProvider:output_type -> minder.v1.CreateProviderResponse + 175, // 388: minder.v1.ProvidersService.DeleteProvider:output_type -> minder.v1.DeleteProviderResponse + 177, // 389: minder.v1.ProvidersService.DeleteProviderByID:output_type -> minder.v1.DeleteProviderByIDResponse + 179, // 390: minder.v1.ProvidersService.ListProviderClasses:output_type -> minder.v1.ListProviderClassesResponse + 53, // 391: minder.v1.ProvidersService.ReconcileEntityRegistration:output_type -> minder.v1.ReconcileEntityRegistrationResponse + 26, // 392: minder.v1.InviteService.GetInviteDetails:output_type -> minder.v1.GetInviteDetailsResponse + 327, // [327:393] is the sub-list for method output_type + 261, // [261:327] is the sub-list for method input_type + 260, // [260:261] is the sub-list for extension type_name + 258, // [258:260] is the sub-list for extension extendee + 0, // [0:258] is the sub-list for field type_name } func init() { file_minder_v1_minder_proto_init() } @@ -15910,49 +17677,62 @@ func file_minder_v1_minder_proto_init() { if File_minder_v1_minder_proto != nil { return } - file_minder_v1_minder_proto_msgTypes[20].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[22].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[29].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[57].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[74].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[80].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[82].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[83].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[84].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[85].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[87].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[88].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[89].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[103].OneofWrappers = []any{ + file_minder_v1_minder_proto_msgTypes[19].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[21].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[28].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[55].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[86].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[92].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[94].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[95].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[96].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[97].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[99].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[100].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[101].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[115].OneofWrappers = []any{ (*ListEvaluationResultsRequest_Profile)(nil), (*ListEvaluationResultsRequest_LabelFilter)(nil), } - file_minder_v1_minder_proto_msgTypes[105].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[111].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[112].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[121].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[139].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[162].OneofWrappers = []any{ + file_minder_v1_minder_proto_msgTypes[117].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[122].OneofWrappers = []any{ + (*DepsType_Repo)(nil), + (*DepsType_Pr)(nil), + } + file_minder_v1_minder_proto_msgTypes[124].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[125].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[134].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[152].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[173].OneofWrappers = []any{ (*ProviderParameter_GithubApp)(nil), } - file_minder_v1_minder_proto_msgTypes[177].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[184].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[185].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[186].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[187].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[188].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[190].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[196].OneofWrappers = []any{} - file_minder_v1_minder_proto_msgTypes[197].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[188].OneofWrappers = []any{ + (*DataSource_Structured)(nil), + (*DataSource_Rest)(nil), + } + file_minder_v1_minder_proto_msgTypes[192].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[201].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[202].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[203].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[204].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[205].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[207].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[213].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[214].OneofWrappers = []any{} + file_minder_v1_minder_proto_msgTypes[223].OneofWrappers = []any{ + (*RestDataSource_Def_Bodyobj)(nil), + (*RestDataSource_Def_Bodystr)(nil), + (*RestDataSource_Def_BodyFromField)(nil), + } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_minder_v1_minder_proto_rawDesc, NumEnums: 10, - NumMessages: 202, + NumMessages: 227, NumExtensions: 2, - NumServices: 12, + NumServices: 13, }, GoTypes: file_minder_v1_minder_proto_goTypes, DependencyIndexes: file_minder_v1_minder_proto_depIdxs, diff --git a/pkg/api/protobuf/go/minder/v1/minder.pb.gw.go b/pkg/api/protobuf/go/minder/v1/minder.pb.gw.go index 8345878202..a2ce351311 100644 --- a/pkg/api/protobuf/go/minder/v1/minder.pb.gw.go +++ b/pkg/api/protobuf/go/minder/v1/minder.pb.gw.go @@ -10,6 +10,7 @@ package v1 import ( "context" + "errors" "io" "net/http" @@ -24,1568 +25,1213 @@ import ( ) // Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = metadata.Join +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) func request_HealthService_CheckHealth_0(ctx context.Context, marshaler runtime.Marshaler, client HealthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CheckHealthRequest - var metadata runtime.ServerMetadata - + var ( + protoReq CheckHealthRequest + metadata runtime.ServerMetadata + ) msg, err := client.CheckHealth(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_HealthService_CheckHealth_0(ctx context.Context, marshaler runtime.Marshaler, server HealthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CheckHealthRequest - var metadata runtime.ServerMetadata - + var ( + protoReq CheckHealthRequest + metadata runtime.ServerMetadata + ) msg, err := server.CheckHealth(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_ArtifactService_ListArtifacts_0 = &utilities.DoubleArray{Encoding: map[string]int{"provider": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_ArtifactService_ListArtifacts_0 = &utilities.DoubleArray{Encoding: map[string]int{"provider": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_ArtifactService_ListArtifacts_0(ctx context.Context, marshaler runtime.Marshaler, client ArtifactServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListArtifactsRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq ListArtifactsRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["provider"] + val, ok := pathParams["provider"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "provider") } - protoReq.Provider, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "provider", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ArtifactService_ListArtifacts_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListArtifacts(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ArtifactService_ListArtifacts_0(ctx context.Context, marshaler runtime.Marshaler, server ArtifactServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListArtifactsRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq ListArtifactsRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["provider"] + val, ok := pathParams["provider"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "provider") } - protoReq.Provider, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "provider", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ArtifactService_ListArtifacts_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListArtifacts(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_ArtifactService_ListArtifacts_1 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_ArtifactService_ListArtifacts_1 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_ArtifactService_ListArtifacts_1(ctx context.Context, marshaler runtime.Marshaler, client ArtifactServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListArtifactsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListArtifactsRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ArtifactService_ListArtifacts_1); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListArtifacts(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ArtifactService_ListArtifacts_1(ctx context.Context, marshaler runtime.Marshaler, server ArtifactServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListArtifactsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListArtifactsRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ArtifactService_ListArtifacts_1); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListArtifacts(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_ArtifactService_GetArtifactById_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_ArtifactService_GetArtifactById_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_ArtifactService_GetArtifactById_0(ctx context.Context, marshaler runtime.Marshaler, client ArtifactServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetArtifactByIdRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetArtifactByIdRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ArtifactService_GetArtifactById_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetArtifactById(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ArtifactService_GetArtifactById_0(ctx context.Context, marshaler runtime.Marshaler, server ArtifactServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetArtifactByIdRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetArtifactByIdRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ArtifactService_GetArtifactById_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetArtifactById(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_ArtifactService_GetArtifactByName_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_ArtifactService_GetArtifactByName_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_ArtifactService_GetArtifactByName_0(ctx context.Context, marshaler runtime.Marshaler, client ArtifactServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetArtifactByNameRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetArtifactByNameRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["name"] + val, ok := pathParams["name"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Name, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ArtifactService_GetArtifactByName_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetArtifactByName(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ArtifactService_GetArtifactByName_0(ctx context.Context, marshaler runtime.Marshaler, server ArtifactServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetArtifactByNameRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetArtifactByNameRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["name"] + val, ok := pathParams["name"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Name, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ArtifactService_GetArtifactByName_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetArtifactByName(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_OAuthService_GetAuthorizationURL_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_OAuthService_GetAuthorizationURL_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_OAuthService_GetAuthorizationURL_0(ctx context.Context, marshaler runtime.Marshaler, client OAuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetAuthorizationURLRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetAuthorizationURLRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_OAuthService_GetAuthorizationURL_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetAuthorizationURL(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_OAuthService_GetAuthorizationURL_0(ctx context.Context, marshaler runtime.Marshaler, server OAuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetAuthorizationURLRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetAuthorizationURLRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_OAuthService_GetAuthorizationURL_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetAuthorizationURL(ctx, &protoReq) return msg, metadata, err - } func request_OAuthService_StoreProviderToken_0(ctx context.Context, marshaler runtime.Marshaler, client OAuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq StoreProviderTokenRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq StoreProviderTokenRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["provider"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["provider"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "provider") } - protoReq.Provider, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "provider", err) } - msg, err := client.StoreProviderToken(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_OAuthService_StoreProviderToken_0(ctx context.Context, marshaler runtime.Marshaler, server OAuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq StoreProviderTokenRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq StoreProviderTokenRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["provider"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["provider"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "provider") } - protoReq.Provider, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "provider", err) } - msg, err := server.StoreProviderToken(ctx, &protoReq) return msg, metadata, err - } func request_OAuthService_StoreProviderToken_1(ctx context.Context, marshaler runtime.Marshaler, client OAuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq StoreProviderTokenRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq StoreProviderTokenRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.StoreProviderToken(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_OAuthService_StoreProviderToken_1(ctx context.Context, marshaler runtime.Marshaler, server OAuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq StoreProviderTokenRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq StoreProviderTokenRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.StoreProviderToken(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_OAuthService_VerifyProviderTokenFrom_0 = &utilities.DoubleArray{Encoding: map[string]int{"provider": 0, "timestamp": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} -) +var filter_OAuthService_VerifyProviderTokenFrom_0 = &utilities.DoubleArray{Encoding: map[string]int{"provider": 0, "timestamp": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} func request_OAuthService_VerifyProviderTokenFrom_0(ctx context.Context, marshaler runtime.Marshaler, client OAuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq VerifyProviderTokenFromRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq VerifyProviderTokenFromRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["provider"] + val, ok := pathParams["provider"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "provider") } - protoReq.Provider, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "provider", err) } - val, ok = pathParams["timestamp"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "timestamp") } - protoReq.Timestamp, err = runtime.Timestamp(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "timestamp", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_OAuthService_VerifyProviderTokenFrom_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.VerifyProviderTokenFrom(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_OAuthService_VerifyProviderTokenFrom_0(ctx context.Context, marshaler runtime.Marshaler, server OAuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq VerifyProviderTokenFromRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq VerifyProviderTokenFromRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["provider"] + val, ok := pathParams["provider"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "provider") } - protoReq.Provider, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "provider", err) } - val, ok = pathParams["timestamp"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "timestamp") } - protoReq.Timestamp, err = runtime.Timestamp(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "timestamp", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_OAuthService_VerifyProviderTokenFrom_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.VerifyProviderTokenFrom(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_OAuthService_VerifyProviderTokenFrom_1 = &utilities.DoubleArray{Encoding: map[string]int{"timestamp": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_OAuthService_VerifyProviderTokenFrom_1 = &utilities.DoubleArray{Encoding: map[string]int{"timestamp": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_OAuthService_VerifyProviderTokenFrom_1(ctx context.Context, marshaler runtime.Marshaler, client OAuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq VerifyProviderTokenFromRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq VerifyProviderTokenFromRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["timestamp"] + val, ok := pathParams["timestamp"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "timestamp") } - protoReq.Timestamp, err = runtime.Timestamp(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "timestamp", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_OAuthService_VerifyProviderTokenFrom_1); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.VerifyProviderTokenFrom(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_OAuthService_VerifyProviderTokenFrom_1(ctx context.Context, marshaler runtime.Marshaler, server OAuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq VerifyProviderTokenFromRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq VerifyProviderTokenFromRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["timestamp"] + val, ok := pathParams["timestamp"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "timestamp") } - protoReq.Timestamp, err = runtime.Timestamp(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "timestamp", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_OAuthService_VerifyProviderTokenFrom_1); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.VerifyProviderTokenFrom(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_OAuthService_VerifyProviderCredential_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_OAuthService_VerifyProviderCredential_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_OAuthService_VerifyProviderCredential_0(ctx context.Context, marshaler runtime.Marshaler, client OAuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq VerifyProviderCredentialRequest - var metadata runtime.ServerMetadata - + var ( + protoReq VerifyProviderCredentialRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_OAuthService_VerifyProviderCredential_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.VerifyProviderCredential(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_OAuthService_VerifyProviderCredential_0(ctx context.Context, marshaler runtime.Marshaler, server OAuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq VerifyProviderCredentialRequest - var metadata runtime.ServerMetadata - + var ( + protoReq VerifyProviderCredentialRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_OAuthService_VerifyProviderCredential_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.VerifyProviderCredential(ctx, &protoReq) return msg, metadata, err - } func request_RepositoryService_RegisterRepository_0(ctx context.Context, marshaler runtime.Marshaler, client RepositoryServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq RegisterRepositoryRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq RegisterRepositoryRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["provider"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["provider"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "provider") } - protoReq.Provider, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "provider", err) } - msg, err := client.RegisterRepository(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RepositoryService_RegisterRepository_0(ctx context.Context, marshaler runtime.Marshaler, server RepositoryServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq RegisterRepositoryRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq RegisterRepositoryRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["provider"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["provider"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "provider") } - protoReq.Provider, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "provider", err) } - msg, err := server.RegisterRepository(ctx, &protoReq) return msg, metadata, err - } func request_RepositoryService_RegisterRepository_1(ctx context.Context, marshaler runtime.Marshaler, client RepositoryServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq RegisterRepositoryRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq RegisterRepositoryRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.RegisterRepository(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RepositoryService_RegisterRepository_1(ctx context.Context, marshaler runtime.Marshaler, server RepositoryServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq RegisterRepositoryRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq RegisterRepositoryRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.RegisterRepository(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_RepositoryService_ListRemoteRepositoriesFromProvider_0 = &utilities.DoubleArray{Encoding: map[string]int{"provider": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_RepositoryService_ListRemoteRepositoriesFromProvider_0 = &utilities.DoubleArray{Encoding: map[string]int{"provider": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_RepositoryService_ListRemoteRepositoriesFromProvider_0(ctx context.Context, marshaler runtime.Marshaler, client RepositoryServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListRemoteRepositoriesFromProviderRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq ListRemoteRepositoriesFromProviderRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["provider"] + val, ok := pathParams["provider"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "provider") } - protoReq.Provider, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "provider", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RepositoryService_ListRemoteRepositoriesFromProvider_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListRemoteRepositoriesFromProvider(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RepositoryService_ListRemoteRepositoriesFromProvider_0(ctx context.Context, marshaler runtime.Marshaler, server RepositoryServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListRemoteRepositoriesFromProviderRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq ListRemoteRepositoriesFromProviderRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["provider"] + val, ok := pathParams["provider"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "provider") } - protoReq.Provider, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "provider", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RepositoryService_ListRemoteRepositoriesFromProvider_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListRemoteRepositoriesFromProvider(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_RepositoryService_ListRemoteRepositoriesFromProvider_1 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_RepositoryService_ListRemoteRepositoriesFromProvider_1 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_RepositoryService_ListRemoteRepositoriesFromProvider_1(ctx context.Context, marshaler runtime.Marshaler, client RepositoryServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListRemoteRepositoriesFromProviderRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListRemoteRepositoriesFromProviderRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RepositoryService_ListRemoteRepositoriesFromProvider_1); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListRemoteRepositoriesFromProvider(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RepositoryService_ListRemoteRepositoriesFromProvider_1(ctx context.Context, marshaler runtime.Marshaler, server RepositoryServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListRemoteRepositoriesFromProviderRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListRemoteRepositoriesFromProviderRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RepositoryService_ListRemoteRepositoriesFromProvider_1); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListRemoteRepositoriesFromProvider(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_RepositoryService_ListRepositories_0 = &utilities.DoubleArray{Encoding: map[string]int{"provider": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_RepositoryService_ListRepositories_0 = &utilities.DoubleArray{Encoding: map[string]int{"provider": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_RepositoryService_ListRepositories_0(ctx context.Context, marshaler runtime.Marshaler, client RepositoryServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListRepositoriesRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq ListRepositoriesRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["provider"] + val, ok := pathParams["provider"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "provider") } - protoReq.Provider, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "provider", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RepositoryService_ListRepositories_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListRepositories(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RepositoryService_ListRepositories_0(ctx context.Context, marshaler runtime.Marshaler, server RepositoryServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListRepositoriesRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq ListRepositoriesRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["provider"] + val, ok := pathParams["provider"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "provider") } - protoReq.Provider, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "provider", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RepositoryService_ListRepositories_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListRepositories(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_RepositoryService_ListRepositories_1 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_RepositoryService_ListRepositories_1 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_RepositoryService_ListRepositories_1(ctx context.Context, marshaler runtime.Marshaler, client RepositoryServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListRepositoriesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListRepositoriesRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RepositoryService_ListRepositories_1); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListRepositories(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RepositoryService_ListRepositories_1(ctx context.Context, marshaler runtime.Marshaler, server RepositoryServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListRepositoriesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListRepositoriesRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RepositoryService_ListRepositories_1); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListRepositories(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_RepositoryService_GetRepositoryById_0 = &utilities.DoubleArray{Encoding: map[string]int{"repository_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_RepositoryService_GetRepositoryById_0 = &utilities.DoubleArray{Encoding: map[string]int{"repository_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_RepositoryService_GetRepositoryById_0(ctx context.Context, marshaler runtime.Marshaler, client RepositoryServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetRepositoryByIdRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetRepositoryByIdRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["repository_id"] + val, ok := pathParams["repository_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "repository_id") } - protoReq.RepositoryId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "repository_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RepositoryService_GetRepositoryById_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetRepositoryById(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RepositoryService_GetRepositoryById_0(ctx context.Context, marshaler runtime.Marshaler, server RepositoryServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetRepositoryByIdRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetRepositoryByIdRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["repository_id"] + val, ok := pathParams["repository_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "repository_id") } - protoReq.RepositoryId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "repository_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RepositoryService_GetRepositoryById_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetRepositoryById(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_RepositoryService_GetRepositoryByName_0 = &utilities.DoubleArray{Encoding: map[string]int{"provider": 0, "name": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} -) +var filter_RepositoryService_GetRepositoryByName_0 = &utilities.DoubleArray{Encoding: map[string]int{"provider": 0, "name": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} func request_RepositoryService_GetRepositoryByName_0(ctx context.Context, marshaler runtime.Marshaler, client RepositoryServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetRepositoryByNameRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetRepositoryByNameRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["provider"] + val, ok := pathParams["provider"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "provider") } - protoReq.Provider, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "provider", err) } - val, ok = pathParams["name"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Name, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RepositoryService_GetRepositoryByName_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetRepositoryByName(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RepositoryService_GetRepositoryByName_0(ctx context.Context, marshaler runtime.Marshaler, server RepositoryServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetRepositoryByNameRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetRepositoryByNameRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["provider"] + val, ok := pathParams["provider"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "provider") } - protoReq.Provider, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "provider", err) } - val, ok = pathParams["name"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Name, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RepositoryService_GetRepositoryByName_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetRepositoryByName(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_RepositoryService_GetRepositoryByName_1 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_RepositoryService_GetRepositoryByName_1 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_RepositoryService_GetRepositoryByName_1(ctx context.Context, marshaler runtime.Marshaler, client RepositoryServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetRepositoryByNameRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetRepositoryByNameRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["name"] + val, ok := pathParams["name"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Name, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RepositoryService_GetRepositoryByName_1); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetRepositoryByName(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RepositoryService_GetRepositoryByName_1(ctx context.Context, marshaler runtime.Marshaler, server RepositoryServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetRepositoryByNameRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetRepositoryByNameRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["name"] + val, ok := pathParams["name"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Name, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RepositoryService_GetRepositoryByName_1); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetRepositoryByName(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_RepositoryService_DeleteRepositoryById_0 = &utilities.DoubleArray{Encoding: map[string]int{"repository_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_RepositoryService_DeleteRepositoryById_0 = &utilities.DoubleArray{Encoding: map[string]int{"repository_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_RepositoryService_DeleteRepositoryById_0(ctx context.Context, marshaler runtime.Marshaler, client RepositoryServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteRepositoryByIdRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteRepositoryByIdRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["repository_id"] + val, ok := pathParams["repository_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "repository_id") } - protoReq.RepositoryId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "repository_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RepositoryService_DeleteRepositoryById_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DeleteRepositoryById(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RepositoryService_DeleteRepositoryById_0(ctx context.Context, marshaler runtime.Marshaler, server RepositoryServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteRepositoryByIdRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteRepositoryByIdRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["repository_id"] + val, ok := pathParams["repository_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "repository_id") } - protoReq.RepositoryId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "repository_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RepositoryService_DeleteRepositoryById_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DeleteRepositoryById(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_RepositoryService_DeleteRepositoryByName_0 = &utilities.DoubleArray{Encoding: map[string]int{"provider": 0, "name": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} -) +var filter_RepositoryService_DeleteRepositoryByName_0 = &utilities.DoubleArray{Encoding: map[string]int{"provider": 0, "name": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} func request_RepositoryService_DeleteRepositoryByName_0(ctx context.Context, marshaler runtime.Marshaler, client RepositoryServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteRepositoryByNameRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteRepositoryByNameRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["provider"] + val, ok := pathParams["provider"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "provider") } - protoReq.Provider, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "provider", err) } - val, ok = pathParams["name"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Name, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RepositoryService_DeleteRepositoryByName_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DeleteRepositoryByName(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RepositoryService_DeleteRepositoryByName_0(ctx context.Context, marshaler runtime.Marshaler, server RepositoryServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteRepositoryByNameRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteRepositoryByNameRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["provider"] + val, ok := pathParams["provider"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "provider") } - protoReq.Provider, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "provider", err) } - val, ok = pathParams["name"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Name, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RepositoryService_DeleteRepositoryByName_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DeleteRepositoryByName(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_RepositoryService_DeleteRepositoryByName_1 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_RepositoryService_DeleteRepositoryByName_1 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_RepositoryService_DeleteRepositoryByName_1(ctx context.Context, marshaler runtime.Marshaler, client RepositoryServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteRepositoryByNameRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteRepositoryByNameRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["name"] + val, ok := pathParams["name"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Name, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RepositoryService_DeleteRepositoryByName_1); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DeleteRepositoryByName(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RepositoryService_DeleteRepositoryByName_1(ctx context.Context, marshaler runtime.Marshaler, server RepositoryServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteRepositoryByNameRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteRepositoryByNameRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["name"] + val, ok := pathParams["name"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Name, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RepositoryService_DeleteRepositoryByName_1); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DeleteRepositoryByName(ctx, &protoReq) return msg, metadata, err - } func request_UserService_CreateUser_0(ctx context.Context, marshaler runtime.Marshaler, client UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CreateUserRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq CreateUserRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.CreateUser(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_UserService_CreateUser_0(ctx context.Context, marshaler runtime.Marshaler, server UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CreateUserRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq CreateUserRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.CreateUser(ctx, &protoReq) return msg, metadata, err - } func request_UserService_DeleteUser_0(ctx context.Context, marshaler runtime.Marshaler, client UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteUserRequest - var metadata runtime.ServerMetadata - + var ( + protoReq DeleteUserRequest + metadata runtime.ServerMetadata + ) msg, err := client.DeleteUser(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_UserService_DeleteUser_0(ctx context.Context, marshaler runtime.Marshaler, server UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteUserRequest - var metadata runtime.ServerMetadata - + var ( + protoReq DeleteUserRequest + metadata runtime.ServerMetadata + ) msg, err := server.DeleteUser(ctx, &protoReq) return msg, metadata, err - } func request_UserService_GetUser_0(ctx context.Context, marshaler runtime.Marshaler, client UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetUserRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetUserRequest + metadata runtime.ServerMetadata + ) msg, err := client.GetUser(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_UserService_GetUser_0(ctx context.Context, marshaler runtime.Marshaler, server UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetUserRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetUserRequest + metadata runtime.ServerMetadata + ) msg, err := server.GetUser(ctx, &protoReq) return msg, metadata, err - } func request_UserService_ListInvitations_0(ctx context.Context, marshaler runtime.Marshaler, client UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListInvitationsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListInvitationsRequest + metadata runtime.ServerMetadata + ) msg, err := client.ListInvitations(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_UserService_ListInvitations_0(ctx context.Context, marshaler runtime.Marshaler, server UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListInvitationsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListInvitationsRequest + metadata runtime.ServerMetadata + ) msg, err := server.ListInvitations(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_UserService_ResolveInvitation_0 = &utilities.DoubleArray{Encoding: map[string]int{"code": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_UserService_ResolveInvitation_0 = &utilities.DoubleArray{Encoding: map[string]int{"code": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_UserService_ResolveInvitation_0(ctx context.Context, marshaler runtime.Marshaler, client UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ResolveInvitationRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq ResolveInvitationRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["code"] + val, ok := pathParams["code"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "code") } - protoReq.Code, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "code", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_UserService_ResolveInvitation_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ResolveInvitation(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_UserService_ResolveInvitation_0(ctx context.Context, marshaler runtime.Marshaler, server UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ResolveInvitationRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq ResolveInvitationRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["code"] + val, ok := pathParams["code"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "code") } - protoReq.Code, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "code", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_UserService_ResolveInvitation_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ResolveInvitation(ctx, &protoReq) return msg, metadata, err - } func request_ProfileService_CreateProfile_0(ctx context.Context, marshaler runtime.Marshaler, client ProfileServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CreateProfileRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq CreateProfileRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.CreateProfile(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ProfileService_CreateProfile_0(ctx context.Context, marshaler runtime.Marshaler, server ProfileServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CreateProfileRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq CreateProfileRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.CreateProfile(ctx, &protoReq) return msg, metadata, err - } func request_ProfileService_UpdateProfile_0(ctx context.Context, marshaler runtime.Marshaler, client ProfileServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateProfileRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq UpdateProfileRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.UpdateProfile(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ProfileService_UpdateProfile_0(ctx context.Context, marshaler runtime.Marshaler, server ProfileServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateProfileRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq UpdateProfileRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.UpdateProfile(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_ProfileService_PatchProfile_0 = &utilities.DoubleArray{Encoding: map[string]int{"patch": 0, "id": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} -) +var filter_ProfileService_PatchProfile_0 = &utilities.DoubleArray{Encoding: map[string]int{"patch": 0, "id": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} func request_ProfileService_PatchProfile_0(ctx context.Context, marshaler runtime.Marshaler, client ProfileServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PatchProfileRequest - var metadata runtime.ServerMetadata - + var ( + protoReq PatchProfileRequest + metadata runtime.ServerMetadata + err error + ) newReader, berr := utilities.IOReaderFactory(req.Body) if berr != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Patch); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Patch); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { @@ -1595,45 +1241,35 @@ func request_ProfileService_PatchProfile_0(ctx context.Context, marshaler runtim protoReq.UpdateMask = fieldMask } } - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProfileService_PatchProfile_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.PatchProfile(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ProfileService_PatchProfile_0(ctx context.Context, marshaler runtime.Marshaler, server ProfileServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PatchProfileRequest - var metadata runtime.ServerMetadata - + var ( + protoReq PatchProfileRequest + metadata runtime.ServerMetadata + err error + ) newReader, berr := utilities.IOReaderFactory(req.Body) if berr != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Patch); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Patch); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { @@ -1643,1177 +1279,1216 @@ func local_request_ProfileService_PatchProfile_0(ctx context.Context, marshaler protoReq.UpdateMask = fieldMask } } - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProfileService_PatchProfile_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.PatchProfile(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_ProfileService_DeleteProfile_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_ProfileService_DeleteProfile_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_ProfileService_DeleteProfile_0(ctx context.Context, marshaler runtime.Marshaler, client ProfileServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteProfileRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteProfileRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProfileService_DeleteProfile_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DeleteProfile(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ProfileService_DeleteProfile_0(ctx context.Context, marshaler runtime.Marshaler, server ProfileServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteProfileRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteProfileRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProfileService_DeleteProfile_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DeleteProfile(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_ProfileService_ListProfiles_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_ProfileService_ListProfiles_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_ProfileService_ListProfiles_0(ctx context.Context, marshaler runtime.Marshaler, client ProfileServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListProfilesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListProfilesRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProfileService_ListProfiles_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListProfiles(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ProfileService_ListProfiles_0(ctx context.Context, marshaler runtime.Marshaler, server ProfileServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListProfilesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListProfilesRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProfileService_ListProfiles_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListProfiles(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_ProfileService_GetProfileById_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_ProfileService_GetProfileById_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_ProfileService_GetProfileById_0(ctx context.Context, marshaler runtime.Marshaler, client ProfileServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetProfileByIdRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetProfileByIdRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProfileService_GetProfileById_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetProfileById(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ProfileService_GetProfileById_0(ctx context.Context, marshaler runtime.Marshaler, server ProfileServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetProfileByIdRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetProfileByIdRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProfileService_GetProfileById_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetProfileById(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_ProfileService_GetProfileByName_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_ProfileService_GetProfileByName_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_ProfileService_GetProfileByName_0(ctx context.Context, marshaler runtime.Marshaler, client ProfileServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetProfileByNameRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetProfileByNameRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["name"] + val, ok := pathParams["name"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Name, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProfileService_GetProfileByName_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetProfileByName(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ProfileService_GetProfileByName_0(ctx context.Context, marshaler runtime.Marshaler, server ProfileServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetProfileByNameRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetProfileByNameRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["name"] + val, ok := pathParams["name"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Name, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProfileService_GetProfileByName_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetProfileByName(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_ProfileService_GetProfileStatusByName_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_ProfileService_GetProfileStatusByName_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_ProfileService_GetProfileStatusByName_0(ctx context.Context, marshaler runtime.Marshaler, client ProfileServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetProfileStatusByNameRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetProfileStatusByNameRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["name"] + val, ok := pathParams["name"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Name, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProfileService_GetProfileStatusByName_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetProfileStatusByName(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ProfileService_GetProfileStatusByName_0(ctx context.Context, marshaler runtime.Marshaler, server ProfileServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetProfileStatusByNameRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetProfileStatusByNameRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["name"] + val, ok := pathParams["name"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Name, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProfileService_GetProfileStatusByName_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetProfileStatusByName(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_ProfileService_GetProfileStatusByProject_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_ProfileService_GetProfileStatusByProject_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_ProfileService_GetProfileStatusByProject_0(ctx context.Context, marshaler runtime.Marshaler, client ProfileServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetProfileStatusByProjectRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetProfileStatusByProjectRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProfileService_GetProfileStatusByProject_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetProfileStatusByProject(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ProfileService_GetProfileStatusByProject_0(ctx context.Context, marshaler runtime.Marshaler, server ProfileServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetProfileStatusByProjectRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetProfileStatusByProjectRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProfileService_GetProfileStatusByProject_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetProfileStatusByProject(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_RuleTypeService_ListRuleTypes_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_RuleTypeService_ListRuleTypes_0(ctx context.Context, marshaler runtime.Marshaler, client RuleTypeServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListRuleTypesRequest - var metadata runtime.ServerMetadata +func request_DataSourceService_CreateDataSource_0(ctx context.Context, marshaler runtime.Marshaler, client DataSourceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateDataSourceRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.CreateDataSource(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} +func local_request_DataSourceService_CreateDataSource_0(ctx context.Context, marshaler runtime.Marshaler, server DataSourceServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CreateDataSourceRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.CreateDataSource(ctx, &protoReq) + return msg, metadata, err +} + +var filter_DataSourceService_GetDataSourceById_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_DataSourceService_GetDataSourceById_0(ctx context.Context, marshaler runtime.Marshaler, client DataSourceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetDataSourceByIdRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") + } + protoReq.Id, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) + } if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RuleTypeService_ListRuleTypes_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DataSourceService_GetDataSourceById_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + msg, err := client.GetDataSourceById(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} - msg, err := client.ListRuleTypes(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) +func local_request_DataSourceService_GetDataSourceById_0(ctx context.Context, marshaler runtime.Marshaler, server DataSourceServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetDataSourceByIdRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") + } + protoReq.Id, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DataSourceService_GetDataSourceById_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.GetDataSourceById(ctx, &protoReq) return msg, metadata, err +} +var filter_DataSourceService_GetDataSourceByName_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_DataSourceService_GetDataSourceByName_0(ctx context.Context, marshaler runtime.Marshaler, client DataSourceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetDataSourceByNameRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DataSourceService_GetDataSourceByName_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.GetDataSourceByName(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err } -func local_request_RuleTypeService_ListRuleTypes_0(ctx context.Context, marshaler runtime.Marshaler, server RuleTypeServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListRuleTypesRequest - var metadata runtime.ServerMetadata +func local_request_DataSourceService_GetDataSourceByName_0(ctx context.Context, marshaler runtime.Marshaler, server DataSourceServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetDataSourceByNameRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DataSourceService_GetDataSourceByName_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.GetDataSourceByName(ctx, &protoReq) + return msg, metadata, err +} + +var filter_DataSourceService_ListDataSources_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +func request_DataSourceService_ListDataSources_0(ctx context.Context, marshaler runtime.Marshaler, client DataSourceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListDataSourcesRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RuleTypeService_ListRuleTypes_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DataSourceService_ListDataSources_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + msg, err := client.ListDataSources(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} - msg, err := server.ListRuleTypes(ctx, &protoReq) +func local_request_DataSourceService_ListDataSources_0(ctx context.Context, marshaler runtime.Marshaler, server DataSourceServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListDataSourcesRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DataSourceService_ListDataSources_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListDataSources(ctx, &protoReq) return msg, metadata, err +} +func request_DataSourceService_UpdateDataSource_0(ctx context.Context, marshaler runtime.Marshaler, client DataSourceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateDataSourceRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.UpdateDataSource(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err } -var ( - filter_RuleTypeService_GetRuleTypeByName_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +func local_request_DataSourceService_UpdateDataSource_0(ctx context.Context, marshaler runtime.Marshaler, server DataSourceServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq UpdateDataSourceRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.UpdateDataSource(ctx, &protoReq) + return msg, metadata, err +} -func request_RuleTypeService_GetRuleTypeByName_0(ctx context.Context, marshaler runtime.Marshaler, client RuleTypeServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetRuleTypeByNameRequest - var metadata runtime.ServerMetadata +var filter_DataSourceService_DeleteDataSourceById_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +func request_DataSourceService_DeleteDataSourceById_0(ctx context.Context, marshaler runtime.Marshaler, client DataSourceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var ( - val string - ok bool - err error - _ = err + protoReq DeleteDataSourceByIdRequest + metadata runtime.ServerMetadata + err error ) + val, ok := pathParams["id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") + } + protoReq.Id, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DataSourceService_DeleteDataSourceById_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.DeleteDataSourceById(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} - val, ok = pathParams["name"] +func local_request_DataSourceService_DeleteDataSourceById_0(ctx context.Context, marshaler runtime.Marshaler, server DataSourceServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteDataSourceByIdRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["id"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") + } + protoReq.Id, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DataSourceService_DeleteDataSourceById_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + msg, err := server.DeleteDataSourceById(ctx, &protoReq) + return msg, metadata, err +} +var filter_DataSourceService_DeleteDataSourceByName_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + +func request_DataSourceService_DeleteDataSourceByName_0(ctx context.Context, marshaler runtime.Marshaler, client DataSourceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteDataSourceByNameRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } protoReq.Name, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DataSourceService_DeleteDataSourceByName_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.DeleteDataSourceByName(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} +func local_request_DataSourceService_DeleteDataSourceByName_0(ctx context.Context, marshaler runtime.Marshaler, server DataSourceServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteDataSourceByNameRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RuleTypeService_GetRuleTypeByName_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DataSourceService_DeleteDataSourceByName_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + msg, err := server.DeleteDataSourceByName(ctx, &protoReq) + return msg, metadata, err +} - msg, err := client.GetRuleTypeByName(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) +var filter_RuleTypeService_ListRuleTypes_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_RuleTypeService_ListRuleTypes_0(ctx context.Context, marshaler runtime.Marshaler, client RuleTypeServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListRuleTypesRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RuleTypeService_ListRuleTypes_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ListRuleTypes(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err +} +func local_request_RuleTypeService_ListRuleTypes_0(ctx context.Context, marshaler runtime.Marshaler, server RuleTypeServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ListRuleTypesRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RuleTypeService_ListRuleTypes_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ListRuleTypes(ctx, &protoReq) + return msg, metadata, err } -func local_request_RuleTypeService_GetRuleTypeByName_0(ctx context.Context, marshaler runtime.Marshaler, server RuleTypeServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetRuleTypeByNameRequest - var metadata runtime.ServerMetadata +var filter_RuleTypeService_GetRuleTypeByName_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +func request_RuleTypeService_GetRuleTypeByName_0(ctx context.Context, marshaler runtime.Marshaler, client RuleTypeServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var ( - val string - ok bool - err error - _ = err + protoReq GetRuleTypeByNameRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["name"] + val, ok := pathParams["name"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Name, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RuleTypeService_GetRuleTypeByName_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + msg, err := client.GetRuleTypeByName(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} +func local_request_RuleTypeService_GetRuleTypeByName_0(ctx context.Context, marshaler runtime.Marshaler, server RuleTypeServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetRuleTypeByNameRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RuleTypeService_GetRuleTypeByName_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } msg, err := server.GetRuleTypeByName(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_RuleTypeService_GetRuleTypeById_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_RuleTypeService_GetRuleTypeById_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_RuleTypeService_GetRuleTypeById_0(ctx context.Context, marshaler runtime.Marshaler, client RuleTypeServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetRuleTypeByIdRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetRuleTypeByIdRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RuleTypeService_GetRuleTypeById_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetRuleTypeById(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RuleTypeService_GetRuleTypeById_0(ctx context.Context, marshaler runtime.Marshaler, server RuleTypeServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetRuleTypeByIdRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetRuleTypeByIdRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RuleTypeService_GetRuleTypeById_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetRuleTypeById(ctx, &protoReq) return msg, metadata, err - } func request_RuleTypeService_CreateRuleType_0(ctx context.Context, marshaler runtime.Marshaler, client RuleTypeServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CreateRuleTypeRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq CreateRuleTypeRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.CreateRuleType(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RuleTypeService_CreateRuleType_0(ctx context.Context, marshaler runtime.Marshaler, server RuleTypeServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CreateRuleTypeRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq CreateRuleTypeRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.CreateRuleType(ctx, &protoReq) return msg, metadata, err - } func request_RuleTypeService_UpdateRuleType_0(ctx context.Context, marshaler runtime.Marshaler, client RuleTypeServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateRuleTypeRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq UpdateRuleTypeRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.UpdateRuleType(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RuleTypeService_UpdateRuleType_0(ctx context.Context, marshaler runtime.Marshaler, server RuleTypeServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateRuleTypeRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq UpdateRuleTypeRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.UpdateRuleType(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_RuleTypeService_DeleteRuleType_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_RuleTypeService_DeleteRuleType_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_RuleTypeService_DeleteRuleType_0(ctx context.Context, marshaler runtime.Marshaler, client RuleTypeServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteRuleTypeRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteRuleTypeRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RuleTypeService_DeleteRuleType_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DeleteRuleType(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RuleTypeService_DeleteRuleType_0(ctx context.Context, marshaler runtime.Marshaler, server RuleTypeServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteRuleTypeRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteRuleTypeRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RuleTypeService_DeleteRuleType_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DeleteRuleType(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_EvalResultsService_ListEvaluationResults_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_EvalResultsService_ListEvaluationResults_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_EvalResultsService_ListEvaluationResults_0(ctx context.Context, marshaler runtime.Marshaler, client EvalResultsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListEvaluationResultsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListEvaluationResultsRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_EvalResultsService_ListEvaluationResults_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListEvaluationResults(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_EvalResultsService_ListEvaluationResults_0(ctx context.Context, marshaler runtime.Marshaler, server EvalResultsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListEvaluationResultsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListEvaluationResultsRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_EvalResultsService_ListEvaluationResults_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListEvaluationResults(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_EvalResultsService_ListEvaluationHistory_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_EvalResultsService_ListEvaluationHistory_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_EvalResultsService_ListEvaluationHistory_0(ctx context.Context, marshaler runtime.Marshaler, client EvalResultsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListEvaluationHistoryRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListEvaluationHistoryRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_EvalResultsService_ListEvaluationHistory_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListEvaluationHistory(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_EvalResultsService_ListEvaluationHistory_0(ctx context.Context, marshaler runtime.Marshaler, server EvalResultsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListEvaluationHistoryRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListEvaluationHistoryRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_EvalResultsService_ListEvaluationHistory_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListEvaluationHistory(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_EvalResultsService_GetEvaluationHistory_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_EvalResultsService_GetEvaluationHistory_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_EvalResultsService_GetEvaluationHistory_0(ctx context.Context, marshaler runtime.Marshaler, client EvalResultsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetEvaluationHistoryRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetEvaluationHistoryRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_EvalResultsService_GetEvaluationHistory_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetEvaluationHistory(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_EvalResultsService_GetEvaluationHistory_0(ctx context.Context, marshaler runtime.Marshaler, server EvalResultsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetEvaluationHistoryRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetEvaluationHistoryRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_EvalResultsService_GetEvaluationHistory_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetEvaluationHistory(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_PermissionsService_ListRoles_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_PermissionsService_ListRoles_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_PermissionsService_ListRoles_0(ctx context.Context, marshaler runtime.Marshaler, client PermissionsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListRolesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListRolesRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PermissionsService_ListRoles_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListRoles(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_PermissionsService_ListRoles_0(ctx context.Context, marshaler runtime.Marshaler, server PermissionsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListRolesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListRolesRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PermissionsService_ListRoles_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListRoles(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_PermissionsService_ListRoleAssignments_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_PermissionsService_ListRoleAssignments_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_PermissionsService_ListRoleAssignments_0(ctx context.Context, marshaler runtime.Marshaler, client PermissionsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListRoleAssignmentsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListRoleAssignmentsRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PermissionsService_ListRoleAssignments_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListRoleAssignments(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_PermissionsService_ListRoleAssignments_0(ctx context.Context, marshaler runtime.Marshaler, server PermissionsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListRoleAssignmentsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListRoleAssignmentsRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PermissionsService_ListRoleAssignments_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListRoleAssignments(ctx, &protoReq) return msg, metadata, err - } func request_PermissionsService_AssignRole_0(ctx context.Context, marshaler runtime.Marshaler, client PermissionsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AssignRoleRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq AssignRoleRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.AssignRole(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_PermissionsService_AssignRole_0(ctx context.Context, marshaler runtime.Marshaler, server PermissionsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AssignRoleRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq AssignRoleRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.AssignRole(ctx, &protoReq) return msg, metadata, err - } func request_PermissionsService_UpdateRole_0(ctx context.Context, marshaler runtime.Marshaler, client PermissionsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateRoleRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq UpdateRoleRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.UpdateRole(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_PermissionsService_UpdateRole_0(ctx context.Context, marshaler runtime.Marshaler, server PermissionsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateRoleRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq UpdateRoleRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.UpdateRole(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_PermissionsService_RemoveRole_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_PermissionsService_RemoveRole_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_PermissionsService_RemoveRole_0(ctx context.Context, marshaler runtime.Marshaler, client PermissionsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq RemoveRoleRequest - var metadata runtime.ServerMetadata - + var ( + protoReq RemoveRoleRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PermissionsService_RemoveRole_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.RemoveRole(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_PermissionsService_RemoveRole_0(ctx context.Context, marshaler runtime.Marshaler, server PermissionsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq RemoveRoleRequest - var metadata runtime.ServerMetadata - + var ( + protoReq RemoveRoleRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PermissionsService_RemoveRole_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.RemoveRole(ctx, &protoReq) return msg, metadata, err - } func request_ProjectsService_ListProjects_0(ctx context.Context, marshaler runtime.Marshaler, client ProjectsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListProjectsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListProjectsRequest + metadata runtime.ServerMetadata + ) msg, err := client.ListProjects(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ProjectsService_ListProjects_0(ctx context.Context, marshaler runtime.Marshaler, server ProjectsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListProjectsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListProjectsRequest + metadata runtime.ServerMetadata + ) msg, err := server.ListProjects(ctx, &protoReq) return msg, metadata, err - } func request_ProjectsService_CreateProject_0(ctx context.Context, marshaler runtime.Marshaler, client ProjectsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CreateProjectRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq CreateProjectRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.CreateProject(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ProjectsService_CreateProject_0(ctx context.Context, marshaler runtime.Marshaler, server ProjectsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CreateProjectRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq CreateProjectRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.CreateProject(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_ProjectsService_ListChildProjects_0 = &utilities.DoubleArray{Encoding: map[string]int{"context": 0, "project_id": 1}, Base: []int{1, 1, 1, 0}, Check: []int{0, 1, 2, 3}} -) +var filter_ProjectsService_ListChildProjects_0 = &utilities.DoubleArray{Encoding: map[string]int{"context": 0, "project_id": 1}, Base: []int{1, 1, 1, 0}, Check: []int{0, 1, 2, 3}} func request_ProjectsService_ListChildProjects_0(ctx context.Context, marshaler runtime.Marshaler, client ProjectsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListChildProjectsRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq ListChildProjectsRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["context.project_id"] + val, ok := pathParams["context.project_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "context.project_id") } - err = runtime.PopulateFieldFromPath(&protoReq, "context.project_id", val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "context.project_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProjectsService_ListChildProjects_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListChildProjects(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ProjectsService_ListChildProjects_0(ctx context.Context, marshaler runtime.Marshaler, server ProjectsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListChildProjectsRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq ListChildProjectsRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["context.project_id"] + val, ok := pathParams["context.project_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "context.project_id") } - err = runtime.PopulateFieldFromPath(&protoReq, "context.project_id", val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "context.project_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProjectsService_ListChildProjects_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListChildProjects(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_ProjectsService_DeleteProject_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_ProjectsService_DeleteProject_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_ProjectsService_DeleteProject_0(ctx context.Context, marshaler runtime.Marshaler, client ProjectsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteProjectRequest - var metadata runtime.ServerMetadata - + var ( + protoReq DeleteProjectRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProjectsService_DeleteProject_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DeleteProject(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ProjectsService_DeleteProject_0(ctx context.Context, marshaler runtime.Marshaler, server ProjectsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteProjectRequest - var metadata runtime.ServerMetadata - + var ( + protoReq DeleteProjectRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProjectsService_DeleteProject_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DeleteProject(ctx, &protoReq) return msg, metadata, err - } func request_ProjectsService_UpdateProject_0(ctx context.Context, marshaler runtime.Marshaler, client ProjectsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateProjectRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq UpdateProjectRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.UpdateProject(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ProjectsService_UpdateProject_0(ctx context.Context, marshaler runtime.Marshaler, server ProjectsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateProjectRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq UpdateProjectRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.UpdateProject(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_ProjectsService_PatchProject_0 = &utilities.DoubleArray{Encoding: map[string]int{"patch": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_ProjectsService_PatchProject_0 = &utilities.DoubleArray{Encoding: map[string]int{"patch": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_ProjectsService_PatchProject_0(ctx context.Context, marshaler runtime.Marshaler, client ProjectsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PatchProjectRequest - var metadata runtime.ServerMetadata - + var ( + protoReq PatchProjectRequest + metadata runtime.ServerMetadata + ) newReader, berr := utilities.IOReaderFactory(req.Body) if berr != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Patch); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Patch); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { @@ -2823,28 +2498,26 @@ func request_ProjectsService_PatchProject_0(ctx context.Context, marshaler runti protoReq.UpdateMask = fieldMask } } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProjectsService_PatchProject_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.PatchProject(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ProjectsService_PatchProject_0(ctx context.Context, marshaler runtime.Marshaler, server ProjectsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PatchProjectRequest - var metadata runtime.ServerMetadata - + var ( + protoReq PatchProjectRequest + metadata runtime.ServerMetadata + ) newReader, berr := utilities.IOReaderFactory(req.Body) if berr != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Patch); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Patch); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { @@ -2854,58 +2527,52 @@ func local_request_ProjectsService_PatchProject_0(ctx context.Context, marshaler protoReq.UpdateMask = fieldMask } } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProjectsService_PatchProject_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.PatchProject(ctx, &protoReq) return msg, metadata, err - } func request_ProjectsService_CreateEntityReconciliationTask_0(ctx context.Context, marshaler runtime.Marshaler, client ProjectsServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CreateEntityReconciliationTaskRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq CreateEntityReconciliationTaskRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.CreateEntityReconciliationTask(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ProjectsService_CreateEntityReconciliationTask_0(ctx context.Context, marshaler runtime.Marshaler, server ProjectsServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CreateEntityReconciliationTaskRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq CreateEntityReconciliationTaskRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.CreateEntityReconciliationTask(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_ProvidersService_PatchProvider_0 = &utilities.DoubleArray{Encoding: map[string]int{"patch": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_ProvidersService_PatchProvider_0 = &utilities.DoubleArray{Encoding: map[string]int{"patch": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_ProvidersService_PatchProvider_0(ctx context.Context, marshaler runtime.Marshaler, client ProvidersServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PatchProviderRequest - var metadata runtime.ServerMetadata - + var ( + protoReq PatchProviderRequest + metadata runtime.ServerMetadata + ) newReader, berr := utilities.IOReaderFactory(req.Body) if berr != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Patch); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Patch); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { @@ -2915,28 +2582,26 @@ func request_ProvidersService_PatchProvider_0(ctx context.Context, marshaler run protoReq.UpdateMask = fieldMask } } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProvidersService_PatchProvider_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.PatchProvider(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ProvidersService_PatchProvider_0(ctx context.Context, marshaler runtime.Marshaler, server ProvidersServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PatchProviderRequest - var metadata runtime.ServerMetadata - + var ( + protoReq PatchProviderRequest + metadata runtime.ServerMetadata + ) newReader, berr := utilities.IOReaderFactory(req.Body) if berr != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Patch); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Patch); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 { @@ -2946,405 +2611,294 @@ func local_request_ProvidersService_PatchProvider_0(ctx context.Context, marshal protoReq.UpdateMask = fieldMask } } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProvidersService_PatchProvider_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.PatchProvider(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_ProvidersService_GetProvider_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_ProvidersService_GetProvider_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_ProvidersService_GetProvider_0(ctx context.Context, marshaler runtime.Marshaler, client ProvidersServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetProviderRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetProviderRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["name"] + val, ok := pathParams["name"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Name, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProvidersService_GetProvider_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetProvider(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ProvidersService_GetProvider_0(ctx context.Context, marshaler runtime.Marshaler, server ProvidersServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetProviderRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetProviderRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["name"] + val, ok := pathParams["name"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Name, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProvidersService_GetProvider_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetProvider(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_ProvidersService_ListProviders_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_ProvidersService_ListProviders_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_ProvidersService_ListProviders_0(ctx context.Context, marshaler runtime.Marshaler, client ProvidersServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListProvidersRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListProvidersRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProvidersService_ListProviders_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListProviders(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ProvidersService_ListProviders_0(ctx context.Context, marshaler runtime.Marshaler, server ProvidersServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListProvidersRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListProvidersRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProvidersService_ListProviders_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListProviders(ctx, &protoReq) return msg, metadata, err - } func request_ProvidersService_CreateProvider_0(ctx context.Context, marshaler runtime.Marshaler, client ProvidersServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CreateProviderRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq CreateProviderRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.CreateProvider(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ProvidersService_CreateProvider_0(ctx context.Context, marshaler runtime.Marshaler, server ProvidersServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CreateProviderRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq CreateProviderRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.CreateProvider(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_ProvidersService_DeleteProvider_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_ProvidersService_DeleteProvider_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_ProvidersService_DeleteProvider_0(ctx context.Context, marshaler runtime.Marshaler, client ProvidersServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteProviderRequest - var metadata runtime.ServerMetadata - + var ( + protoReq DeleteProviderRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProvidersService_DeleteProvider_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DeleteProvider(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ProvidersService_DeleteProvider_0(ctx context.Context, marshaler runtime.Marshaler, server ProvidersServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteProviderRequest - var metadata runtime.ServerMetadata - + var ( + protoReq DeleteProviderRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProvidersService_DeleteProvider_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DeleteProvider(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_ProvidersService_DeleteProviderByID_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_ProvidersService_DeleteProviderByID_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_ProvidersService_DeleteProviderByID_0(ctx context.Context, marshaler runtime.Marshaler, client ProvidersServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteProviderByIDRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") - } - - protoReq.Id, err = runtime.String(val) - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProvidersService_DeleteProviderByID_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.DeleteProviderByID(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ProvidersService_DeleteProviderByID_0(ctx context.Context, marshaler runtime.Marshaler, server ProvidersServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteProviderByIDRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") - } - - protoReq.Id, err = runtime.String(val) - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProvidersService_DeleteProviderByID_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.DeleteProviderByID(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_ProvidersService_GetUnclaimedProviders_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_ProvidersService_GetUnclaimedProviders_0(ctx context.Context, marshaler runtime.Marshaler, client ProvidersServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetUnclaimedProvidersRequest - var metadata runtime.ServerMetadata - + var ( + protoReq DeleteProviderByIDRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") + } + protoReq.Id, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) + } if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProvidersService_GetUnclaimedProviders_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProvidersService_DeleteProviderByID_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - - msg, err := client.GetUnclaimedProviders(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.DeleteProviderByID(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } -func local_request_ProvidersService_GetUnclaimedProviders_0(ctx context.Context, marshaler runtime.Marshaler, server ProvidersServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetUnclaimedProvidersRequest - var metadata runtime.ServerMetadata - +func local_request_ProvidersService_DeleteProviderByID_0(ctx context.Context, marshaler runtime.Marshaler, server ProvidersServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq DeleteProviderByIDRequest + metadata runtime.ServerMetadata + err error + ) + val, ok := pathParams["id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") + } + protoReq.Id, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) + } if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProvidersService_GetUnclaimedProviders_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProvidersService_DeleteProviderByID_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - - msg, err := server.GetUnclaimedProviders(ctx, &protoReq) + msg, err := server.DeleteProviderByID(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_ProvidersService_ListProviderClasses_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_ProvidersService_ListProviderClasses_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_ProvidersService_ListProviderClasses_0(ctx context.Context, marshaler runtime.Marshaler, client ProvidersServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListProviderClassesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListProviderClassesRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProvidersService_ListProviderClasses_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListProviderClasses(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ProvidersService_ListProviderClasses_0(ctx context.Context, marshaler runtime.Marshaler, server ProvidersServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListProviderClassesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListProviderClassesRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProvidersService_ListProviderClasses_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListProviderClasses(ctx, &protoReq) return msg, metadata, err - } func request_ProvidersService_ReconcileEntityRegistration_0(ctx context.Context, marshaler runtime.Marshaler, client ProvidersServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ReconcileEntityRegistrationRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq ReconcileEntityRegistrationRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ReconcileEntityRegistration(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ProvidersService_ReconcileEntityRegistration_0(ctx context.Context, marshaler runtime.Marshaler, server ProvidersServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ReconcileEntityRegistrationRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq ReconcileEntityRegistrationRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ReconcileEntityRegistration(ctx, &protoReq) return msg, metadata, err - } func request_InviteService_GetInviteDetails_0(ctx context.Context, marshaler runtime.Marshaler, client InviteServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetInviteDetailsRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetInviteDetailsRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["code"] + val, ok := pathParams["code"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "code") } - protoReq.Code, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "code", err) } - msg, err := client.GetInviteDetails(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_InviteService_GetInviteDetails_0(ctx context.Context, marshaler runtime.Marshaler, server InviteServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetInviteDetailsRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetInviteDetailsRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["code"] + val, ok := pathParams["code"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "code") } - protoReq.Code, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "code", err) } - msg, err := server.GetInviteDetails(ctx, &protoReq) return msg, metadata, err - } // RegisterHealthServiceHandlerServer registers the http handlers for service HealthService to "mux". @@ -3353,16 +2907,13 @@ func local_request_InviteService_GetInviteDetails_0(ctx context.Context, marshal // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterHealthServiceHandlerFromEndpoint instead. // GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. func RegisterHealthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server HealthServiceServer) error { - - mux.Handle("GET", pattern_HealthService_CheckHealth_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_HealthService_CheckHealth_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.HealthService/CheckHealth", runtime.WithHTTPPathPattern("/api/v1/health")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.HealthService/CheckHealth", runtime.WithHTTPPathPattern("/api/v1/health")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3374,9 +2925,7 @@ func RegisterHealthServiceHandlerServer(ctx context.Context, mux *runtime.ServeM runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_HealthService_CheckHealth_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) return nil @@ -3388,16 +2937,13 @@ func RegisterHealthServiceHandlerServer(ctx context.Context, mux *runtime.ServeM // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterArtifactServiceHandlerFromEndpoint instead. // GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. func RegisterArtifactServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ArtifactServiceServer) error { - - mux.Handle("GET", pattern_ArtifactService_ListArtifacts_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ArtifactService_ListArtifacts_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ArtifactService/ListArtifacts", runtime.WithHTTPPathPattern("/api/v1/artifacts/{provider}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ArtifactService/ListArtifacts", runtime.WithHTTPPathPattern("/api/v1/artifacts/{provider}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3409,20 +2955,15 @@ func RegisterArtifactServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ArtifactService_ListArtifacts_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_ArtifactService_ListArtifacts_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ArtifactService_ListArtifacts_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ArtifactService/ListArtifacts", runtime.WithHTTPPathPattern("/api/v1/artifacts")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ArtifactService/ListArtifacts", runtime.WithHTTPPathPattern("/api/v1/artifacts")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3434,20 +2975,15 @@ func RegisterArtifactServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ArtifactService_ListArtifacts_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_ArtifactService_GetArtifactById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ArtifactService_GetArtifactById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ArtifactService/GetArtifactById", runtime.WithHTTPPathPattern("/api/v1/artifact/{id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ArtifactService/GetArtifactById", runtime.WithHTTPPathPattern("/api/v1/artifact/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3459,20 +2995,15 @@ func RegisterArtifactServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ArtifactService_GetArtifactById_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_ArtifactService_GetArtifactByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ArtifactService_GetArtifactByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ArtifactService/GetArtifactByName", runtime.WithHTTPPathPattern("/api/v1/artifact/name/{name=**}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ArtifactService/GetArtifactByName", runtime.WithHTTPPathPattern("/api/v1/artifact/name/{name=**}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3484,9 +3015,7 @@ func RegisterArtifactServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ArtifactService_GetArtifactByName_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) return nil @@ -3498,16 +3027,13 @@ func RegisterArtifactServiceHandlerServer(ctx context.Context, mux *runtime.Serv // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterOAuthServiceHandlerFromEndpoint instead. // GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. func RegisterOAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server OAuthServiceServer) error { - - mux.Handle("GET", pattern_OAuthService_GetAuthorizationURL_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_OAuthService_GetAuthorizationURL_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.OAuthService/GetAuthorizationURL", runtime.WithHTTPPathPattern("/api/v1/auth/url")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.OAuthService/GetAuthorizationURL", runtime.WithHTTPPathPattern("/api/v1/auth/url")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3519,20 +3045,15 @@ func RegisterOAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMu runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_OAuthService_GetAuthorizationURL_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_OAuthService_StoreProviderToken_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_OAuthService_StoreProviderToken_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.OAuthService/StoreProviderToken", runtime.WithHTTPPathPattern("/api/v1/auth/{provider}/token")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.OAuthService/StoreProviderToken", runtime.WithHTTPPathPattern("/api/v1/auth/{provider}/token")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3544,20 +3065,15 @@ func RegisterOAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMu runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_OAuthService_StoreProviderToken_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_OAuthService_StoreProviderToken_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_OAuthService_StoreProviderToken_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.OAuthService/StoreProviderToken", runtime.WithHTTPPathPattern("/api/v1/auth/token")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.OAuthService/StoreProviderToken", runtime.WithHTTPPathPattern("/api/v1/auth/token")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3569,20 +3085,15 @@ func RegisterOAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMu runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_OAuthService_StoreProviderToken_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_OAuthService_VerifyProviderTokenFrom_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_OAuthService_VerifyProviderTokenFrom_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.OAuthService/VerifyProviderTokenFrom", runtime.WithHTTPPathPattern("/api/v1/auth/verify/{provider}/{timestamp}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.OAuthService/VerifyProviderTokenFrom", runtime.WithHTTPPathPattern("/api/v1/auth/verify/{provider}/{timestamp}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3594,20 +3105,15 @@ func RegisterOAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMu runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_OAuthService_VerifyProviderTokenFrom_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_OAuthService_VerifyProviderTokenFrom_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_OAuthService_VerifyProviderTokenFrom_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.OAuthService/VerifyProviderTokenFrom", runtime.WithHTTPPathPattern("/api/v1/auth/verify/{timestamp}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.OAuthService/VerifyProviderTokenFrom", runtime.WithHTTPPathPattern("/api/v1/auth/verify/{timestamp}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3619,20 +3125,15 @@ func RegisterOAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMu runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_OAuthService_VerifyProviderTokenFrom_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_OAuthService_VerifyProviderCredential_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_OAuthService_VerifyProviderCredential_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.OAuthService/VerifyProviderCredential", runtime.WithHTTPPathPattern("/api/v1/auth/verify")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.OAuthService/VerifyProviderCredential", runtime.WithHTTPPathPattern("/api/v1/auth/verify")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3644,9 +3145,7 @@ func RegisterOAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMu runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_OAuthService_VerifyProviderCredential_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) return nil @@ -3658,16 +3157,13 @@ func RegisterOAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMu // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterRepositoryServiceHandlerFromEndpoint instead. // GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. func RegisterRepositoryServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server RepositoryServiceServer) error { - - mux.Handle("POST", pattern_RepositoryService_RegisterRepository_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_RepositoryService_RegisterRepository_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/RegisterRepository", runtime.WithHTTPPathPattern("/api/v1/repository/provider/{provider}/register")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/RegisterRepository", runtime.WithHTTPPathPattern("/api/v1/repository/provider/{provider}/register")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3679,20 +3175,15 @@ func RegisterRepositoryServiceHandlerServer(ctx context.Context, mux *runtime.Se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RepositoryService_RegisterRepository_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_RepositoryService_RegisterRepository_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_RepositoryService_RegisterRepository_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/RegisterRepository", runtime.WithHTTPPathPattern("/api/v1/repository/register")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/RegisterRepository", runtime.WithHTTPPathPattern("/api/v1/repository/register")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3704,20 +3195,15 @@ func RegisterRepositoryServiceHandlerServer(ctx context.Context, mux *runtime.Se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RepositoryService_RegisterRepository_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RepositoryService_ListRemoteRepositoriesFromProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RepositoryService_ListRemoteRepositoriesFromProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/ListRemoteRepositoriesFromProvider", runtime.WithHTTPPathPattern("/api/v1/repositories/provider/{provider}/remote")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/ListRemoteRepositoriesFromProvider", runtime.WithHTTPPathPattern("/api/v1/repositories/provider/{provider}/remote")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3729,20 +3215,15 @@ func RegisterRepositoryServiceHandlerServer(ctx context.Context, mux *runtime.Se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RepositoryService_ListRemoteRepositoriesFromProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RepositoryService_ListRemoteRepositoriesFromProvider_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RepositoryService_ListRemoteRepositoriesFromProvider_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/ListRemoteRepositoriesFromProvider", runtime.WithHTTPPathPattern("/api/v1/repositories/remote")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/ListRemoteRepositoriesFromProvider", runtime.WithHTTPPathPattern("/api/v1/repositories/remote")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3754,20 +3235,15 @@ func RegisterRepositoryServiceHandlerServer(ctx context.Context, mux *runtime.Se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RepositoryService_ListRemoteRepositoriesFromProvider_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RepositoryService_ListRepositories_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RepositoryService_ListRepositories_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/ListRepositories", runtime.WithHTTPPathPattern("/api/v1/repositories/provider/{provider}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/ListRepositories", runtime.WithHTTPPathPattern("/api/v1/repositories/provider/{provider}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3779,20 +3255,15 @@ func RegisterRepositoryServiceHandlerServer(ctx context.Context, mux *runtime.Se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RepositoryService_ListRepositories_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RepositoryService_ListRepositories_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RepositoryService_ListRepositories_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/ListRepositories", runtime.WithHTTPPathPattern("/api/v1/repositories")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/ListRepositories", runtime.WithHTTPPathPattern("/api/v1/repositories")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3804,20 +3275,15 @@ func RegisterRepositoryServiceHandlerServer(ctx context.Context, mux *runtime.Se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RepositoryService_ListRepositories_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RepositoryService_GetRepositoryById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RepositoryService_GetRepositoryById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/GetRepositoryById", runtime.WithHTTPPathPattern("/api/v1/repository/id/{repository_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/GetRepositoryById", runtime.WithHTTPPathPattern("/api/v1/repository/id/{repository_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3829,20 +3295,15 @@ func RegisterRepositoryServiceHandlerServer(ctx context.Context, mux *runtime.Se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RepositoryService_GetRepositoryById_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RepositoryService_GetRepositoryByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RepositoryService_GetRepositoryByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/GetRepositoryByName", runtime.WithHTTPPathPattern("/api/v1/repository/provider/{provider}/name/{name=**}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/GetRepositoryByName", runtime.WithHTTPPathPattern("/api/v1/repository/provider/{provider}/name/{name=**}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3854,20 +3315,15 @@ func RegisterRepositoryServiceHandlerServer(ctx context.Context, mux *runtime.Se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RepositoryService_GetRepositoryByName_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RepositoryService_GetRepositoryByName_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RepositoryService_GetRepositoryByName_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/GetRepositoryByName", runtime.WithHTTPPathPattern("/api/v1/repository/name/{name=**}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/GetRepositoryByName", runtime.WithHTTPPathPattern("/api/v1/repository/name/{name=**}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3879,20 +3335,15 @@ func RegisterRepositoryServiceHandlerServer(ctx context.Context, mux *runtime.Se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RepositoryService_GetRepositoryByName_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_RepositoryService_DeleteRepositoryById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_RepositoryService_DeleteRepositoryById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/DeleteRepositoryById", runtime.WithHTTPPathPattern("/api/v1/repository/id/{repository_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/DeleteRepositoryById", runtime.WithHTTPPathPattern("/api/v1/repository/id/{repository_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3904,429 +3355,497 @@ func RegisterRepositoryServiceHandlerServer(ctx context.Context, mux *runtime.Se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RepositoryService_DeleteRepositoryById_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_RepositoryService_DeleteRepositoryByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/DeleteRepositoryByName", runtime.WithHTTPPathPattern("/api/v1/repository/provider/{provider}/name/{name=**}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RepositoryService_DeleteRepositoryByName_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RepositoryService_DeleteRepositoryByName_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_RepositoryService_DeleteRepositoryByName_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/DeleteRepositoryByName", runtime.WithHTTPPathPattern("/api/v1/repository/name/{name=**}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_RepositoryService_DeleteRepositoryByName_1(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_RepositoryService_DeleteRepositoryByName_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} +// RegisterUserServiceHandlerServer registers the http handlers for service UserService to "mux". +// UnaryRPC :call UserServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterUserServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterUserServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server UserServiceServer) error { + mux.Handle(http.MethodPost, pattern_UserService_CreateUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.UserService/CreateUser", runtime.WithHTTPPathPattern("/api/v1/user")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_UserService_CreateUser_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_CreateUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_UserService_DeleteUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.UserService/DeleteUser", runtime.WithHTTPPathPattern("/api/v1/user")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_UserService_DeleteUser_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_DeleteUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_UserService_GetUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.UserService/GetUser", runtime.WithHTTPPathPattern("/api/v1/user")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_UserService_GetUser_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_GetUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_UserService_ListInvitations_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.UserService/ListInvitations", runtime.WithHTTPPathPattern("/api/v1/user/invitations")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_UserService_ListInvitations_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_ListInvitations_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_UserService_ResolveInvitation_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.UserService/ResolveInvitation", runtime.WithHTTPPathPattern("/api/v1/user/invitation/{code}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_UserService_ResolveInvitation_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_UserService_ResolveInvitation_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("DELETE", pattern_RepositoryService_DeleteRepositoryByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + return nil +} + +// RegisterProfileServiceHandlerServer registers the http handlers for service ProfileService to "mux". +// UnaryRPC :call ProfileServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterProfileServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterProfileServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ProfileServiceServer) error { + mux.Handle(http.MethodPost, pattern_ProfileService_CreateProfile_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/DeleteRepositoryByName", runtime.WithHTTPPathPattern("/api/v1/repository/provider/{provider}/name/{name=**}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProfileService/CreateProfile", runtime.WithHTTPPathPattern("/api/v1/profile")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_RepositoryService_DeleteRepositoryByName_0(annotatedContext, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_ProfileService_CreateProfile_0(annotatedContext, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - - forward_RepositoryService_DeleteRepositoryByName_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + forward_ProfileService_CreateProfile_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - - mux.Handle("DELETE", pattern_RepositoryService_DeleteRepositoryByName_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPut, pattern_ProfileService_UpdateProfile_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RepositoryService/DeleteRepositoryByName", runtime.WithHTTPPathPattern("/api/v1/repository/name/{name=**}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProfileService/UpdateProfile", runtime.WithHTTPPathPattern("/api/v1/profile")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_RepositoryService_DeleteRepositoryByName_1(annotatedContext, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_ProfileService_UpdateProfile_0(annotatedContext, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - - forward_RepositoryService_DeleteRepositoryByName_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + forward_ProfileService_UpdateProfile_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - - return nil -} - -// RegisterUserServiceHandlerServer registers the http handlers for service UserService to "mux". -// UnaryRPC :call UserServiceServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterUserServiceHandlerFromEndpoint instead. -// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. -func RegisterUserServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server UserServiceServer) error { - - mux.Handle("POST", pattern_UserService_CreateUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPatch, pattern_ProfileService_PatchProfile_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.UserService/CreateUser", runtime.WithHTTPPathPattern("/api/v1/user")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProfileService/PatchProfile", runtime.WithHTTPPathPattern("/api/v1/profile/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_UserService_CreateUser_0(annotatedContext, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_ProfileService_PatchProfile_0(annotatedContext, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - - forward_UserService_CreateUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + forward_ProfileService_PatchProfile_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - - mux.Handle("DELETE", pattern_UserService_DeleteUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_ProfileService_DeleteProfile_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.UserService/DeleteUser", runtime.WithHTTPPathPattern("/api/v1/user")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProfileService/DeleteProfile", runtime.WithHTTPPathPattern("/api/v1/profile/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_UserService_DeleteUser_0(annotatedContext, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_ProfileService_DeleteProfile_0(annotatedContext, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - - forward_UserService_DeleteUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + forward_ProfileService_DeleteProfile_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - - mux.Handle("GET", pattern_UserService_GetUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ProfileService_ListProfiles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.UserService/GetUser", runtime.WithHTTPPathPattern("/api/v1/user")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProfileService/ListProfiles", runtime.WithHTTPPathPattern("/api/v1/profiles")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_UserService_GetUser_0(annotatedContext, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_ProfileService_ListProfiles_0(annotatedContext, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - - forward_UserService_GetUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + forward_ProfileService_ListProfiles_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - - mux.Handle("GET", pattern_UserService_ListInvitations_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ProfileService_GetProfileById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.UserService/ListInvitations", runtime.WithHTTPPathPattern("/api/v1/user/invitations")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProfileService/GetProfileById", runtime.WithHTTPPathPattern("/api/v1/profile/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_UserService_ListInvitations_0(annotatedContext, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_ProfileService_GetProfileById_0(annotatedContext, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - - forward_UserService_ListInvitations_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + forward_ProfileService_GetProfileById_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - - mux.Handle("POST", pattern_UserService_ResolveInvitation_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ProfileService_GetProfileByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.UserService/ResolveInvitation", runtime.WithHTTPPathPattern("/api/v1/user/invitation/{code}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProfileService/GetProfileByName", runtime.WithHTTPPathPattern("/api/v1/profile/name/{name=**}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_UserService_ResolveInvitation_0(annotatedContext, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_ProfileService_GetProfileByName_0(annotatedContext, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - - forward_UserService_ResolveInvitation_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + forward_ProfileService_GetProfileByName_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - - return nil -} - -// RegisterProfileServiceHandlerServer registers the http handlers for service ProfileService to "mux". -// UnaryRPC :call ProfileServiceServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterProfileServiceHandlerFromEndpoint instead. -// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. -func RegisterProfileServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ProfileServiceServer) error { - - mux.Handle("POST", pattern_ProfileService_CreateProfile_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ProfileService_GetProfileStatusByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProfileService/CreateProfile", runtime.WithHTTPPathPattern("/api/v1/profile")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProfileService/GetProfileStatusByName", runtime.WithHTTPPathPattern("/api/v1/profile/name/{name=**}/status")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ProfileService_CreateProfile_0(annotatedContext, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_ProfileService_GetProfileStatusByName_0(annotatedContext, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - - forward_ProfileService_CreateProfile_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + forward_ProfileService_GetProfileStatusByName_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - - mux.Handle("PUT", pattern_ProfileService_UpdateProfile_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ProfileService_GetProfileStatusByProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProfileService/UpdateProfile", runtime.WithHTTPPathPattern("/api/v1/profile")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProfileService/GetProfileStatusByProject", runtime.WithHTTPPathPattern("/api/v1/profile_status")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ProfileService_UpdateProfile_0(annotatedContext, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_ProfileService_GetProfileStatusByProject_0(annotatedContext, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - - forward_ProfileService_UpdateProfile_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + forward_ProfileService_GetProfileStatusByProject_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("PATCH", pattern_ProfileService_PatchProfile_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + return nil +} + +// RegisterDataSourceServiceHandlerServer registers the http handlers for service DataSourceService to "mux". +// UnaryRPC :call DataSourceServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterDataSourceServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterDataSourceServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server DataSourceServiceServer) error { + mux.Handle(http.MethodPost, pattern_DataSourceService_CreateDataSource_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProfileService/PatchProfile", runtime.WithHTTPPathPattern("/api/v1/profile/{id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.DataSourceService/CreateDataSource", runtime.WithHTTPPathPattern("/api/v1/data_source")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ProfileService_PatchProfile_0(annotatedContext, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DataSourceService_CreateDataSource_0(annotatedContext, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - - forward_ProfileService_PatchProfile_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + forward_DataSourceService_CreateDataSource_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - - mux.Handle("DELETE", pattern_ProfileService_DeleteProfile_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_DataSourceService_GetDataSourceById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProfileService/DeleteProfile", runtime.WithHTTPPathPattern("/api/v1/profile/{id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.DataSourceService/GetDataSourceById", runtime.WithHTTPPathPattern("/api/v1/data_source/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ProfileService_DeleteProfile_0(annotatedContext, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DataSourceService_GetDataSourceById_0(annotatedContext, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - - forward_ProfileService_DeleteProfile_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + forward_DataSourceService_GetDataSourceById_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - - mux.Handle("GET", pattern_ProfileService_ListProfiles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_DataSourceService_GetDataSourceByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProfileService/ListProfiles", runtime.WithHTTPPathPattern("/api/v1/profiles")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.DataSourceService/GetDataSourceByName", runtime.WithHTTPPathPattern("/api/v1/data_source/name/{name=**}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ProfileService_ListProfiles_0(annotatedContext, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DataSourceService_GetDataSourceByName_0(annotatedContext, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - - forward_ProfileService_ListProfiles_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + forward_DataSourceService_GetDataSourceByName_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - - mux.Handle("GET", pattern_ProfileService_GetProfileById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_DataSourceService_ListDataSources_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProfileService/GetProfileById", runtime.WithHTTPPathPattern("/api/v1/profile/{id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.DataSourceService/ListDataSources", runtime.WithHTTPPathPattern("/api/v1/data_sources")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ProfileService_GetProfileById_0(annotatedContext, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DataSourceService_ListDataSources_0(annotatedContext, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - - forward_ProfileService_GetProfileById_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + forward_DataSourceService_ListDataSources_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - - mux.Handle("GET", pattern_ProfileService_GetProfileByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPut, pattern_DataSourceService_UpdateDataSource_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProfileService/GetProfileByName", runtime.WithHTTPPathPattern("/api/v1/profile/name/{name=**}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.DataSourceService/UpdateDataSource", runtime.WithHTTPPathPattern("/api/v1/data_source")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ProfileService_GetProfileByName_0(annotatedContext, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DataSourceService_UpdateDataSource_0(annotatedContext, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - - forward_ProfileService_GetProfileByName_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + forward_DataSourceService_UpdateDataSource_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - - mux.Handle("GET", pattern_ProfileService_GetProfileStatusByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_DataSourceService_DeleteDataSourceById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProfileService/GetProfileStatusByName", runtime.WithHTTPPathPattern("/api/v1/profile/name/{name=**}/status")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.DataSourceService/DeleteDataSourceById", runtime.WithHTTPPathPattern("/api/v1/data_source/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ProfileService_GetProfileStatusByName_0(annotatedContext, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DataSourceService_DeleteDataSourceById_0(annotatedContext, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - - forward_ProfileService_GetProfileStatusByName_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + forward_DataSourceService_DeleteDataSourceById_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - - mux.Handle("GET", pattern_ProfileService_GetProfileStatusByProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_DataSourceService_DeleteDataSourceByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProfileService/GetProfileStatusByProject", runtime.WithHTTPPathPattern("/api/v1/profile_status")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.DataSourceService/DeleteDataSourceByName", runtime.WithHTTPPathPattern("/api/v1/data_source/name/{name=**}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ProfileService_GetProfileStatusByProject_0(annotatedContext, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DataSourceService_DeleteDataSourceByName_0(annotatedContext, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - - forward_ProfileService_GetProfileStatusByProject_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + forward_DataSourceService_DeleteDataSourceByName_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) return nil @@ -4338,16 +3857,13 @@ func RegisterProfileServiceHandlerServer(ctx context.Context, mux *runtime.Serve // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterRuleTypeServiceHandlerFromEndpoint instead. // GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. func RegisterRuleTypeServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server RuleTypeServiceServer) error { - - mux.Handle("GET", pattern_RuleTypeService_ListRuleTypes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RuleTypeService_ListRuleTypes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RuleTypeService/ListRuleTypes", runtime.WithHTTPPathPattern("/api/v1/rule_types")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RuleTypeService/ListRuleTypes", runtime.WithHTTPPathPattern("/api/v1/rule_types")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4359,20 +3875,15 @@ func RegisterRuleTypeServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RuleTypeService_ListRuleTypes_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RuleTypeService_GetRuleTypeByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RuleTypeService_GetRuleTypeByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RuleTypeService/GetRuleTypeByName", runtime.WithHTTPPathPattern("/api/v1/rule_type/name/{name=**}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RuleTypeService/GetRuleTypeByName", runtime.WithHTTPPathPattern("/api/v1/rule_type/name/{name=**}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4384,20 +3895,15 @@ func RegisterRuleTypeServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RuleTypeService_GetRuleTypeByName_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RuleTypeService_GetRuleTypeById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RuleTypeService_GetRuleTypeById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RuleTypeService/GetRuleTypeById", runtime.WithHTTPPathPattern("/api/v1/rule_type/{id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RuleTypeService/GetRuleTypeById", runtime.WithHTTPPathPattern("/api/v1/rule_type/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4409,20 +3915,15 @@ func RegisterRuleTypeServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RuleTypeService_GetRuleTypeById_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_RuleTypeService_CreateRuleType_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_RuleTypeService_CreateRuleType_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RuleTypeService/CreateRuleType", runtime.WithHTTPPathPattern("/api/v1/rule_type")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RuleTypeService/CreateRuleType", runtime.WithHTTPPathPattern("/api/v1/rule_type")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4434,20 +3935,15 @@ func RegisterRuleTypeServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RuleTypeService_CreateRuleType_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("PUT", pattern_RuleTypeService_UpdateRuleType_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPut, pattern_RuleTypeService_UpdateRuleType_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RuleTypeService/UpdateRuleType", runtime.WithHTTPPathPattern("/api/v1/rule_type")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RuleTypeService/UpdateRuleType", runtime.WithHTTPPathPattern("/api/v1/rule_type")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4459,20 +3955,15 @@ func RegisterRuleTypeServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RuleTypeService_UpdateRuleType_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_RuleTypeService_DeleteRuleType_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_RuleTypeService_DeleteRuleType_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RuleTypeService/DeleteRuleType", runtime.WithHTTPPathPattern("/api/v1/rule_type/{id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.RuleTypeService/DeleteRuleType", runtime.WithHTTPPathPattern("/api/v1/rule_type/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4484,9 +3975,7 @@ func RegisterRuleTypeServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RuleTypeService_DeleteRuleType_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) return nil @@ -4498,16 +3987,13 @@ func RegisterRuleTypeServiceHandlerServer(ctx context.Context, mux *runtime.Serv // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterEvalResultsServiceHandlerFromEndpoint instead. // GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. func RegisterEvalResultsServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server EvalResultsServiceServer) error { - - mux.Handle("GET", pattern_EvalResultsService_ListEvaluationResults_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_EvalResultsService_ListEvaluationResults_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.EvalResultsService/ListEvaluationResults", runtime.WithHTTPPathPattern("/api/v1/results")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.EvalResultsService/ListEvaluationResults", runtime.WithHTTPPathPattern("/api/v1/results")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4519,20 +4005,15 @@ func RegisterEvalResultsServiceHandlerServer(ctx context.Context, mux *runtime.S runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_EvalResultsService_ListEvaluationResults_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_EvalResultsService_ListEvaluationHistory_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_EvalResultsService_ListEvaluationHistory_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.EvalResultsService/ListEvaluationHistory", runtime.WithHTTPPathPattern("/api/v1/history")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.EvalResultsService/ListEvaluationHistory", runtime.WithHTTPPathPattern("/api/v1/history")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4544,20 +4025,15 @@ func RegisterEvalResultsServiceHandlerServer(ctx context.Context, mux *runtime.S runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_EvalResultsService_ListEvaluationHistory_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_EvalResultsService_GetEvaluationHistory_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_EvalResultsService_GetEvaluationHistory_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.EvalResultsService/GetEvaluationHistory", runtime.WithHTTPPathPattern("/api/v1/history/{id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.EvalResultsService/GetEvaluationHistory", runtime.WithHTTPPathPattern("/api/v1/history/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4569,9 +4045,7 @@ func RegisterEvalResultsServiceHandlerServer(ctx context.Context, mux *runtime.S runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_EvalResultsService_GetEvaluationHistory_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) return nil @@ -4583,16 +4057,13 @@ func RegisterEvalResultsServiceHandlerServer(ctx context.Context, mux *runtime.S // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterPermissionsServiceHandlerFromEndpoint instead. // GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. func RegisterPermissionsServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server PermissionsServiceServer) error { - - mux.Handle("GET", pattern_PermissionsService_ListRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_PermissionsService_ListRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.PermissionsService/ListRoles", runtime.WithHTTPPathPattern("/api/v1/permissions/roles")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.PermissionsService/ListRoles", runtime.WithHTTPPathPattern("/api/v1/permissions/roles")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4604,20 +4075,15 @@ func RegisterPermissionsServiceHandlerServer(ctx context.Context, mux *runtime.S runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_PermissionsService_ListRoles_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_PermissionsService_ListRoleAssignments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_PermissionsService_ListRoleAssignments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.PermissionsService/ListRoleAssignments", runtime.WithHTTPPathPattern("/api/v1/permissions/assignments")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.PermissionsService/ListRoleAssignments", runtime.WithHTTPPathPattern("/api/v1/permissions/assignments")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4629,20 +4095,15 @@ func RegisterPermissionsServiceHandlerServer(ctx context.Context, mux *runtime.S runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_PermissionsService_ListRoleAssignments_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_PermissionsService_AssignRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_PermissionsService_AssignRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.PermissionsService/AssignRole", runtime.WithHTTPPathPattern("/api/v1/permissions/assign")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.PermissionsService/AssignRole", runtime.WithHTTPPathPattern("/api/v1/permissions/assign")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4654,20 +4115,15 @@ func RegisterPermissionsServiceHandlerServer(ctx context.Context, mux *runtime.S runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_PermissionsService_AssignRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_PermissionsService_UpdateRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_PermissionsService_UpdateRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.PermissionsService/UpdateRole", runtime.WithHTTPPathPattern("/api/v1/permissions/update")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.PermissionsService/UpdateRole", runtime.WithHTTPPathPattern("/api/v1/permissions/update")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4679,20 +4135,15 @@ func RegisterPermissionsServiceHandlerServer(ctx context.Context, mux *runtime.S runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_PermissionsService_UpdateRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_PermissionsService_RemoveRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_PermissionsService_RemoveRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.PermissionsService/RemoveRole", runtime.WithHTTPPathPattern("/api/v1/permissions/remove")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.PermissionsService/RemoveRole", runtime.WithHTTPPathPattern("/api/v1/permissions/remove")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4704,9 +4155,7 @@ func RegisterPermissionsServiceHandlerServer(ctx context.Context, mux *runtime.S runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_PermissionsService_RemoveRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) return nil @@ -4718,16 +4167,13 @@ func RegisterPermissionsServiceHandlerServer(ctx context.Context, mux *runtime.S // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterProjectsServiceHandlerFromEndpoint instead. // GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. func RegisterProjectsServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ProjectsServiceServer) error { - - mux.Handle("GET", pattern_ProjectsService_ListProjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ProjectsService_ListProjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProjectsService/ListProjects", runtime.WithHTTPPathPattern("/api/v1/projects")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProjectsService/ListProjects", runtime.WithHTTPPathPattern("/api/v1/projects")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4739,20 +4185,15 @@ func RegisterProjectsServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProjectsService_ListProjects_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_ProjectsService_CreateProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_ProjectsService_CreateProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProjectsService/CreateProject", runtime.WithHTTPPathPattern("/api/v1/projects")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProjectsService/CreateProject", runtime.WithHTTPPathPattern("/api/v1/projects")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4764,20 +4205,15 @@ func RegisterProjectsServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProjectsService_CreateProject_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_ProjectsService_ListChildProjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ProjectsService_ListChildProjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProjectsService/ListChildProjects", runtime.WithHTTPPathPattern("/api/v1/projects/{context.project_id}/children")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProjectsService/ListChildProjects", runtime.WithHTTPPathPattern("/api/v1/projects/{context.project_id}/children")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4789,20 +4225,15 @@ func RegisterProjectsServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProjectsService_ListChildProjects_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_ProjectsService_DeleteProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_ProjectsService_DeleteProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProjectsService/DeleteProject", runtime.WithHTTPPathPattern("/api/v1/projects")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProjectsService/DeleteProject", runtime.WithHTTPPathPattern("/api/v1/projects")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4814,20 +4245,15 @@ func RegisterProjectsServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProjectsService_DeleteProject_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("PUT", pattern_ProjectsService_UpdateProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPut, pattern_ProjectsService_UpdateProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProjectsService/UpdateProject", runtime.WithHTTPPathPattern("/api/v1/projects")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProjectsService/UpdateProject", runtime.WithHTTPPathPattern("/api/v1/projects")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4839,20 +4265,15 @@ func RegisterProjectsServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProjectsService_UpdateProject_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("PATCH", pattern_ProjectsService_PatchProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPatch, pattern_ProjectsService_PatchProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProjectsService/PatchProject", runtime.WithHTTPPathPattern("/api/v1/projects")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProjectsService/PatchProject", runtime.WithHTTPPathPattern("/api/v1/projects")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4864,20 +4285,15 @@ func RegisterProjectsServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProjectsService_PatchProject_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_ProjectsService_CreateEntityReconciliationTask_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_ProjectsService_CreateEntityReconciliationTask_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProjectsService/CreateEntityReconciliationTask", runtime.WithHTTPPathPattern("/api/v1/projects/entity/reconcile")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProjectsService/CreateEntityReconciliationTask", runtime.WithHTTPPathPattern("/api/v1/projects/entity/reconcile")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4889,9 +4305,7 @@ func RegisterProjectsServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProjectsService_CreateEntityReconciliationTask_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) return nil @@ -4903,16 +4317,13 @@ func RegisterProjectsServiceHandlerServer(ctx context.Context, mux *runtime.Serv // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterProvidersServiceHandlerFromEndpoint instead. // GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. func RegisterProvidersServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ProvidersServiceServer) error { - - mux.Handle("PATCH", pattern_ProvidersService_PatchProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPatch, pattern_ProvidersService_PatchProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProvidersService/PatchProvider", runtime.WithHTTPPathPattern("/api/v1/providers")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProvidersService/PatchProvider", runtime.WithHTTPPathPattern("/api/v1/providers")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4924,20 +4335,15 @@ func RegisterProvidersServiceHandlerServer(ctx context.Context, mux *runtime.Ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProvidersService_PatchProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_ProvidersService_GetProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ProvidersService_GetProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProvidersService/GetProvider", runtime.WithHTTPPathPattern("/api/v1/providers/{name}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProvidersService/GetProvider", runtime.WithHTTPPathPattern("/api/v1/providers/{name}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4949,20 +4355,15 @@ func RegisterProvidersServiceHandlerServer(ctx context.Context, mux *runtime.Ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProvidersService_GetProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_ProvidersService_ListProviders_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ProvidersService_ListProviders_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProvidersService/ListProviders", runtime.WithHTTPPathPattern("/api/v1/providers")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProvidersService/ListProviders", runtime.WithHTTPPathPattern("/api/v1/providers")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4974,20 +4375,15 @@ func RegisterProvidersServiceHandlerServer(ctx context.Context, mux *runtime.Ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProvidersService_ListProviders_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_ProvidersService_CreateProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_ProvidersService_CreateProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProvidersService/CreateProvider", runtime.WithHTTPPathPattern("/api/v1/providers")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProvidersService/CreateProvider", runtime.WithHTTPPathPattern("/api/v1/providers")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4999,20 +4395,15 @@ func RegisterProvidersServiceHandlerServer(ctx context.Context, mux *runtime.Ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProvidersService_CreateProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_ProvidersService_DeleteProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_ProvidersService_DeleteProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProvidersService/DeleteProvider", runtime.WithHTTPPathPattern("/api/v1/providers")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProvidersService/DeleteProvider", runtime.WithHTTPPathPattern("/api/v1/providers")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5024,20 +4415,15 @@ func RegisterProvidersServiceHandlerServer(ctx context.Context, mux *runtime.Ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProvidersService_DeleteProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_ProvidersService_DeleteProviderByID_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_ProvidersService_DeleteProviderByID_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProvidersService/DeleteProviderByID", runtime.WithHTTPPathPattern("/api/v1/providers/{id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProvidersService/DeleteProviderByID", runtime.WithHTTPPathPattern("/api/v1/providers/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5049,45 +4435,15 @@ func RegisterProvidersServiceHandlerServer(ctx context.Context, mux *runtime.Ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProvidersService_DeleteProviderByID_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_ProvidersService_GetUnclaimedProviders_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProvidersService/GetUnclaimedProviders", runtime.WithHTTPPathPattern("/api/v1/my/providers")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ProvidersService_GetUnclaimedProviders_0(annotatedContext, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - - forward_ProvidersService_GetUnclaimedProviders_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_ProvidersService_ListProviderClasses_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ProvidersService_ListProviderClasses_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProvidersService/ListProviderClasses", runtime.WithHTTPPathPattern("/api/v1/provider_classes")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProvidersService/ListProviderClasses", runtime.WithHTTPPathPattern("/api/v1/provider_classes")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5099,20 +4455,15 @@ func RegisterProvidersServiceHandlerServer(ctx context.Context, mux *runtime.Ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProvidersService_ListProviderClasses_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_ProvidersService_ReconcileEntityRegistration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_ProvidersService_ReconcileEntityRegistration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProvidersService/ReconcileEntityRegistration", runtime.WithHTTPPathPattern("/api/v1/provider/register_all")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.ProvidersService/ReconcileEntityRegistration", runtime.WithHTTPPathPattern("/api/v1/provider/register_all")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5124,9 +4475,7 @@ func RegisterProvidersServiceHandlerServer(ctx context.Context, mux *runtime.Ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProvidersService_ReconcileEntityRegistration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) return nil @@ -5138,16 +4487,13 @@ func RegisterProvidersServiceHandlerServer(ctx context.Context, mux *runtime.Ser // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterInviteServiceHandlerFromEndpoint instead. // GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. func RegisterInviteServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server InviteServiceServer) error { - - mux.Handle("GET", pattern_InviteService_GetInviteDetails_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_InviteService_GetInviteDetails_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.InviteService/GetInviteDetails", runtime.WithHTTPPathPattern("/api/v1/invite/{code}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/minder.v1.InviteService/GetInviteDetails", runtime.WithHTTPPathPattern("/api/v1/invite/{code}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5159,9 +4505,7 @@ func RegisterInviteServiceHandlerServer(ctx context.Context, mux *runtime.ServeM runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_InviteService_GetInviteDetails_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) return nil @@ -5188,7 +4532,6 @@ func RegisterHealthServiceHandlerFromEndpoint(ctx context.Context, mux *runtime. } }() }() - return RegisterHealthServiceHandler(ctx, mux, conn) } @@ -5204,14 +4547,11 @@ func RegisterHealthServiceHandler(ctx context.Context, mux *runtime.ServeMux, co // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "HealthServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterHealthServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client HealthServiceClient) error { - - mux.Handle("GET", pattern_HealthService_CheckHealth_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_HealthService_CheckHealth_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.HealthService/CheckHealth", runtime.WithHTTPPathPattern("/api/v1/health")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.HealthService/CheckHealth", runtime.WithHTTPPathPattern("/api/v1/health")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5222,11 +4562,8 @@ func RegisterHealthServiceHandlerClient(ctx context.Context, mux *runtime.ServeM runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_HealthService_CheckHealth_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil } @@ -5259,7 +4596,6 @@ func RegisterArtifactServiceHandlerFromEndpoint(ctx context.Context, mux *runtim } }() }() - return RegisterArtifactServiceHandler(ctx, mux, conn) } @@ -5275,14 +4611,11 @@ func RegisterArtifactServiceHandler(ctx context.Context, mux *runtime.ServeMux, // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "ArtifactServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterArtifactServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ArtifactServiceClient) error { - - mux.Handle("GET", pattern_ArtifactService_ListArtifacts_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ArtifactService_ListArtifacts_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ArtifactService/ListArtifacts", runtime.WithHTTPPathPattern("/api/v1/artifacts/{provider}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ArtifactService/ListArtifacts", runtime.WithHTTPPathPattern("/api/v1/artifacts/{provider}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5293,18 +4626,13 @@ func RegisterArtifactServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ArtifactService_ListArtifacts_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_ArtifactService_ListArtifacts_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ArtifactService_ListArtifacts_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ArtifactService/ListArtifacts", runtime.WithHTTPPathPattern("/api/v1/artifacts")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ArtifactService/ListArtifacts", runtime.WithHTTPPathPattern("/api/v1/artifacts")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5315,18 +4643,13 @@ func RegisterArtifactServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ArtifactService_ListArtifacts_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_ArtifactService_GetArtifactById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ArtifactService_GetArtifactById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ArtifactService/GetArtifactById", runtime.WithHTTPPathPattern("/api/v1/artifact/{id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ArtifactService/GetArtifactById", runtime.WithHTTPPathPattern("/api/v1/artifact/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5337,18 +4660,13 @@ func RegisterArtifactServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ArtifactService_GetArtifactById_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_ArtifactService_GetArtifactByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ArtifactService_GetArtifactByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ArtifactService/GetArtifactByName", runtime.WithHTTPPathPattern("/api/v1/artifact/name/{name=**}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ArtifactService/GetArtifactByName", runtime.WithHTTPPathPattern("/api/v1/artifact/name/{name=**}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5359,31 +4677,22 @@ func RegisterArtifactServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ArtifactService_GetArtifactByName_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil } var ( - pattern_ArtifactService_ListArtifacts_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "artifacts", "provider"}, "")) - - pattern_ArtifactService_ListArtifacts_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "artifacts"}, "")) - - pattern_ArtifactService_GetArtifactById_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "artifact", "id"}, "")) - + pattern_ArtifactService_ListArtifacts_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "artifacts", "provider"}, "")) + pattern_ArtifactService_ListArtifacts_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "artifacts"}, "")) + pattern_ArtifactService_GetArtifactById_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "artifact", "id"}, "")) pattern_ArtifactService_GetArtifactByName_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 3, 0, 4, 1, 5, 3}, []string{"api", "v1", "artifact", "name"}, "")) ) var ( - forward_ArtifactService_ListArtifacts_0 = runtime.ForwardResponseMessage - - forward_ArtifactService_ListArtifacts_1 = runtime.ForwardResponseMessage - - forward_ArtifactService_GetArtifactById_0 = runtime.ForwardResponseMessage - + forward_ArtifactService_ListArtifacts_0 = runtime.ForwardResponseMessage + forward_ArtifactService_ListArtifacts_1 = runtime.ForwardResponseMessage + forward_ArtifactService_GetArtifactById_0 = runtime.ForwardResponseMessage forward_ArtifactService_GetArtifactByName_0 = runtime.ForwardResponseMessage ) @@ -5408,7 +4717,6 @@ func RegisterOAuthServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.S } }() }() - return RegisterOAuthServiceHandler(ctx, mux, conn) } @@ -5424,14 +4732,11 @@ func RegisterOAuthServiceHandler(ctx context.Context, mux *runtime.ServeMux, con // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "OAuthServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterOAuthServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client OAuthServiceClient) error { - - mux.Handle("GET", pattern_OAuthService_GetAuthorizationURL_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_OAuthService_GetAuthorizationURL_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.OAuthService/GetAuthorizationURL", runtime.WithHTTPPathPattern("/api/v1/auth/url")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.OAuthService/GetAuthorizationURL", runtime.WithHTTPPathPattern("/api/v1/auth/url")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5442,18 +4747,13 @@ func RegisterOAuthServiceHandlerClient(ctx context.Context, mux *runtime.ServeMu runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_OAuthService_GetAuthorizationURL_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_OAuthService_StoreProviderToken_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_OAuthService_StoreProviderToken_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.OAuthService/StoreProviderToken", runtime.WithHTTPPathPattern("/api/v1/auth/{provider}/token")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.OAuthService/StoreProviderToken", runtime.WithHTTPPathPattern("/api/v1/auth/{provider}/token")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5464,18 +4764,13 @@ func RegisterOAuthServiceHandlerClient(ctx context.Context, mux *runtime.ServeMu runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_OAuthService_StoreProviderToken_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_OAuthService_StoreProviderToken_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_OAuthService_StoreProviderToken_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.OAuthService/StoreProviderToken", runtime.WithHTTPPathPattern("/api/v1/auth/token")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.OAuthService/StoreProviderToken", runtime.WithHTTPPathPattern("/api/v1/auth/token")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5486,18 +4781,13 @@ func RegisterOAuthServiceHandlerClient(ctx context.Context, mux *runtime.ServeMu runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_OAuthService_StoreProviderToken_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_OAuthService_VerifyProviderTokenFrom_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_OAuthService_VerifyProviderTokenFrom_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.OAuthService/VerifyProviderTokenFrom", runtime.WithHTTPPathPattern("/api/v1/auth/verify/{provider}/{timestamp}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.OAuthService/VerifyProviderTokenFrom", runtime.WithHTTPPathPattern("/api/v1/auth/verify/{provider}/{timestamp}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5508,18 +4798,13 @@ func RegisterOAuthServiceHandlerClient(ctx context.Context, mux *runtime.ServeMu runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_OAuthService_VerifyProviderTokenFrom_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_OAuthService_VerifyProviderTokenFrom_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_OAuthService_VerifyProviderTokenFrom_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.OAuthService/VerifyProviderTokenFrom", runtime.WithHTTPPathPattern("/api/v1/auth/verify/{timestamp}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.OAuthService/VerifyProviderTokenFrom", runtime.WithHTTPPathPattern("/api/v1/auth/verify/{timestamp}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5530,18 +4815,13 @@ func RegisterOAuthServiceHandlerClient(ctx context.Context, mux *runtime.ServeMu runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_OAuthService_VerifyProviderTokenFrom_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_OAuthService_VerifyProviderCredential_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_OAuthService_VerifyProviderCredential_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.OAuthService/VerifyProviderCredential", runtime.WithHTTPPathPattern("/api/v1/auth/verify")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.OAuthService/VerifyProviderCredential", runtime.WithHTTPPathPattern("/api/v1/auth/verify")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5552,39 +4832,26 @@ func RegisterOAuthServiceHandlerClient(ctx context.Context, mux *runtime.ServeMu runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_OAuthService_VerifyProviderCredential_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil } var ( - pattern_OAuthService_GetAuthorizationURL_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "auth", "url"}, "")) - - pattern_OAuthService_StoreProviderToken_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "auth", "provider", "token"}, "")) - - pattern_OAuthService_StoreProviderToken_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "auth", "token"}, "")) - - pattern_OAuthService_VerifyProviderTokenFrom_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 1, 0, 4, 1, 5, 5}, []string{"api", "v1", "auth", "verify", "provider", "timestamp"}, "")) - - pattern_OAuthService_VerifyProviderTokenFrom_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"api", "v1", "auth", "verify", "timestamp"}, "")) - + pattern_OAuthService_GetAuthorizationURL_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "auth", "url"}, "")) + pattern_OAuthService_StoreProviderToken_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "auth", "provider", "token"}, "")) + pattern_OAuthService_StoreProviderToken_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "auth", "token"}, "")) + pattern_OAuthService_VerifyProviderTokenFrom_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 1, 0, 4, 1, 5, 5}, []string{"api", "v1", "auth", "verify", "provider", "timestamp"}, "")) + pattern_OAuthService_VerifyProviderTokenFrom_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"api", "v1", "auth", "verify", "timestamp"}, "")) pattern_OAuthService_VerifyProviderCredential_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "auth", "verify"}, "")) ) var ( - forward_OAuthService_GetAuthorizationURL_0 = runtime.ForwardResponseMessage - - forward_OAuthService_StoreProviderToken_0 = runtime.ForwardResponseMessage - - forward_OAuthService_StoreProviderToken_1 = runtime.ForwardResponseMessage - - forward_OAuthService_VerifyProviderTokenFrom_0 = runtime.ForwardResponseMessage - - forward_OAuthService_VerifyProviderTokenFrom_1 = runtime.ForwardResponseMessage - + forward_OAuthService_GetAuthorizationURL_0 = runtime.ForwardResponseMessage + forward_OAuthService_StoreProviderToken_0 = runtime.ForwardResponseMessage + forward_OAuthService_StoreProviderToken_1 = runtime.ForwardResponseMessage + forward_OAuthService_VerifyProviderTokenFrom_0 = runtime.ForwardResponseMessage + forward_OAuthService_VerifyProviderTokenFrom_1 = runtime.ForwardResponseMessage forward_OAuthService_VerifyProviderCredential_0 = runtime.ForwardResponseMessage ) @@ -5609,7 +4876,6 @@ func RegisterRepositoryServiceHandlerFromEndpoint(ctx context.Context, mux *runt } }() }() - return RegisterRepositoryServiceHandler(ctx, mux, conn) } @@ -5625,14 +4891,11 @@ func RegisterRepositoryServiceHandler(ctx context.Context, mux *runtime.ServeMux // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "RepositoryServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterRepositoryServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client RepositoryServiceClient) error { - - mux.Handle("POST", pattern_RepositoryService_RegisterRepository_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_RepositoryService_RegisterRepository_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/RegisterRepository", runtime.WithHTTPPathPattern("/api/v1/repository/provider/{provider}/register")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/RegisterRepository", runtime.WithHTTPPathPattern("/api/v1/repository/provider/{provider}/register")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5643,18 +4906,13 @@ func RegisterRepositoryServiceHandlerClient(ctx context.Context, mux *runtime.Se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RepositoryService_RegisterRepository_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_RepositoryService_RegisterRepository_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_RepositoryService_RegisterRepository_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/RegisterRepository", runtime.WithHTTPPathPattern("/api/v1/repository/register")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/RegisterRepository", runtime.WithHTTPPathPattern("/api/v1/repository/register")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5665,18 +4923,13 @@ func RegisterRepositoryServiceHandlerClient(ctx context.Context, mux *runtime.Se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RepositoryService_RegisterRepository_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RepositoryService_ListRemoteRepositoriesFromProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RepositoryService_ListRemoteRepositoriesFromProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/ListRemoteRepositoriesFromProvider", runtime.WithHTTPPathPattern("/api/v1/repositories/provider/{provider}/remote")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/ListRemoteRepositoriesFromProvider", runtime.WithHTTPPathPattern("/api/v1/repositories/provider/{provider}/remote")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5687,18 +4940,13 @@ func RegisterRepositoryServiceHandlerClient(ctx context.Context, mux *runtime.Se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RepositoryService_ListRemoteRepositoriesFromProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RepositoryService_ListRemoteRepositoriesFromProvider_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RepositoryService_ListRemoteRepositoriesFromProvider_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/ListRemoteRepositoriesFromProvider", runtime.WithHTTPPathPattern("/api/v1/repositories/remote")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/ListRemoteRepositoriesFromProvider", runtime.WithHTTPPathPattern("/api/v1/repositories/remote")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5709,18 +4957,13 @@ func RegisterRepositoryServiceHandlerClient(ctx context.Context, mux *runtime.Se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RepositoryService_ListRemoteRepositoriesFromProvider_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RepositoryService_ListRepositories_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RepositoryService_ListRepositories_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/ListRepositories", runtime.WithHTTPPathPattern("/api/v1/repositories/provider/{provider}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/ListRepositories", runtime.WithHTTPPathPattern("/api/v1/repositories/provider/{provider}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5731,18 +4974,13 @@ func RegisterRepositoryServiceHandlerClient(ctx context.Context, mux *runtime.Se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RepositoryService_ListRepositories_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RepositoryService_ListRepositories_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RepositoryService_ListRepositories_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/ListRepositories", runtime.WithHTTPPathPattern("/api/v1/repositories")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/ListRepositories", runtime.WithHTTPPathPattern("/api/v1/repositories")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5753,18 +4991,13 @@ func RegisterRepositoryServiceHandlerClient(ctx context.Context, mux *runtime.Se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RepositoryService_ListRepositories_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RepositoryService_GetRepositoryById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RepositoryService_GetRepositoryById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/GetRepositoryById", runtime.WithHTTPPathPattern("/api/v1/repository/id/{repository_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/GetRepositoryById", runtime.WithHTTPPathPattern("/api/v1/repository/id/{repository_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5775,18 +5008,13 @@ func RegisterRepositoryServiceHandlerClient(ctx context.Context, mux *runtime.Se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RepositoryService_GetRepositoryById_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RepositoryService_GetRepositoryByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RepositoryService_GetRepositoryByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/GetRepositoryByName", runtime.WithHTTPPathPattern("/api/v1/repository/provider/{provider}/name/{name=**}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/GetRepositoryByName", runtime.WithHTTPPathPattern("/api/v1/repository/provider/{provider}/name/{name=**}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5797,18 +5025,13 @@ func RegisterRepositoryServiceHandlerClient(ctx context.Context, mux *runtime.Se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RepositoryService_GetRepositoryByName_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RepositoryService_GetRepositoryByName_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RepositoryService_GetRepositoryByName_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/GetRepositoryByName", runtime.WithHTTPPathPattern("/api/v1/repository/name/{name=**}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/GetRepositoryByName", runtime.WithHTTPPathPattern("/api/v1/repository/name/{name=**}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5819,18 +5042,13 @@ func RegisterRepositoryServiceHandlerClient(ctx context.Context, mux *runtime.Se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RepositoryService_GetRepositoryByName_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_RepositoryService_DeleteRepositoryById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_RepositoryService_DeleteRepositoryById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/DeleteRepositoryById", runtime.WithHTTPPathPattern("/api/v1/repository/id/{repository_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/DeleteRepositoryById", runtime.WithHTTPPathPattern("/api/v1/repository/id/{repository_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5841,18 +5059,13 @@ func RegisterRepositoryServiceHandlerClient(ctx context.Context, mux *runtime.Se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RepositoryService_DeleteRepositoryById_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_RepositoryService_DeleteRepositoryByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_RepositoryService_DeleteRepositoryByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/DeleteRepositoryByName", runtime.WithHTTPPathPattern("/api/v1/repository/provider/{provider}/name/{name=**}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/DeleteRepositoryByName", runtime.WithHTTPPathPattern("/api/v1/repository/provider/{provider}/name/{name=**}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5863,18 +5076,13 @@ func RegisterRepositoryServiceHandlerClient(ctx context.Context, mux *runtime.Se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RepositoryService_DeleteRepositoryByName_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_RepositoryService_DeleteRepositoryByName_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_RepositoryService_DeleteRepositoryByName_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/DeleteRepositoryByName", runtime.WithHTTPPathPattern("/api/v1/repository/name/{name=**}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RepositoryService/DeleteRepositoryByName", runtime.WithHTTPPathPattern("/api/v1/repository/name/{name=**}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5885,64 +5093,39 @@ func RegisterRepositoryServiceHandlerClient(ctx context.Context, mux *runtime.Se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RepositoryService_DeleteRepositoryByName_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil } var ( - pattern_RepositoryService_RegisterRepository_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "repository", "provider", "register"}, "")) - - pattern_RepositoryService_RegisterRepository_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "repository", "register"}, "")) - + pattern_RepositoryService_RegisterRepository_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "repository", "provider", "register"}, "")) + pattern_RepositoryService_RegisterRepository_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "repository", "register"}, "")) pattern_RepositoryService_ListRemoteRepositoriesFromProvider_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "repositories", "provider", "remote"}, "")) - pattern_RepositoryService_ListRemoteRepositoriesFromProvider_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "repositories", "remote"}, "")) - - pattern_RepositoryService_ListRepositories_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "repositories", "provider"}, "")) - - pattern_RepositoryService_ListRepositories_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "repositories"}, "")) - - pattern_RepositoryService_GetRepositoryById_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"api", "v1", "repository", "id", "repository_id"}, "")) - - pattern_RepositoryService_GetRepositoryByName_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 3, 2, 4, 3, 0, 4, 1, 5, 4}, []string{"api", "v1", "repository", "provider", "name"}, "")) - - pattern_RepositoryService_GetRepositoryByName_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 3, 0, 4, 1, 5, 3}, []string{"api", "v1", "repository", "name"}, "")) - - pattern_RepositoryService_DeleteRepositoryById_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"api", "v1", "repository", "id", "repository_id"}, "")) - - pattern_RepositoryService_DeleteRepositoryByName_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 3, 2, 4, 3, 0, 4, 1, 5, 4}, []string{"api", "v1", "repository", "provider", "name"}, "")) - - pattern_RepositoryService_DeleteRepositoryByName_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 3, 0, 4, 1, 5, 3}, []string{"api", "v1", "repository", "name"}, "")) + pattern_RepositoryService_ListRepositories_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "repositories", "provider"}, "")) + pattern_RepositoryService_ListRepositories_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "repositories"}, "")) + pattern_RepositoryService_GetRepositoryById_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"api", "v1", "repository", "id", "repository_id"}, "")) + pattern_RepositoryService_GetRepositoryByName_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 3, 2, 4, 3, 0, 4, 1, 5, 4}, []string{"api", "v1", "repository", "provider", "name"}, "")) + pattern_RepositoryService_GetRepositoryByName_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 3, 0, 4, 1, 5, 3}, []string{"api", "v1", "repository", "name"}, "")) + pattern_RepositoryService_DeleteRepositoryById_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"api", "v1", "repository", "id", "repository_id"}, "")) + pattern_RepositoryService_DeleteRepositoryByName_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 3, 2, 4, 3, 0, 4, 1, 5, 4}, []string{"api", "v1", "repository", "provider", "name"}, "")) + pattern_RepositoryService_DeleteRepositoryByName_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 3, 0, 4, 1, 5, 3}, []string{"api", "v1", "repository", "name"}, "")) ) var ( - forward_RepositoryService_RegisterRepository_0 = runtime.ForwardResponseMessage - - forward_RepositoryService_RegisterRepository_1 = runtime.ForwardResponseMessage - + forward_RepositoryService_RegisterRepository_0 = runtime.ForwardResponseMessage + forward_RepositoryService_RegisterRepository_1 = runtime.ForwardResponseMessage forward_RepositoryService_ListRemoteRepositoriesFromProvider_0 = runtime.ForwardResponseMessage - forward_RepositoryService_ListRemoteRepositoriesFromProvider_1 = runtime.ForwardResponseMessage - - forward_RepositoryService_ListRepositories_0 = runtime.ForwardResponseMessage - - forward_RepositoryService_ListRepositories_1 = runtime.ForwardResponseMessage - - forward_RepositoryService_GetRepositoryById_0 = runtime.ForwardResponseMessage - - forward_RepositoryService_GetRepositoryByName_0 = runtime.ForwardResponseMessage - - forward_RepositoryService_GetRepositoryByName_1 = runtime.ForwardResponseMessage - - forward_RepositoryService_DeleteRepositoryById_0 = runtime.ForwardResponseMessage - - forward_RepositoryService_DeleteRepositoryByName_0 = runtime.ForwardResponseMessage - - forward_RepositoryService_DeleteRepositoryByName_1 = runtime.ForwardResponseMessage + forward_RepositoryService_ListRepositories_0 = runtime.ForwardResponseMessage + forward_RepositoryService_ListRepositories_1 = runtime.ForwardResponseMessage + forward_RepositoryService_GetRepositoryById_0 = runtime.ForwardResponseMessage + forward_RepositoryService_GetRepositoryByName_0 = runtime.ForwardResponseMessage + forward_RepositoryService_GetRepositoryByName_1 = runtime.ForwardResponseMessage + forward_RepositoryService_DeleteRepositoryById_0 = runtime.ForwardResponseMessage + forward_RepositoryService_DeleteRepositoryByName_0 = runtime.ForwardResponseMessage + forward_RepositoryService_DeleteRepositoryByName_1 = runtime.ForwardResponseMessage ) // RegisterUserServiceHandlerFromEndpoint is same as RegisterUserServiceHandler but @@ -5966,7 +5149,6 @@ func RegisterUserServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.Se } }() }() - return RegisterUserServiceHandler(ctx, mux, conn) } @@ -5982,14 +5164,11 @@ func RegisterUserServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "UserServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterUserServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client UserServiceClient) error { - - mux.Handle("POST", pattern_UserService_CreateUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_UserService_CreateUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.UserService/CreateUser", runtime.WithHTTPPathPattern("/api/v1/user")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.UserService/CreateUser", runtime.WithHTTPPathPattern("/api/v1/user")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6000,18 +5179,13 @@ func RegisterUserServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_UserService_CreateUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_UserService_DeleteUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_UserService_DeleteUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.UserService/DeleteUser", runtime.WithHTTPPathPattern("/api/v1/user")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.UserService/DeleteUser", runtime.WithHTTPPathPattern("/api/v1/user")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6022,18 +5196,13 @@ func RegisterUserServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_UserService_DeleteUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_UserService_GetUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_UserService_GetUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.UserService/GetUser", runtime.WithHTTPPathPattern("/api/v1/user")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.UserService/GetUser", runtime.WithHTTPPathPattern("/api/v1/user")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6044,18 +5213,13 @@ func RegisterUserServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_UserService_GetUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_UserService_ListInvitations_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_UserService_ListInvitations_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.UserService/ListInvitations", runtime.WithHTTPPathPattern("/api/v1/user/invitations")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.UserService/ListInvitations", runtime.WithHTTPPathPattern("/api/v1/user/invitations")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6066,18 +5230,13 @@ func RegisterUserServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_UserService_ListInvitations_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_UserService_ResolveInvitation_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_UserService_ResolveInvitation_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.UserService/ResolveInvitation", runtime.WithHTTPPathPattern("/api/v1/user/invitation/{code}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.UserService/ResolveInvitation", runtime.WithHTTPPathPattern("/api/v1/user/invitation/{code}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6088,35 +5247,24 @@ func RegisterUserServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_UserService_ResolveInvitation_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil } var ( - pattern_UserService_CreateUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "user"}, "")) - - pattern_UserService_DeleteUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "user"}, "")) - - pattern_UserService_GetUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "user"}, "")) - - pattern_UserService_ListInvitations_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "user", "invitations"}, "")) - + pattern_UserService_CreateUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "user"}, "")) + pattern_UserService_DeleteUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "user"}, "")) + pattern_UserService_GetUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "user"}, "")) + pattern_UserService_ListInvitations_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "user", "invitations"}, "")) pattern_UserService_ResolveInvitation_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"api", "v1", "user", "invitation", "code"}, "")) ) var ( - forward_UserService_CreateUser_0 = runtime.ForwardResponseMessage - - forward_UserService_DeleteUser_0 = runtime.ForwardResponseMessage - - forward_UserService_GetUser_0 = runtime.ForwardResponseMessage - - forward_UserService_ListInvitations_0 = runtime.ForwardResponseMessage - + forward_UserService_CreateUser_0 = runtime.ForwardResponseMessage + forward_UserService_DeleteUser_0 = runtime.ForwardResponseMessage + forward_UserService_GetUser_0 = runtime.ForwardResponseMessage + forward_UserService_ListInvitations_0 = runtime.ForwardResponseMessage forward_UserService_ResolveInvitation_0 = runtime.ForwardResponseMessage ) @@ -6141,7 +5289,6 @@ func RegisterProfileServiceHandlerFromEndpoint(ctx context.Context, mux *runtime } }() }() - return RegisterProfileServiceHandler(ctx, mux, conn) } @@ -6157,14 +5304,11 @@ func RegisterProfileServiceHandler(ctx context.Context, mux *runtime.ServeMux, c // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "ProfileServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterProfileServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ProfileServiceClient) error { - - mux.Handle("POST", pattern_ProfileService_CreateProfile_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_ProfileService_CreateProfile_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProfileService/CreateProfile", runtime.WithHTTPPathPattern("/api/v1/profile")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProfileService/CreateProfile", runtime.WithHTTPPathPattern("/api/v1/profile")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6175,228 +5319,347 @@ func RegisterProfileServiceHandlerClient(ctx context.Context, mux *runtime.Serve runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProfileService_CreateProfile_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) + mux.Handle(http.MethodPut, pattern_ProfileService_UpdateProfile_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProfileService/UpdateProfile", runtime.WithHTTPPathPattern("/api/v1/profile")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ProfileService_UpdateProfile_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ProfileService_UpdateProfile_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPatch, pattern_ProfileService_PatchProfile_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProfileService/PatchProfile", runtime.WithHTTPPathPattern("/api/v1/profile/{id}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ProfileService_PatchProfile_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ProfileService_PatchProfile_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodDelete, pattern_ProfileService_DeleteProfile_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProfileService/DeleteProfile", runtime.WithHTTPPathPattern("/api/v1/profile/{id}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ProfileService_DeleteProfile_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ProfileService_DeleteProfile_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ProfileService_ListProfiles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProfileService/ListProfiles", runtime.WithHTTPPathPattern("/api/v1/profiles")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ProfileService_ListProfiles_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ProfileService_ListProfiles_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ProfileService_GetProfileById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProfileService/GetProfileById", runtime.WithHTTPPathPattern("/api/v1/profile/{id}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ProfileService_GetProfileById_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ProfileService_GetProfileById_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ProfileService_GetProfileByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProfileService/GetProfileByName", runtime.WithHTTPPathPattern("/api/v1/profile/name/{name=**}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ProfileService_GetProfileByName_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ProfileService_GetProfileByName_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ProfileService_GetProfileStatusByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProfileService/GetProfileStatusByName", runtime.WithHTTPPathPattern("/api/v1/profile/name/{name=**}/status")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ProfileService_GetProfileStatusByName_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ProfileService_GetProfileStatusByName_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodGet, pattern_ProfileService_GetProfileStatusByProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProfileService/GetProfileStatusByProject", runtime.WithHTTPPathPattern("/api/v1/profile_status")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ProfileService_GetProfileStatusByProject_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_ProfileService_GetProfileStatusByProject_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_ProfileService_CreateProfile_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "profile"}, "")) + pattern_ProfileService_UpdateProfile_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "profile"}, "")) + pattern_ProfileService_PatchProfile_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "profile", "id"}, "")) + pattern_ProfileService_DeleteProfile_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "profile", "id"}, "")) + pattern_ProfileService_ListProfiles_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "profiles"}, "")) + pattern_ProfileService_GetProfileById_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "profile", "id"}, "")) + pattern_ProfileService_GetProfileByName_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 3, 0, 4, 1, 5, 3}, []string{"api", "v1", "profile", "name"}, "")) + pattern_ProfileService_GetProfileStatusByName_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 3, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "profile", "name", "status"}, "")) + pattern_ProfileService_GetProfileStatusByProject_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "profile_status"}, "")) +) + +var ( + forward_ProfileService_CreateProfile_0 = runtime.ForwardResponseMessage + forward_ProfileService_UpdateProfile_0 = runtime.ForwardResponseMessage + forward_ProfileService_PatchProfile_0 = runtime.ForwardResponseMessage + forward_ProfileService_DeleteProfile_0 = runtime.ForwardResponseMessage + forward_ProfileService_ListProfiles_0 = runtime.ForwardResponseMessage + forward_ProfileService_GetProfileById_0 = runtime.ForwardResponseMessage + forward_ProfileService_GetProfileByName_0 = runtime.ForwardResponseMessage + forward_ProfileService_GetProfileStatusByName_0 = runtime.ForwardResponseMessage + forward_ProfileService_GetProfileStatusByProject_0 = runtime.ForwardResponseMessage +) - mux.Handle("PUT", pattern_ProfileService_UpdateProfile_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProfileService/UpdateProfile", runtime.WithHTTPPathPattern("/api/v1/profile")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ProfileService_UpdateProfile_0(annotatedContext, inboundMarshaler, client, req, pathParams) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) +// RegisterDataSourceServiceHandlerFromEndpoint is same as RegisterDataSourceServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterDataSourceServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } return } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterDataSourceServiceHandler(ctx, mux, conn) +} - forward_ProfileService_UpdateProfile_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) +// RegisterDataSourceServiceHandler registers the http handlers for service DataSourceService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterDataSourceServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterDataSourceServiceHandlerClient(ctx, mux, NewDataSourceServiceClient(conn)) +} - mux.Handle("PATCH", pattern_ProfileService_PatchProfile_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { +// RegisterDataSourceServiceHandlerClient registers the http handlers for service DataSourceService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "DataSourceServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "DataSourceServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "DataSourceServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterDataSourceServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client DataSourceServiceClient) error { + mux.Handle(http.MethodPost, pattern_DataSourceService_CreateDataSource_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProfileService/PatchProfile", runtime.WithHTTPPathPattern("/api/v1/profile/{id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.DataSourceService/CreateDataSource", runtime.WithHTTPPathPattern("/api/v1/data_source")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ProfileService_PatchProfile_0(annotatedContext, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DataSourceService_CreateDataSource_0(annotatedContext, inboundMarshaler, client, req, pathParams) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - - forward_ProfileService_PatchProfile_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + forward_DataSourceService_CreateDataSource_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - - mux.Handle("DELETE", pattern_ProfileService_DeleteProfile_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_DataSourceService_GetDataSourceById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProfileService/DeleteProfile", runtime.WithHTTPPathPattern("/api/v1/profile/{id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.DataSourceService/GetDataSourceById", runtime.WithHTTPPathPattern("/api/v1/data_source/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ProfileService_DeleteProfile_0(annotatedContext, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DataSourceService_GetDataSourceById_0(annotatedContext, inboundMarshaler, client, req, pathParams) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - - forward_ProfileService_DeleteProfile_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + forward_DataSourceService_GetDataSourceById_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - - mux.Handle("GET", pattern_ProfileService_ListProfiles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_DataSourceService_GetDataSourceByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProfileService/ListProfiles", runtime.WithHTTPPathPattern("/api/v1/profiles")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.DataSourceService/GetDataSourceByName", runtime.WithHTTPPathPattern("/api/v1/data_source/name/{name=**}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ProfileService_ListProfiles_0(annotatedContext, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DataSourceService_GetDataSourceByName_0(annotatedContext, inboundMarshaler, client, req, pathParams) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - - forward_ProfileService_ListProfiles_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + forward_DataSourceService_GetDataSourceByName_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - - mux.Handle("GET", pattern_ProfileService_GetProfileById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_DataSourceService_ListDataSources_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProfileService/GetProfileById", runtime.WithHTTPPathPattern("/api/v1/profile/{id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.DataSourceService/ListDataSources", runtime.WithHTTPPathPattern("/api/v1/data_sources")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ProfileService_GetProfileById_0(annotatedContext, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DataSourceService_ListDataSources_0(annotatedContext, inboundMarshaler, client, req, pathParams) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - - forward_ProfileService_GetProfileById_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + forward_DataSourceService_ListDataSources_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - - mux.Handle("GET", pattern_ProfileService_GetProfileByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPut, pattern_DataSourceService_UpdateDataSource_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProfileService/GetProfileByName", runtime.WithHTTPPathPattern("/api/v1/profile/name/{name=**}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.DataSourceService/UpdateDataSource", runtime.WithHTTPPathPattern("/api/v1/data_source")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ProfileService_GetProfileByName_0(annotatedContext, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DataSourceService_UpdateDataSource_0(annotatedContext, inboundMarshaler, client, req, pathParams) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - - forward_ProfileService_GetProfileByName_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + forward_DataSourceService_UpdateDataSource_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - - mux.Handle("GET", pattern_ProfileService_GetProfileStatusByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_DataSourceService_DeleteDataSourceById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProfileService/GetProfileStatusByName", runtime.WithHTTPPathPattern("/api/v1/profile/name/{name=**}/status")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.DataSourceService/DeleteDataSourceById", runtime.WithHTTPPathPattern("/api/v1/data_source/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ProfileService_GetProfileStatusByName_0(annotatedContext, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DataSourceService_DeleteDataSourceById_0(annotatedContext, inboundMarshaler, client, req, pathParams) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - - forward_ProfileService_GetProfileStatusByName_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + forward_DataSourceService_DeleteDataSourceById_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - - mux.Handle("GET", pattern_ProfileService_GetProfileStatusByProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_DataSourceService_DeleteDataSourceByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProfileService/GetProfileStatusByProject", runtime.WithHTTPPathPattern("/api/v1/profile_status")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.DataSourceService/DeleteDataSourceByName", runtime.WithHTTPPathPattern("/api/v1/data_source/name/{name=**}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ProfileService_GetProfileStatusByProject_0(annotatedContext, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DataSourceService_DeleteDataSourceByName_0(annotatedContext, inboundMarshaler, client, req, pathParams) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - - forward_ProfileService_GetProfileStatusByProject_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + forward_DataSourceService_DeleteDataSourceByName_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - return nil } var ( - pattern_ProfileService_CreateProfile_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "profile"}, "")) - - pattern_ProfileService_UpdateProfile_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "profile"}, "")) - - pattern_ProfileService_PatchProfile_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "profile", "id"}, "")) - - pattern_ProfileService_DeleteProfile_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "profile", "id"}, "")) - - pattern_ProfileService_ListProfiles_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "profiles"}, "")) - - pattern_ProfileService_GetProfileById_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "profile", "id"}, "")) - - pattern_ProfileService_GetProfileByName_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 3, 0, 4, 1, 5, 3}, []string{"api", "v1", "profile", "name"}, "")) - - pattern_ProfileService_GetProfileStatusByName_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 3, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "profile", "name", "status"}, "")) - - pattern_ProfileService_GetProfileStatusByProject_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "profile_status"}, "")) + pattern_DataSourceService_CreateDataSource_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "data_source"}, "")) + pattern_DataSourceService_GetDataSourceById_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "data_source", "id"}, "")) + pattern_DataSourceService_GetDataSourceByName_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 3, 0, 4, 1, 5, 3}, []string{"api", "v1", "data_source", "name"}, "")) + pattern_DataSourceService_ListDataSources_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "data_sources"}, "")) + pattern_DataSourceService_UpdateDataSource_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "data_source"}, "")) + pattern_DataSourceService_DeleteDataSourceById_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "data_source", "id"}, "")) + pattern_DataSourceService_DeleteDataSourceByName_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 3, 0, 4, 1, 5, 3}, []string{"api", "v1", "data_source", "name"}, "")) ) var ( - forward_ProfileService_CreateProfile_0 = runtime.ForwardResponseMessage - - forward_ProfileService_UpdateProfile_0 = runtime.ForwardResponseMessage - - forward_ProfileService_PatchProfile_0 = runtime.ForwardResponseMessage - - forward_ProfileService_DeleteProfile_0 = runtime.ForwardResponseMessage - - forward_ProfileService_ListProfiles_0 = runtime.ForwardResponseMessage - - forward_ProfileService_GetProfileById_0 = runtime.ForwardResponseMessage - - forward_ProfileService_GetProfileByName_0 = runtime.ForwardResponseMessage - - forward_ProfileService_GetProfileStatusByName_0 = runtime.ForwardResponseMessage - - forward_ProfileService_GetProfileStatusByProject_0 = runtime.ForwardResponseMessage + forward_DataSourceService_CreateDataSource_0 = runtime.ForwardResponseMessage + forward_DataSourceService_GetDataSourceById_0 = runtime.ForwardResponseMessage + forward_DataSourceService_GetDataSourceByName_0 = runtime.ForwardResponseMessage + forward_DataSourceService_ListDataSources_0 = runtime.ForwardResponseMessage + forward_DataSourceService_UpdateDataSource_0 = runtime.ForwardResponseMessage + forward_DataSourceService_DeleteDataSourceById_0 = runtime.ForwardResponseMessage + forward_DataSourceService_DeleteDataSourceByName_0 = runtime.ForwardResponseMessage ) // RegisterRuleTypeServiceHandlerFromEndpoint is same as RegisterRuleTypeServiceHandler but @@ -6420,7 +5683,6 @@ func RegisterRuleTypeServiceHandlerFromEndpoint(ctx context.Context, mux *runtim } }() }() - return RegisterRuleTypeServiceHandler(ctx, mux, conn) } @@ -6436,14 +5698,11 @@ func RegisterRuleTypeServiceHandler(ctx context.Context, mux *runtime.ServeMux, // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "RuleTypeServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterRuleTypeServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client RuleTypeServiceClient) error { - - mux.Handle("GET", pattern_RuleTypeService_ListRuleTypes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RuleTypeService_ListRuleTypes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RuleTypeService/ListRuleTypes", runtime.WithHTTPPathPattern("/api/v1/rule_types")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RuleTypeService/ListRuleTypes", runtime.WithHTTPPathPattern("/api/v1/rule_types")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6454,18 +5713,13 @@ func RegisterRuleTypeServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RuleTypeService_ListRuleTypes_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RuleTypeService_GetRuleTypeByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RuleTypeService_GetRuleTypeByName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RuleTypeService/GetRuleTypeByName", runtime.WithHTTPPathPattern("/api/v1/rule_type/name/{name=**}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RuleTypeService/GetRuleTypeByName", runtime.WithHTTPPathPattern("/api/v1/rule_type/name/{name=**}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6476,18 +5730,13 @@ func RegisterRuleTypeServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RuleTypeService_GetRuleTypeByName_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RuleTypeService_GetRuleTypeById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RuleTypeService_GetRuleTypeById_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RuleTypeService/GetRuleTypeById", runtime.WithHTTPPathPattern("/api/v1/rule_type/{id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RuleTypeService/GetRuleTypeById", runtime.WithHTTPPathPattern("/api/v1/rule_type/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6498,18 +5747,13 @@ func RegisterRuleTypeServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RuleTypeService_GetRuleTypeById_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_RuleTypeService_CreateRuleType_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_RuleTypeService_CreateRuleType_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RuleTypeService/CreateRuleType", runtime.WithHTTPPathPattern("/api/v1/rule_type")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RuleTypeService/CreateRuleType", runtime.WithHTTPPathPattern("/api/v1/rule_type")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6520,18 +5764,13 @@ func RegisterRuleTypeServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RuleTypeService_CreateRuleType_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("PUT", pattern_RuleTypeService_UpdateRuleType_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPut, pattern_RuleTypeService_UpdateRuleType_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RuleTypeService/UpdateRuleType", runtime.WithHTTPPathPattern("/api/v1/rule_type")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RuleTypeService/UpdateRuleType", runtime.WithHTTPPathPattern("/api/v1/rule_type")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6542,18 +5781,13 @@ func RegisterRuleTypeServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RuleTypeService_UpdateRuleType_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_RuleTypeService_DeleteRuleType_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_RuleTypeService_DeleteRuleType_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RuleTypeService/DeleteRuleType", runtime.WithHTTPPathPattern("/api/v1/rule_type/{id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.RuleTypeService/DeleteRuleType", runtime.WithHTTPPathPattern("/api/v1/rule_type/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6564,40 +5798,27 @@ func RegisterRuleTypeServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RuleTypeService_DeleteRuleType_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil } var ( - pattern_RuleTypeService_ListRuleTypes_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "rule_types"}, "")) - + pattern_RuleTypeService_ListRuleTypes_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "rule_types"}, "")) pattern_RuleTypeService_GetRuleTypeByName_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 3, 0, 4, 1, 5, 3}, []string{"api", "v1", "rule_type", "name"}, "")) - - pattern_RuleTypeService_GetRuleTypeById_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "rule_type", "id"}, "")) - - pattern_RuleTypeService_CreateRuleType_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "rule_type"}, "")) - - pattern_RuleTypeService_UpdateRuleType_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "rule_type"}, "")) - - pattern_RuleTypeService_DeleteRuleType_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "rule_type", "id"}, "")) + pattern_RuleTypeService_GetRuleTypeById_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "rule_type", "id"}, "")) + pattern_RuleTypeService_CreateRuleType_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "rule_type"}, "")) + pattern_RuleTypeService_UpdateRuleType_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "rule_type"}, "")) + pattern_RuleTypeService_DeleteRuleType_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "rule_type", "id"}, "")) ) var ( - forward_RuleTypeService_ListRuleTypes_0 = runtime.ForwardResponseMessage - + forward_RuleTypeService_ListRuleTypes_0 = runtime.ForwardResponseMessage forward_RuleTypeService_GetRuleTypeByName_0 = runtime.ForwardResponseMessage - - forward_RuleTypeService_GetRuleTypeById_0 = runtime.ForwardResponseMessage - - forward_RuleTypeService_CreateRuleType_0 = runtime.ForwardResponseMessage - - forward_RuleTypeService_UpdateRuleType_0 = runtime.ForwardResponseMessage - - forward_RuleTypeService_DeleteRuleType_0 = runtime.ForwardResponseMessage + forward_RuleTypeService_GetRuleTypeById_0 = runtime.ForwardResponseMessage + forward_RuleTypeService_CreateRuleType_0 = runtime.ForwardResponseMessage + forward_RuleTypeService_UpdateRuleType_0 = runtime.ForwardResponseMessage + forward_RuleTypeService_DeleteRuleType_0 = runtime.ForwardResponseMessage ) // RegisterEvalResultsServiceHandlerFromEndpoint is same as RegisterEvalResultsServiceHandler but @@ -6621,7 +5842,6 @@ func RegisterEvalResultsServiceHandlerFromEndpoint(ctx context.Context, mux *run } }() }() - return RegisterEvalResultsServiceHandler(ctx, mux, conn) } @@ -6637,14 +5857,11 @@ func RegisterEvalResultsServiceHandler(ctx context.Context, mux *runtime.ServeMu // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "EvalResultsServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterEvalResultsServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client EvalResultsServiceClient) error { - - mux.Handle("GET", pattern_EvalResultsService_ListEvaluationResults_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_EvalResultsService_ListEvaluationResults_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.EvalResultsService/ListEvaluationResults", runtime.WithHTTPPathPattern("/api/v1/results")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.EvalResultsService/ListEvaluationResults", runtime.WithHTTPPathPattern("/api/v1/results")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6655,18 +5872,13 @@ func RegisterEvalResultsServiceHandlerClient(ctx context.Context, mux *runtime.S runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_EvalResultsService_ListEvaluationResults_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_EvalResultsService_ListEvaluationHistory_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_EvalResultsService_ListEvaluationHistory_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.EvalResultsService/ListEvaluationHistory", runtime.WithHTTPPathPattern("/api/v1/history")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.EvalResultsService/ListEvaluationHistory", runtime.WithHTTPPathPattern("/api/v1/history")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6677,18 +5889,13 @@ func RegisterEvalResultsServiceHandlerClient(ctx context.Context, mux *runtime.S runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_EvalResultsService_ListEvaluationHistory_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_EvalResultsService_GetEvaluationHistory_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_EvalResultsService_GetEvaluationHistory_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.EvalResultsService/GetEvaluationHistory", runtime.WithHTTPPathPattern("/api/v1/history/{id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.EvalResultsService/GetEvaluationHistory", runtime.WithHTTPPathPattern("/api/v1/history/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6699,28 +5906,21 @@ func RegisterEvalResultsServiceHandlerClient(ctx context.Context, mux *runtime.S runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_EvalResultsService_GetEvaluationHistory_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil } var ( pattern_EvalResultsService_ListEvaluationResults_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "results"}, "")) - pattern_EvalResultsService_ListEvaluationHistory_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "history"}, "")) - - pattern_EvalResultsService_GetEvaluationHistory_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "history", "id"}, "")) + pattern_EvalResultsService_GetEvaluationHistory_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "history", "id"}, "")) ) var ( forward_EvalResultsService_ListEvaluationResults_0 = runtime.ForwardResponseMessage - forward_EvalResultsService_ListEvaluationHistory_0 = runtime.ForwardResponseMessage - - forward_EvalResultsService_GetEvaluationHistory_0 = runtime.ForwardResponseMessage + forward_EvalResultsService_GetEvaluationHistory_0 = runtime.ForwardResponseMessage ) // RegisterPermissionsServiceHandlerFromEndpoint is same as RegisterPermissionsServiceHandler but @@ -6744,7 +5944,6 @@ func RegisterPermissionsServiceHandlerFromEndpoint(ctx context.Context, mux *run } }() }() - return RegisterPermissionsServiceHandler(ctx, mux, conn) } @@ -6760,14 +5959,11 @@ func RegisterPermissionsServiceHandler(ctx context.Context, mux *runtime.ServeMu // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "PermissionsServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterPermissionsServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client PermissionsServiceClient) error { - - mux.Handle("GET", pattern_PermissionsService_ListRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_PermissionsService_ListRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.PermissionsService/ListRoles", runtime.WithHTTPPathPattern("/api/v1/permissions/roles")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.PermissionsService/ListRoles", runtime.WithHTTPPathPattern("/api/v1/permissions/roles")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6778,18 +5974,13 @@ func RegisterPermissionsServiceHandlerClient(ctx context.Context, mux *runtime.S runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_PermissionsService_ListRoles_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_PermissionsService_ListRoleAssignments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_PermissionsService_ListRoleAssignments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.PermissionsService/ListRoleAssignments", runtime.WithHTTPPathPattern("/api/v1/permissions/assignments")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.PermissionsService/ListRoleAssignments", runtime.WithHTTPPathPattern("/api/v1/permissions/assignments")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6800,18 +5991,13 @@ func RegisterPermissionsServiceHandlerClient(ctx context.Context, mux *runtime.S runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_PermissionsService_ListRoleAssignments_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_PermissionsService_AssignRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_PermissionsService_AssignRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.PermissionsService/AssignRole", runtime.WithHTTPPathPattern("/api/v1/permissions/assign")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.PermissionsService/AssignRole", runtime.WithHTTPPathPattern("/api/v1/permissions/assign")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6822,18 +6008,13 @@ func RegisterPermissionsServiceHandlerClient(ctx context.Context, mux *runtime.S runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_PermissionsService_AssignRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_PermissionsService_UpdateRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_PermissionsService_UpdateRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.PermissionsService/UpdateRole", runtime.WithHTTPPathPattern("/api/v1/permissions/update")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.PermissionsService/UpdateRole", runtime.WithHTTPPathPattern("/api/v1/permissions/update")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6844,18 +6025,13 @@ func RegisterPermissionsServiceHandlerClient(ctx context.Context, mux *runtime.S runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_PermissionsService_UpdateRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_PermissionsService_RemoveRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_PermissionsService_RemoveRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.PermissionsService/RemoveRole", runtime.WithHTTPPathPattern("/api/v1/permissions/remove")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.PermissionsService/RemoveRole", runtime.WithHTTPPathPattern("/api/v1/permissions/remove")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6866,36 +6042,25 @@ func RegisterPermissionsServiceHandlerClient(ctx context.Context, mux *runtime.S runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_PermissionsService_RemoveRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil } var ( - pattern_PermissionsService_ListRoles_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "permissions", "roles"}, "")) - + pattern_PermissionsService_ListRoles_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "permissions", "roles"}, "")) pattern_PermissionsService_ListRoleAssignments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "permissions", "assignments"}, "")) - - pattern_PermissionsService_AssignRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "permissions", "assign"}, "")) - - pattern_PermissionsService_UpdateRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "permissions", "update"}, "")) - - pattern_PermissionsService_RemoveRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "permissions", "remove"}, "")) + pattern_PermissionsService_AssignRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "permissions", "assign"}, "")) + pattern_PermissionsService_UpdateRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "permissions", "update"}, "")) + pattern_PermissionsService_RemoveRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "permissions", "remove"}, "")) ) var ( - forward_PermissionsService_ListRoles_0 = runtime.ForwardResponseMessage - + forward_PermissionsService_ListRoles_0 = runtime.ForwardResponseMessage forward_PermissionsService_ListRoleAssignments_0 = runtime.ForwardResponseMessage - - forward_PermissionsService_AssignRole_0 = runtime.ForwardResponseMessage - - forward_PermissionsService_UpdateRole_0 = runtime.ForwardResponseMessage - - forward_PermissionsService_RemoveRole_0 = runtime.ForwardResponseMessage + forward_PermissionsService_AssignRole_0 = runtime.ForwardResponseMessage + forward_PermissionsService_UpdateRole_0 = runtime.ForwardResponseMessage + forward_PermissionsService_RemoveRole_0 = runtime.ForwardResponseMessage ) // RegisterProjectsServiceHandlerFromEndpoint is same as RegisterProjectsServiceHandler but @@ -6919,7 +6084,6 @@ func RegisterProjectsServiceHandlerFromEndpoint(ctx context.Context, mux *runtim } }() }() - return RegisterProjectsServiceHandler(ctx, mux, conn) } @@ -6935,14 +6099,11 @@ func RegisterProjectsServiceHandler(ctx context.Context, mux *runtime.ServeMux, // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "ProjectsServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterProjectsServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ProjectsServiceClient) error { - - mux.Handle("GET", pattern_ProjectsService_ListProjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ProjectsService_ListProjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProjectsService/ListProjects", runtime.WithHTTPPathPattern("/api/v1/projects")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProjectsService/ListProjects", runtime.WithHTTPPathPattern("/api/v1/projects")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6953,18 +6114,13 @@ func RegisterProjectsServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProjectsService_ListProjects_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_ProjectsService_CreateProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_ProjectsService_CreateProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProjectsService/CreateProject", runtime.WithHTTPPathPattern("/api/v1/projects")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProjectsService/CreateProject", runtime.WithHTTPPathPattern("/api/v1/projects")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6975,18 +6131,13 @@ func RegisterProjectsServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProjectsService_CreateProject_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_ProjectsService_ListChildProjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ProjectsService_ListChildProjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProjectsService/ListChildProjects", runtime.WithHTTPPathPattern("/api/v1/projects/{context.project_id}/children")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProjectsService/ListChildProjects", runtime.WithHTTPPathPattern("/api/v1/projects/{context.project_id}/children")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6997,18 +6148,13 @@ func RegisterProjectsServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProjectsService_ListChildProjects_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_ProjectsService_DeleteProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_ProjectsService_DeleteProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProjectsService/DeleteProject", runtime.WithHTTPPathPattern("/api/v1/projects")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProjectsService/DeleteProject", runtime.WithHTTPPathPattern("/api/v1/projects")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7019,18 +6165,13 @@ func RegisterProjectsServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProjectsService_DeleteProject_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("PUT", pattern_ProjectsService_UpdateProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPut, pattern_ProjectsService_UpdateProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProjectsService/UpdateProject", runtime.WithHTTPPathPattern("/api/v1/projects")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProjectsService/UpdateProject", runtime.WithHTTPPathPattern("/api/v1/projects")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7041,18 +6182,13 @@ func RegisterProjectsServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProjectsService_UpdateProject_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("PATCH", pattern_ProjectsService_PatchProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPatch, pattern_ProjectsService_PatchProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProjectsService/PatchProject", runtime.WithHTTPPathPattern("/api/v1/projects")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProjectsService/PatchProject", runtime.WithHTTPPathPattern("/api/v1/projects")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7063,18 +6199,13 @@ func RegisterProjectsServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProjectsService_PatchProject_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_ProjectsService_CreateEntityReconciliationTask_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_ProjectsService_CreateEntityReconciliationTask_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProjectsService/CreateEntityReconciliationTask", runtime.WithHTTPPathPattern("/api/v1/projects/entity/reconcile")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProjectsService/CreateEntityReconciliationTask", runtime.WithHTTPPathPattern("/api/v1/projects/entity/reconcile")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7085,43 +6216,28 @@ func RegisterProjectsServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProjectsService_CreateEntityReconciliationTask_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil } var ( - pattern_ProjectsService_ListProjects_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "projects"}, "")) - - pattern_ProjectsService_CreateProject_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "projects"}, "")) - - pattern_ProjectsService_ListChildProjects_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "projects", "context.project_id", "children"}, "")) - - pattern_ProjectsService_DeleteProject_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "projects"}, "")) - - pattern_ProjectsService_UpdateProject_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "projects"}, "")) - - pattern_ProjectsService_PatchProject_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "projects"}, "")) - + pattern_ProjectsService_ListProjects_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "projects"}, "")) + pattern_ProjectsService_CreateProject_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "projects"}, "")) + pattern_ProjectsService_ListChildProjects_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "projects", "context.project_id", "children"}, "")) + pattern_ProjectsService_DeleteProject_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "projects"}, "")) + pattern_ProjectsService_UpdateProject_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "projects"}, "")) + pattern_ProjectsService_PatchProject_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "projects"}, "")) pattern_ProjectsService_CreateEntityReconciliationTask_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"api", "v1", "projects", "entity", "reconcile"}, "")) ) var ( - forward_ProjectsService_ListProjects_0 = runtime.ForwardResponseMessage - - forward_ProjectsService_CreateProject_0 = runtime.ForwardResponseMessage - - forward_ProjectsService_ListChildProjects_0 = runtime.ForwardResponseMessage - - forward_ProjectsService_DeleteProject_0 = runtime.ForwardResponseMessage - - forward_ProjectsService_UpdateProject_0 = runtime.ForwardResponseMessage - - forward_ProjectsService_PatchProject_0 = runtime.ForwardResponseMessage - + forward_ProjectsService_ListProjects_0 = runtime.ForwardResponseMessage + forward_ProjectsService_CreateProject_0 = runtime.ForwardResponseMessage + forward_ProjectsService_ListChildProjects_0 = runtime.ForwardResponseMessage + forward_ProjectsService_DeleteProject_0 = runtime.ForwardResponseMessage + forward_ProjectsService_UpdateProject_0 = runtime.ForwardResponseMessage + forward_ProjectsService_PatchProject_0 = runtime.ForwardResponseMessage forward_ProjectsService_CreateEntityReconciliationTask_0 = runtime.ForwardResponseMessage ) @@ -7146,7 +6262,6 @@ func RegisterProvidersServiceHandlerFromEndpoint(ctx context.Context, mux *runti } }() }() - return RegisterProvidersServiceHandler(ctx, mux, conn) } @@ -7162,14 +6277,11 @@ func RegisterProvidersServiceHandler(ctx context.Context, mux *runtime.ServeMux, // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "ProvidersServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterProvidersServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ProvidersServiceClient) error { - - mux.Handle("PATCH", pattern_ProvidersService_PatchProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPatch, pattern_ProvidersService_PatchProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProvidersService/PatchProvider", runtime.WithHTTPPathPattern("/api/v1/providers")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProvidersService/PatchProvider", runtime.WithHTTPPathPattern("/api/v1/providers")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7180,18 +6292,13 @@ func RegisterProvidersServiceHandlerClient(ctx context.Context, mux *runtime.Ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProvidersService_PatchProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_ProvidersService_GetProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ProvidersService_GetProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProvidersService/GetProvider", runtime.WithHTTPPathPattern("/api/v1/providers/{name}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProvidersService/GetProvider", runtime.WithHTTPPathPattern("/api/v1/providers/{name}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7202,18 +6309,13 @@ func RegisterProvidersServiceHandlerClient(ctx context.Context, mux *runtime.Ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProvidersService_GetProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_ProvidersService_ListProviders_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ProvidersService_ListProviders_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProvidersService/ListProviders", runtime.WithHTTPPathPattern("/api/v1/providers")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProvidersService/ListProviders", runtime.WithHTTPPathPattern("/api/v1/providers")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7224,18 +6326,13 @@ func RegisterProvidersServiceHandlerClient(ctx context.Context, mux *runtime.Ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProvidersService_ListProviders_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_ProvidersService_CreateProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_ProvidersService_CreateProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProvidersService/CreateProvider", runtime.WithHTTPPathPattern("/api/v1/providers")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProvidersService/CreateProvider", runtime.WithHTTPPathPattern("/api/v1/providers")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7246,18 +6343,13 @@ func RegisterProvidersServiceHandlerClient(ctx context.Context, mux *runtime.Ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProvidersService_CreateProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_ProvidersService_DeleteProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_ProvidersService_DeleteProvider_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProvidersService/DeleteProvider", runtime.WithHTTPPathPattern("/api/v1/providers")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProvidersService/DeleteProvider", runtime.WithHTTPPathPattern("/api/v1/providers")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7268,18 +6360,13 @@ func RegisterProvidersServiceHandlerClient(ctx context.Context, mux *runtime.Ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProvidersService_DeleteProvider_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_ProvidersService_DeleteProviderByID_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_ProvidersService_DeleteProviderByID_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProvidersService/DeleteProviderByID", runtime.WithHTTPPathPattern("/api/v1/providers/{id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProvidersService/DeleteProviderByID", runtime.WithHTTPPathPattern("/api/v1/providers/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7290,40 +6377,13 @@ func RegisterProvidersServiceHandlerClient(ctx context.Context, mux *runtime.Ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProvidersService_DeleteProviderByID_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_ProvidersService_GetUnclaimedProviders_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProvidersService/GetUnclaimedProviders", runtime.WithHTTPPathPattern("/api/v1/my/providers")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ProvidersService_GetUnclaimedProviders_0(annotatedContext, inboundMarshaler, client, req, pathParams) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - - forward_ProvidersService_GetUnclaimedProviders_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_ProvidersService_ListProviderClasses_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ProvidersService_ListProviderClasses_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProvidersService/ListProviderClasses", runtime.WithHTTPPathPattern("/api/v1/provider_classes")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProvidersService/ListProviderClasses", runtime.WithHTTPPathPattern("/api/v1/provider_classes")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7334,18 +6394,13 @@ func RegisterProvidersServiceHandlerClient(ctx context.Context, mux *runtime.Ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProvidersService_ListProviderClasses_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_ProvidersService_ReconcileEntityRegistration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_ProvidersService_ReconcileEntityRegistration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProvidersService/ReconcileEntityRegistration", runtime.WithHTTPPathPattern("/api/v1/provider/register_all")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.ProvidersService/ReconcileEntityRegistration", runtime.WithHTTPPathPattern("/api/v1/provider/register_all")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7356,51 +6411,30 @@ func RegisterProvidersServiceHandlerClient(ctx context.Context, mux *runtime.Ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ProvidersService_ReconcileEntityRegistration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil } var ( - pattern_ProvidersService_PatchProvider_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "providers"}, "")) - - pattern_ProvidersService_GetProvider_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "providers", "name"}, "")) - - pattern_ProvidersService_ListProviders_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "providers"}, "")) - - pattern_ProvidersService_CreateProvider_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "providers"}, "")) - - pattern_ProvidersService_DeleteProvider_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "providers"}, "")) - - pattern_ProvidersService_DeleteProviderByID_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "providers", "id"}, "")) - - pattern_ProvidersService_GetUnclaimedProviders_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "my", "providers"}, "")) - - pattern_ProvidersService_ListProviderClasses_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "provider_classes"}, "")) - + pattern_ProvidersService_PatchProvider_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "providers"}, "")) + pattern_ProvidersService_GetProvider_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "providers", "name"}, "")) + pattern_ProvidersService_ListProviders_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "providers"}, "")) + pattern_ProvidersService_CreateProvider_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "providers"}, "")) + pattern_ProvidersService_DeleteProvider_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "providers"}, "")) + pattern_ProvidersService_DeleteProviderByID_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "providers", "id"}, "")) + pattern_ProvidersService_ListProviderClasses_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "provider_classes"}, "")) pattern_ProvidersService_ReconcileEntityRegistration_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "provider", "register_all"}, "")) ) var ( - forward_ProvidersService_PatchProvider_0 = runtime.ForwardResponseMessage - - forward_ProvidersService_GetProvider_0 = runtime.ForwardResponseMessage - - forward_ProvidersService_ListProviders_0 = runtime.ForwardResponseMessage - - forward_ProvidersService_CreateProvider_0 = runtime.ForwardResponseMessage - - forward_ProvidersService_DeleteProvider_0 = runtime.ForwardResponseMessage - - forward_ProvidersService_DeleteProviderByID_0 = runtime.ForwardResponseMessage - - forward_ProvidersService_GetUnclaimedProviders_0 = runtime.ForwardResponseMessage - - forward_ProvidersService_ListProviderClasses_0 = runtime.ForwardResponseMessage - + forward_ProvidersService_PatchProvider_0 = runtime.ForwardResponseMessage + forward_ProvidersService_GetProvider_0 = runtime.ForwardResponseMessage + forward_ProvidersService_ListProviders_0 = runtime.ForwardResponseMessage + forward_ProvidersService_CreateProvider_0 = runtime.ForwardResponseMessage + forward_ProvidersService_DeleteProvider_0 = runtime.ForwardResponseMessage + forward_ProvidersService_DeleteProviderByID_0 = runtime.ForwardResponseMessage + forward_ProvidersService_ListProviderClasses_0 = runtime.ForwardResponseMessage forward_ProvidersService_ReconcileEntityRegistration_0 = runtime.ForwardResponseMessage ) @@ -7425,7 +6459,6 @@ func RegisterInviteServiceHandlerFromEndpoint(ctx context.Context, mux *runtime. } }() }() - return RegisterInviteServiceHandler(ctx, mux, conn) } @@ -7441,14 +6474,11 @@ func RegisterInviteServiceHandler(ctx context.Context, mux *runtime.ServeMux, co // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "InviteServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterInviteServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client InviteServiceClient) error { - - mux.Handle("GET", pattern_InviteService_GetInviteDetails_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_InviteService_GetInviteDetails_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/minder.v1.InviteService/GetInviteDetails", runtime.WithHTTPPathPattern("/api/v1/invite/{code}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/minder.v1.InviteService/GetInviteDetails", runtime.WithHTTPPathPattern("/api/v1/invite/{code}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7459,11 +6489,8 @@ func RegisterInviteServiceHandlerClient(ctx context.Context, mux *runtime.ServeM runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_InviteService_GetInviteDetails_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil } diff --git a/pkg/api/protobuf/go/minder/v1/minder_grpc.pb.go b/pkg/api/protobuf/go/minder/v1/minder_grpc.pb.go index 003ff4fc49..1db33a0762 100644 --- a/pkg/api/protobuf/go/minder/v1/minder_grpc.pb.go +++ b/pkg/api/protobuf/go/minder/v1/minder_grpc.pb.go @@ -1558,6 +1558,336 @@ var ProfileService_ServiceDesc = grpc.ServiceDesc{ Metadata: "minder/v1/minder.proto", } +const ( + DataSourceService_CreateDataSource_FullMethodName = "/minder.v1.DataSourceService/CreateDataSource" + DataSourceService_GetDataSourceById_FullMethodName = "/minder.v1.DataSourceService/GetDataSourceById" + DataSourceService_GetDataSourceByName_FullMethodName = "/minder.v1.DataSourceService/GetDataSourceByName" + DataSourceService_ListDataSources_FullMethodName = "/minder.v1.DataSourceService/ListDataSources" + DataSourceService_UpdateDataSource_FullMethodName = "/minder.v1.DataSourceService/UpdateDataSource" + DataSourceService_DeleteDataSourceById_FullMethodName = "/minder.v1.DataSourceService/DeleteDataSourceById" + DataSourceService_DeleteDataSourceByName_FullMethodName = "/minder.v1.DataSourceService/DeleteDataSourceByName" +) + +// DataSourceServiceClient is the client API for DataSourceService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type DataSourceServiceClient interface { + CreateDataSource(ctx context.Context, in *CreateDataSourceRequest, opts ...grpc.CallOption) (*CreateDataSourceResponse, error) + GetDataSourceById(ctx context.Context, in *GetDataSourceByIdRequest, opts ...grpc.CallOption) (*GetDataSourceByIdResponse, error) + GetDataSourceByName(ctx context.Context, in *GetDataSourceByNameRequest, opts ...grpc.CallOption) (*GetDataSourceByNameResponse, error) + ListDataSources(ctx context.Context, in *ListDataSourcesRequest, opts ...grpc.CallOption) (*ListDataSourcesResponse, error) + UpdateDataSource(ctx context.Context, in *UpdateDataSourceRequest, opts ...grpc.CallOption) (*UpdateDataSourceResponse, error) + DeleteDataSourceById(ctx context.Context, in *DeleteDataSourceByIdRequest, opts ...grpc.CallOption) (*DeleteDataSourceByIdResponse, error) + DeleteDataSourceByName(ctx context.Context, in *DeleteDataSourceByNameRequest, opts ...grpc.CallOption) (*DeleteDataSourceByNameResponse, error) +} + +type dataSourceServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewDataSourceServiceClient(cc grpc.ClientConnInterface) DataSourceServiceClient { + return &dataSourceServiceClient{cc} +} + +func (c *dataSourceServiceClient) CreateDataSource(ctx context.Context, in *CreateDataSourceRequest, opts ...grpc.CallOption) (*CreateDataSourceResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreateDataSourceResponse) + err := c.cc.Invoke(ctx, DataSourceService_CreateDataSource_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *dataSourceServiceClient) GetDataSourceById(ctx context.Context, in *GetDataSourceByIdRequest, opts ...grpc.CallOption) (*GetDataSourceByIdResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetDataSourceByIdResponse) + err := c.cc.Invoke(ctx, DataSourceService_GetDataSourceById_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *dataSourceServiceClient) GetDataSourceByName(ctx context.Context, in *GetDataSourceByNameRequest, opts ...grpc.CallOption) (*GetDataSourceByNameResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetDataSourceByNameResponse) + err := c.cc.Invoke(ctx, DataSourceService_GetDataSourceByName_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *dataSourceServiceClient) ListDataSources(ctx context.Context, in *ListDataSourcesRequest, opts ...grpc.CallOption) (*ListDataSourcesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListDataSourcesResponse) + err := c.cc.Invoke(ctx, DataSourceService_ListDataSources_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *dataSourceServiceClient) UpdateDataSource(ctx context.Context, in *UpdateDataSourceRequest, opts ...grpc.CallOption) (*UpdateDataSourceResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateDataSourceResponse) + err := c.cc.Invoke(ctx, DataSourceService_UpdateDataSource_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *dataSourceServiceClient) DeleteDataSourceById(ctx context.Context, in *DeleteDataSourceByIdRequest, opts ...grpc.CallOption) (*DeleteDataSourceByIdResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteDataSourceByIdResponse) + err := c.cc.Invoke(ctx, DataSourceService_DeleteDataSourceById_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *dataSourceServiceClient) DeleteDataSourceByName(ctx context.Context, in *DeleteDataSourceByNameRequest, opts ...grpc.CallOption) (*DeleteDataSourceByNameResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteDataSourceByNameResponse) + err := c.cc.Invoke(ctx, DataSourceService_DeleteDataSourceByName_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// DataSourceServiceServer is the server API for DataSourceService service. +// All implementations must embed UnimplementedDataSourceServiceServer +// for forward compatibility. +type DataSourceServiceServer interface { + CreateDataSource(context.Context, *CreateDataSourceRequest) (*CreateDataSourceResponse, error) + GetDataSourceById(context.Context, *GetDataSourceByIdRequest) (*GetDataSourceByIdResponse, error) + GetDataSourceByName(context.Context, *GetDataSourceByNameRequest) (*GetDataSourceByNameResponse, error) + ListDataSources(context.Context, *ListDataSourcesRequest) (*ListDataSourcesResponse, error) + UpdateDataSource(context.Context, *UpdateDataSourceRequest) (*UpdateDataSourceResponse, error) + DeleteDataSourceById(context.Context, *DeleteDataSourceByIdRequest) (*DeleteDataSourceByIdResponse, error) + DeleteDataSourceByName(context.Context, *DeleteDataSourceByNameRequest) (*DeleteDataSourceByNameResponse, error) + mustEmbedUnimplementedDataSourceServiceServer() +} + +// UnimplementedDataSourceServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedDataSourceServiceServer struct{} + +func (UnimplementedDataSourceServiceServer) CreateDataSource(context.Context, *CreateDataSourceRequest) (*CreateDataSourceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateDataSource not implemented") +} +func (UnimplementedDataSourceServiceServer) GetDataSourceById(context.Context, *GetDataSourceByIdRequest) (*GetDataSourceByIdResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetDataSourceById not implemented") +} +func (UnimplementedDataSourceServiceServer) GetDataSourceByName(context.Context, *GetDataSourceByNameRequest) (*GetDataSourceByNameResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetDataSourceByName not implemented") +} +func (UnimplementedDataSourceServiceServer) ListDataSources(context.Context, *ListDataSourcesRequest) (*ListDataSourcesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListDataSources not implemented") +} +func (UnimplementedDataSourceServiceServer) UpdateDataSource(context.Context, *UpdateDataSourceRequest) (*UpdateDataSourceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateDataSource not implemented") +} +func (UnimplementedDataSourceServiceServer) DeleteDataSourceById(context.Context, *DeleteDataSourceByIdRequest) (*DeleteDataSourceByIdResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteDataSourceById not implemented") +} +func (UnimplementedDataSourceServiceServer) DeleteDataSourceByName(context.Context, *DeleteDataSourceByNameRequest) (*DeleteDataSourceByNameResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteDataSourceByName not implemented") +} +func (UnimplementedDataSourceServiceServer) mustEmbedUnimplementedDataSourceServiceServer() {} +func (UnimplementedDataSourceServiceServer) testEmbeddedByValue() {} + +// UnsafeDataSourceServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to DataSourceServiceServer will +// result in compilation errors. +type UnsafeDataSourceServiceServer interface { + mustEmbedUnimplementedDataSourceServiceServer() +} + +func RegisterDataSourceServiceServer(s grpc.ServiceRegistrar, srv DataSourceServiceServer) { + // If the following call pancis, it indicates UnimplementedDataSourceServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&DataSourceService_ServiceDesc, srv) +} + +func _DataSourceService_CreateDataSource_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateDataSourceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DataSourceServiceServer).CreateDataSource(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: DataSourceService_CreateDataSource_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DataSourceServiceServer).CreateDataSource(ctx, req.(*CreateDataSourceRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _DataSourceService_GetDataSourceById_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetDataSourceByIdRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DataSourceServiceServer).GetDataSourceById(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: DataSourceService_GetDataSourceById_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DataSourceServiceServer).GetDataSourceById(ctx, req.(*GetDataSourceByIdRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _DataSourceService_GetDataSourceByName_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetDataSourceByNameRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DataSourceServiceServer).GetDataSourceByName(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: DataSourceService_GetDataSourceByName_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DataSourceServiceServer).GetDataSourceByName(ctx, req.(*GetDataSourceByNameRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _DataSourceService_ListDataSources_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListDataSourcesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DataSourceServiceServer).ListDataSources(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: DataSourceService_ListDataSources_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DataSourceServiceServer).ListDataSources(ctx, req.(*ListDataSourcesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _DataSourceService_UpdateDataSource_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateDataSourceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DataSourceServiceServer).UpdateDataSource(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: DataSourceService_UpdateDataSource_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DataSourceServiceServer).UpdateDataSource(ctx, req.(*UpdateDataSourceRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _DataSourceService_DeleteDataSourceById_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteDataSourceByIdRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DataSourceServiceServer).DeleteDataSourceById(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: DataSourceService_DeleteDataSourceById_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DataSourceServiceServer).DeleteDataSourceById(ctx, req.(*DeleteDataSourceByIdRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _DataSourceService_DeleteDataSourceByName_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteDataSourceByNameRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DataSourceServiceServer).DeleteDataSourceByName(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: DataSourceService_DeleteDataSourceByName_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DataSourceServiceServer).DeleteDataSourceByName(ctx, req.(*DeleteDataSourceByNameRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// DataSourceService_ServiceDesc is the grpc.ServiceDesc for DataSourceService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var DataSourceService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "minder.v1.DataSourceService", + HandlerType: (*DataSourceServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateDataSource", + Handler: _DataSourceService_CreateDataSource_Handler, + }, + { + MethodName: "GetDataSourceById", + Handler: _DataSourceService_GetDataSourceById_Handler, + }, + { + MethodName: "GetDataSourceByName", + Handler: _DataSourceService_GetDataSourceByName_Handler, + }, + { + MethodName: "ListDataSources", + Handler: _DataSourceService_ListDataSources_Handler, + }, + { + MethodName: "UpdateDataSource", + Handler: _DataSourceService_UpdateDataSource_Handler, + }, + { + MethodName: "DeleteDataSourceById", + Handler: _DataSourceService_DeleteDataSourceById_Handler, + }, + { + MethodName: "DeleteDataSourceByName", + Handler: _DataSourceService_DeleteDataSourceByName_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "minder/v1/minder.proto", +} + const ( RuleTypeService_ListRuleTypes_FullMethodName = "/minder.v1.RuleTypeService/ListRuleTypes" RuleTypeService_GetRuleTypeByName_FullMethodName = "/minder.v1.RuleTypeService/GetRuleTypeByName" @@ -2619,7 +2949,6 @@ const ( ProvidersService_CreateProvider_FullMethodName = "/minder.v1.ProvidersService/CreateProvider" ProvidersService_DeleteProvider_FullMethodName = "/minder.v1.ProvidersService/DeleteProvider" ProvidersService_DeleteProviderByID_FullMethodName = "/minder.v1.ProvidersService/DeleteProviderByID" - ProvidersService_GetUnclaimedProviders_FullMethodName = "/minder.v1.ProvidersService/GetUnclaimedProviders" ProvidersService_ListProviderClasses_FullMethodName = "/minder.v1.ProvidersService/ListProviderClasses" ProvidersService_ReconcileEntityRegistration_FullMethodName = "/minder.v1.ProvidersService/ReconcileEntityRegistration" ) @@ -2634,10 +2963,6 @@ type ProvidersServiceClient interface { CreateProvider(ctx context.Context, in *CreateProviderRequest, opts ...grpc.CallOption) (*CreateProviderResponse, error) DeleteProvider(ctx context.Context, in *DeleteProviderRequest, opts ...grpc.CallOption) (*DeleteProviderResponse, error) DeleteProviderByID(ctx context.Context, in *DeleteProviderByIDRequest, opts ...grpc.CallOption) (*DeleteProviderByIDResponse, error) - // GetUnclaimedProviders returns a list of known provider configurations - // that this user could claim based on their identity. This is a read-only - // operation for use by clients which wish to present a menu of options. - GetUnclaimedProviders(ctx context.Context, in *GetUnclaimedProvidersRequest, opts ...grpc.CallOption) (*GetUnclaimedProvidersResponse, error) ListProviderClasses(ctx context.Context, in *ListProviderClassesRequest, opts ...grpc.CallOption) (*ListProviderClassesResponse, error) ReconcileEntityRegistration(ctx context.Context, in *ReconcileEntityRegistrationRequest, opts ...grpc.CallOption) (*ReconcileEntityRegistrationResponse, error) } @@ -2710,16 +3035,6 @@ func (c *providersServiceClient) DeleteProviderByID(ctx context.Context, in *Del return out, nil } -func (c *providersServiceClient) GetUnclaimedProviders(ctx context.Context, in *GetUnclaimedProvidersRequest, opts ...grpc.CallOption) (*GetUnclaimedProvidersResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(GetUnclaimedProvidersResponse) - err := c.cc.Invoke(ctx, ProvidersService_GetUnclaimedProviders_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *providersServiceClient) ListProviderClasses(ctx context.Context, in *ListProviderClassesRequest, opts ...grpc.CallOption) (*ListProviderClassesResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ListProviderClassesResponse) @@ -2750,10 +3065,6 @@ type ProvidersServiceServer interface { CreateProvider(context.Context, *CreateProviderRequest) (*CreateProviderResponse, error) DeleteProvider(context.Context, *DeleteProviderRequest) (*DeleteProviderResponse, error) DeleteProviderByID(context.Context, *DeleteProviderByIDRequest) (*DeleteProviderByIDResponse, error) - // GetUnclaimedProviders returns a list of known provider configurations - // that this user could claim based on their identity. This is a read-only - // operation for use by clients which wish to present a menu of options. - GetUnclaimedProviders(context.Context, *GetUnclaimedProvidersRequest) (*GetUnclaimedProvidersResponse, error) ListProviderClasses(context.Context, *ListProviderClassesRequest) (*ListProviderClassesResponse, error) ReconcileEntityRegistration(context.Context, *ReconcileEntityRegistrationRequest) (*ReconcileEntityRegistrationResponse, error) mustEmbedUnimplementedProvidersServiceServer() @@ -2784,9 +3095,6 @@ func (UnimplementedProvidersServiceServer) DeleteProvider(context.Context, *Dele func (UnimplementedProvidersServiceServer) DeleteProviderByID(context.Context, *DeleteProviderByIDRequest) (*DeleteProviderByIDResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteProviderByID not implemented") } -func (UnimplementedProvidersServiceServer) GetUnclaimedProviders(context.Context, *GetUnclaimedProvidersRequest) (*GetUnclaimedProvidersResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetUnclaimedProviders not implemented") -} func (UnimplementedProvidersServiceServer) ListProviderClasses(context.Context, *ListProviderClassesRequest) (*ListProviderClassesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListProviderClasses not implemented") } @@ -2922,24 +3230,6 @@ func _ProvidersService_DeleteProviderByID_Handler(srv interface{}, ctx context.C return interceptor(ctx, in, info, handler) } -func _ProvidersService_GetUnclaimedProviders_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetUnclaimedProvidersRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ProvidersServiceServer).GetUnclaimedProviders(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: ProvidersService_GetUnclaimedProviders_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ProvidersServiceServer).GetUnclaimedProviders(ctx, req.(*GetUnclaimedProvidersRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _ProvidersService_ListProviderClasses_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListProviderClassesRequest) if err := dec(in); err != nil { @@ -3007,10 +3297,6 @@ var ProvidersService_ServiceDesc = grpc.ServiceDesc{ MethodName: "DeleteProviderByID", Handler: _ProvidersService_DeleteProviderByID_Handler, }, - { - MethodName: "GetUnclaimedProviders", - Handler: _ProvidersService_GetUnclaimedProviders_Handler, - }, { MethodName: "ListProviderClasses", Handler: _ProvidersService_ListProviderClasses_Handler, diff --git a/pkg/api/protobuf/go/minder/v1/validators.go b/pkg/api/protobuf/go/minder/v1/validators.go index 290bc1240c..ed41311872 100644 --- a/pkg/api/protobuf/go/minder/v1/validators.go +++ b/pkg/api/protobuf/go/minder/v1/validators.go @@ -10,6 +10,10 @@ import ( "strings" "github.com/go-playground/validator/v10" + "github.com/itchyny/gojq" + "github.com/open-policy-agent/opa/ast" + + "github.com/mindersec/minder/internal/util" ) var ( @@ -148,10 +152,6 @@ func (rt *RuleType) Validate() error { return fmt.Errorf("%w: %w", ErrInvalidRuleType, err) } - if rt.Def == nil { - return fmt.Errorf("%w: rule type definition is nil", ErrInvalidRuleType) - } - if err := rt.Def.Validate(); err != nil { return errors.Join(ErrInvalidRuleType, err) } @@ -161,6 +161,10 @@ func (rt *RuleType) Validate() error { // Validate validates a rule type definition func (def *RuleType_Definition) Validate() error { + if def == nil { + return fmt.Errorf("%w: rule type definition is nil", ErrInvalidRuleTypeDefinition) + } + if !EntityFromString(def.InEntity).IsValid() { return fmt.Errorf("%w: invalid entity type: %s", ErrInvalidRuleTypeDefinition, def.InEntity) } @@ -175,8 +179,100 @@ func (def *RuleType_Definition) Validate() error { return err } - if def.Eval == nil { - return fmt.Errorf("%w: data eval is nil", ErrInvalidRuleTypeDefinition) + // Alert is not required and can be nil + if def.Alert != nil { + if err := def.Alert.Validate(); err != nil { + return err + } + } + + return def.Eval.Validate() +} + +// Validate validates a rule type definition eval +func (ev *RuleType_Definition_Eval) Validate() error { + if ev == nil { + return fmt.Errorf("%w: eval is nil", ErrInvalidRuleTypeDefinition) + } + + // Not using import to avoid circular dependency + if ev.Type == "rego" { + if err := ev.GetRego().Validate(); err != nil { + return err + } + } else if ev.Type == "jq" { + if len(ev.GetJq()) == 0 { + return fmt.Errorf("%w: jq definition is empty", ErrInvalidRuleTypeDefinition) + } + + for i, jq := range ev.GetJq() { + if err := jq.Validate(); err != nil { + return fmt.Errorf("jq rule %d is invalid: %w", i, err) + } + } + } + return nil +} + +// Validate validates a rule type definition eval rego +func (rego *RuleType_Definition_Eval_Rego) Validate() error { + if rego == nil { + return fmt.Errorf("%w: rego is nil", ErrInvalidRuleTypeDefinition) + } + + if rego.Def == "" { + return fmt.Errorf("%w: rego definition is empty", ErrInvalidRuleTypeDefinition) + } + + _, err := ast.ParseModule("minder-ruletype-def.rego", rego.Def) + if err != nil { + return fmt.Errorf("%w: rego definition is invalid: %s", ErrInvalidRuleTypeDefinition, err) + } + + return nil +} + +// Validate validates a rule type definition eval jq +func (jq *RuleType_Definition_Eval_JQComparison) Validate() error { + if jq == nil { + return fmt.Errorf("%w: jq is nil", ErrInvalidRuleTypeDefinition) + } + + if err := jq.GetIngested().Validate(); err != nil { + return fmt.Errorf("%w: jq ingested definition is invalid: %w", ErrInvalidRuleTypeDefinition, err) + } + + if jq.GetProfile() != nil && jq.GetConstant() != nil { + return fmt.Errorf("%w: jq profile and constant accessors are mutually exclusive", ErrInvalidRuleTypeDefinition) + } else if jq.GetProfile() == nil && jq.GetConstant() == nil { + return fmt.Errorf("%w: jq missing profile or constant accessor", ErrInvalidRuleTypeDefinition) + } + + if jq.GetProfile() != nil { + if err := jq.GetProfile().Validate(); err != nil { + return fmt.Errorf("%w: jq profile accessor is invalid: %w", ErrInvalidRuleTypeDefinition, err) + } + } + + return nil +} + +// Validate validates a rule type definition eval jq operator +func (op *RuleType_Definition_Eval_JQComparison_Operator) Validate() error { + if op == nil { + return fmt.Errorf("%w: operator is nil", ErrInvalidRuleTypeDefinition) + } + + if op.GetDef() == "" { + return fmt.Errorf("%w: definition is empty", ErrInvalidRuleTypeDefinition) + } + + q, err := gojq.Parse(op.GetDef()) + if err != nil { + return fmt.Errorf("%w: definition is not parsable: %w", ErrInvalidRuleTypeDefinition, err) + } + if _, err = gojq.Compile(q); err != nil { + return fmt.Errorf("%w: definition is invalid: %w", ErrInvalidRuleTypeDefinition, err) } return nil @@ -194,6 +290,137 @@ func (ing *RuleType_Definition_Ingest) Validate() error { } else if err := ing.GetDiff().Validate(); err != nil { return err } + } else if ing.Type == "rest" { + if err := ing.GetRest().Validate(); err != nil { + return err + } + } + + return nil +} + +// Validate validates a rule type definition alert +func (alert *RuleType_Definition_Alert) Validate() error { + if alert == nil { + return nil + } + + // Not using import to avoid circular dependency + if alert.Type == "security_advisory" { + if err := alert.GetSecurityAdvisory().Validate(); err != nil { + return err + } + } else if alert.Type == "pull_request_comment" { + if err := alert.GetPullRequestComment().Validate(); err != nil { + return err + } + } else { + return fmt.Errorf("%w: alert type cannot be empty", ErrInvalidRuleTypeDefinition) + } + return nil +} + +// Validate validates a rule type alert security advisory +func (sa *RuleType_Definition_Alert_AlertTypeSA) Validate() error { + if sa == nil { + return fmt.Errorf("%w: security advisory is nil", ErrInvalidRuleTypeDefinition) + } + + return nil +} + +// Validate validates a rule type alert pull request comment +func (comment *RuleType_Definition_Alert_AlertTypePRComment) Validate() error { + if comment == nil { + return fmt.Errorf("%w: pull request comment is nil", ErrInvalidRuleTypeDefinition) + } + + if comment.GetReviewMessage() == "" { + return fmt.Errorf("%w: pull request comment review message cannot be empty", ErrInvalidRuleTypeDefinition) + } + + _, err := util.NewSafeHTMLTemplate(&comment.ReviewMessage, "message") + if err != nil { + return fmt.Errorf("%w: pull request comment message is not parsable: %w", ErrInvalidRuleTypeDefinition, err) + } + + return nil +} + +// Validate validates a rule type definition remediate +func (rem *RuleType_Definition_Remediate) Validate() error { + if rem == nil { + return nil + } + + // Not using import to avoid circular dependency + if rem.Type == "rest" { + if err := rem.GetRest().Validate(); err != nil { + return err + } + } else if rem.Type == "pull_request" { + if err := rem.GetPullRequest().Validate(); err != nil { + return err + } + } else if rem.Type == "gh_branch_protection" { + if err := rem.GetGhBranchProtection().Validate(); err != nil { + return err + } + } else { + return fmt.Errorf("%w: remediate type cannot be empty", ErrInvalidRuleTypeDefinition) + } + return nil +} + +// Validate validates a rest remediation +func (rest *RestType) Validate() error { + if rest == nil { + return fmt.Errorf("%w: rest remediation is nil", ErrInvalidRuleTypeDefinition) + } + + if rest.Endpoint == "" { + return fmt.Errorf("%w: rest endpoint cannot be empty", ErrInvalidRuleTypeDefinition) + } + + return nil +} + +// Validate validates a GitHub branch protection remediation +func (ghp *RuleType_Definition_Remediate_GhBranchProtectionType) Validate() error { + if ghp == nil { + return fmt.Errorf("%w: github branch protection remediation is nil", ErrInvalidRuleTypeDefinition) + } + + _, err := util.NewSafeTextTemplate(&ghp.Patch, "patch") + if err != nil { + return fmt.Errorf("%w: patch template is not parsable: %w", ErrInvalidRuleTypeDefinition, err) + } + + return nil +} + +// Validate validates a pull request remediation +func (prRem *RuleType_Definition_Remediate_PullRequestRemediation) Validate() error { + if prRem == nil { + return fmt.Errorf("%w: pull request remediation is nil", ErrInvalidRuleTypeDefinition) + } + + if prRem.Title == "" { + return fmt.Errorf("%w: pull request title cannot be empty", ErrInvalidRuleTypeDefinition) + } + + if prRem.Body == "" { + return fmt.Errorf("%w: pull request body cannot be empty", ErrInvalidRuleTypeDefinition) + } + + _, err := util.NewSafeHTMLTemplate(&prRem.Title, "title") + if err != nil { + return fmt.Errorf("%w: pull request title is not parsable: %w", ErrInvalidRuleTypeDefinition, err) + } + + _, err = util.NewSafeHTMLTemplate(&prRem.Body, "body") + if err != nil { + return fmt.Errorf("%w: pull request body is not parsable: %w", ErrInvalidRuleTypeDefinition, err) } return nil @@ -290,33 +517,179 @@ func validateRule(r *Profile_Rule) error { var _ Validator = (*RuleType_Definition_Remediate_PullRequestRemediation)(nil) -// Validate validates a rule definition -func (prRem *RuleType_Definition_Remediate_PullRequestRemediation) Validate() error { - if prRem == nil { - return errors.New("pull request remediation is nil") +func validateNamespacedName(name string) error { + components := strings.Split(name, "/") + if len(components) > 2 { + return errors.New("cannot have more than one slash in name") + } + // if this is a namespaced name, validate both the namespace and the name + for _, component := range components { + if !dnsStyleNameRegex.MatchString(component) { + return ErrBadDNSStyleName + } + } + return nil +} + +// Validate validates data sources +func (ds *DataSource) Validate() error { + if ds == nil { + return fmt.Errorf("%w: data source is nil", ErrValidationFailed) } - if prRem.Title == "" { - return errors.New("title is required") + if ds.GetName() == "" { + return fmt.Errorf("%w: data source name cannot be empty", ErrValidationFailed) } - if prRem.Body == "" { - return errors.New("body is required") + if ds.GetDriver() == nil { + return fmt.Errorf("%w: data source driver cannot be nil", ErrValidationFailed) + } + + // All data source drivers must include validation + val, ok := ds.GetDriver().(Validator) + if !ok { + return fmt.Errorf("%w: data source driver is not a valid driver", ErrValidationFailed) + } + + return val.Validate() +} + +// Validate checks a structured data source to ensure it is valid +func (dsStructuredDriver *DataSource_Structured) Validate() error { + if dsStructuredDriver == nil || dsStructuredDriver.Structured == nil { + return fmt.Errorf("%w: structured driver is nil", ErrValidationFailed) } return nil } -func validateNamespacedName(name string) error { - components := strings.Split(name, "/") - if len(components) > 2 { - return errors.New("cannot have more than one slash in name") +// Validate is the entrypoint for the actual driver's validation +func (dsRestDriver *DataSource_Rest) Validate() error { + if dsRestDriver == nil { + return fmt.Errorf("%w: rest driver is nil", ErrValidationFailed) } - // if this is a namespaced name, validate both the namespace and the name - for _, component := range components { - if !dnsStyleNameRegex.MatchString(component) { - return ErrBadDNSStyleName + + if dsRestDriver.Rest == nil { + return fmt.Errorf("%w: rest driver is nil", ErrValidationFailed) + } + + return dsRestDriver.Rest.Validate() +} + +// Validate validates a rest data source +func (rest *RestDataSource) Validate() error { + if rest == nil { + return fmt.Errorf("%w: rest data source is nil", ErrValidationFailed) + } + + if len(rest.GetDef()) == 0 { + return fmt.Errorf("%w: rest definition is empty", ErrValidationFailed) + } + + var errs []error + for i, def := range rest.GetDef() { + if i == "" { + errs = append(errs, fmt.Errorf("rest function name %s is empty", i)) + } + + // TODO: Should we validate valid characters here? We already do that + // in the protobuf definition. + if err := def.Validate(); err != nil { + errs = append(errs, fmt.Errorf("rest function %s is invalid: %w", i, err)) } } + + if len(errs) > 0 { + return errors.Join(errs...) + } + + return nil +} + +// Validate validates a rest function +func (rest *RestDataSource_Def) Validate() error { + if rest == nil { + return fmt.Errorf("%w: rest function is nil", ErrValidationFailed) + } + + if rest.GetEndpoint() == "" { + return fmt.Errorf("%w: rest function endpoint is empty", ErrValidationFailed) + } + + if rest.GetInputSchema() == nil { + return fmt.Errorf("%w: rest function input schema is nil", ErrValidationFailed) + } + + if rest.GetBody() != nil { + switch rest.GetBody().(type) { + case *RestDataSource_Def_Bodyobj: + if rest.GetBodyobj() == nil { + return fmt.Errorf("%w: rest function body is nil", ErrValidationFailed) + } + case *RestDataSource_Def_BodyFromField: + if rest.GetBodyFromField() == "" { + return fmt.Errorf("%w: rest function body from field is empty", ErrValidationFailed) + } + if err := keyInProperties(rest.GetBodyFromField(), rest.GetInputSchema().AsMap()); err != nil { + return fmt.Errorf("%w: %v", ErrValidationFailed, err) + } + case *RestDataSource_Def_Bodystr: + if rest.GetBodystr() == "" { + return fmt.Errorf("%w: rest function body from input is empty", ErrValidationFailed) + } + } + } + + return nil +} + +// validate that the given key exists in the given properties. +// they key must exist in the top level properties. It must contain a default +// or be marked as required. +func keyInProperties(key string, schema map[string]any) error { + if schema == nil { + return fmt.Errorf("properties are missing") + } + + // check required + required, ok := schema["required"] + if ok { + req, ok := required.([]any) + if !ok { + return fmt.Errorf("required is invalid") + } + for _, r := range req { + if r == key { + return nil + } + } + } + + props, ok := schema["properties"] + if !ok { + return fmt.Errorf("properties are missing") + } + + properties, ok := props.(map[string]any) + if !ok { + return fmt.Errorf("properties are invalid") + } + + prop, ok := properties[key] + if !ok { + return fmt.Errorf("key %q is missing", key) + } + + p, ok := prop.(map[string]any) + if !ok { + return fmt.Errorf("key %q is invalid", key) + } + + if _, ok := p["default"]; !ok { + if _, ok := p["required"]; !ok { + return fmt.Errorf("key %q is missing default or required", key) + } + } + return nil } diff --git a/pkg/api/protobuf/go/minder/v1/validators_test.go b/pkg/api/protobuf/go/minder/v1/validators_test.go new file mode 100644 index 0000000000..cf149e75d1 --- /dev/null +++ b/pkg/api/protobuf/go/minder/v1/validators_test.go @@ -0,0 +1,547 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package v1 + +import ( + "testing" + + "google.golang.org/protobuf/types/known/structpb" +) + +func TestRuleType_Definition_Ingest_Validate(t *testing.T) { + t.Parallel() + tests := []struct { + name string + ingest *RuleType_Definition_Ingest + wantErr bool + }{ + { + name: "valid diff ingest", + ingest: &RuleType_Definition_Ingest{ + Type: IngestTypeDiff, + Diff: &DiffType{}, + }, + wantErr: false, + }, + { + name: "valid rest ingest", + ingest: &RuleType_Definition_Ingest{ + Type: "rest", + Rest: &RestType{ + Endpoint: "https://example.com/api", + }, + }, + wantErr: false, + }, + { + name: "nil ingest", + ingest: nil, + wantErr: true, + }, + { + name: "invalid diff ingest", + ingest: &RuleType_Definition_Ingest{ + Type: IngestTypeDiff, + Diff: nil, + }, + wantErr: true, + }, + { + name: "invalid rest ingest", + ingest: &RuleType_Definition_Ingest{ + Type: "rest", + Rest: &RestType{ + Endpoint: "", + }, + }, + wantErr: true, + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + err := tt.ingest.Validate() + if (err != nil) != tt.wantErr { + t.Errorf("Validate() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestRuleType_Definition_Eval_JQComparison_Validate(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + jq *RuleType_Definition_Eval_JQComparison + wantErr bool + }{ + { + name: "valid JQComparison", + jq: &RuleType_Definition_Eval_JQComparison{ + Ingested: &RuleType_Definition_Eval_JQComparison_Operator{ + Def: ".", + }, + Profile: &RuleType_Definition_Eval_JQComparison_Operator{ + Def: ".", + }, + }, + wantErr: false, + }, + { + name: "nil JQComparison", + jq: nil, + wantErr: true, + }, + { + name: "empty ingested definition", + jq: &RuleType_Definition_Eval_JQComparison{ + Ingested: &RuleType_Definition_Eval_JQComparison_Operator{ + Def: "", + }, + }, + wantErr: true, + }, + { + name: "profile and constant accessors both present", + jq: &RuleType_Definition_Eval_JQComparison{ + Ingested: &RuleType_Definition_Eval_JQComparison_Operator{ + Def: ".", + }, + Profile: &RuleType_Definition_Eval_JQComparison_Operator{ + Def: ".", + }, + Constant: structpb.NewStringValue("constant definition"), + }, + wantErr: true, + }, + { + name: "missing profile or constant accessor", + jq: &RuleType_Definition_Eval_JQComparison{ + Ingested: &RuleType_Definition_Eval_JQComparison_Operator{ + Def: ".", + }, + }, + wantErr: true, + }, + { + name: "empty profile accessor definition", + jq: &RuleType_Definition_Eval_JQComparison{ + Ingested: &RuleType_Definition_Eval_JQComparison_Operator{ + Def: ".", + }, + Profile: &RuleType_Definition_Eval_JQComparison_Operator{ + Def: "", + }, + }, + wantErr: true, + }, + { + name: "unparsable ingested definition", + jq: &RuleType_Definition_Eval_JQComparison{ + Ingested: &RuleType_Definition_Eval_JQComparison_Operator{ + Def: ".foo[", + }, + Profile: &RuleType_Definition_Eval_JQComparison_Operator{ + Def: ".", + }, + }, + wantErr: true, + }, + { + name: "invalid ingested definition", + jq: &RuleType_Definition_Eval_JQComparison{ + Ingested: &RuleType_Definition_Eval_JQComparison_Operator{ + Def: "invalid", + }, + Profile: &RuleType_Definition_Eval_JQComparison_Operator{ + Def: ".", + }, + }, + wantErr: true, + }, + { + name: "unparsable profile accessor definition", + jq: &RuleType_Definition_Eval_JQComparison{ + Ingested: &RuleType_Definition_Eval_JQComparison_Operator{ + Def: ".", + }, + Profile: &RuleType_Definition_Eval_JQComparison_Operator{ + Def: ".foo[", + }, + }, + wantErr: true, + }, + { + name: "invalid profile accessor definition", + jq: &RuleType_Definition_Eval_JQComparison{ + Ingested: &RuleType_Definition_Eval_JQComparison_Operator{ + Def: ".", + }, + Profile: &RuleType_Definition_Eval_JQComparison_Operator{ + Def: "invalid", + }, + }, + wantErr: true, + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + err := tt.jq.Validate() + if (err != nil) != tt.wantErr { + t.Errorf("Validate() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestRuleType_Definition_Eval_Rego_Validate(t *testing.T) { + t.Parallel() + tests := []struct { + name string + rego *RuleType_Definition_Eval_Rego + wantErr bool + }{ + { + name: "valid rego definition", + rego: &RuleType_Definition_Eval_Rego{ + Def: "package example.policy\n\nallow { true }", + }, + wantErr: false, + }, + { + name: "nil rego", + rego: nil, + wantErr: true, + }, + { + name: "empty rego definition", + rego: &RuleType_Definition_Eval_Rego{ + Def: "", + }, + wantErr: true, + }, + { + name: "invalid syntax rego definition", + rego: &RuleType_Definition_Eval_Rego{ + Def: "package example.policy\n\nallow {", + }, + wantErr: true, + }, + { + name: "missing import rego definition", + rego: &RuleType_Definition_Eval_Rego{ + Def: "package example.policy\n\nallow if { input.ingested.url != \"\" }", + }, + wantErr: true, + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + err := tt.rego.Validate() + if (err != nil) != tt.wantErr { + t.Errorf("Validate() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestRuleType_Definition_Alert_Validate(t *testing.T) { + t.Parallel() + tests := []struct { + name string + alert *RuleType_Definition_Alert + wantErr bool + }{ + { + name: "valid alert definition", + alert: &RuleType_Definition_Alert{ + Type: "security_advisory", + SecurityAdvisory: &RuleType_Definition_Alert_AlertTypeSA{}, + }, + wantErr: false, + }, + { + name: "nil alert is valid", + alert: nil, + wantErr: false, + }, + { + name: "empty alert type", + alert: &RuleType_Definition_Alert{ + Type: "", + }, + wantErr: true, + }, + { + name: "invalid security advisory", + alert: &RuleType_Definition_Alert{ + Type: "security_advisory", + SecurityAdvisory: nil, + }, + wantErr: true, + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + err := tt.alert.Validate() + if (err != nil) != tt.wantErr { + t.Errorf("Validate() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestRuleType_Definition_Alert_AlertTypePRComment_Validate(t *testing.T) { + t.Parallel() + tests := []struct { + name string + prAlert *RuleType_Definition_Alert_AlertTypePRComment + wantErr bool + }{ + { + name: "valid PR comment alert", + prAlert: &RuleType_Definition_Alert_AlertTypePRComment{ + ReviewMessage: "This is a PR comment", + }, + wantErr: false, + }, + { + name: "valid PR comment alert template", + prAlert: &RuleType_Definition_Alert_AlertTypePRComment{ + ReviewMessage: "This is a PR comment with a template {{ .EvalErrorDetails }}", + }, + wantErr: false, + }, + { + name: "unparsable PR comment alert template", + prAlert: &RuleType_Definition_Alert_AlertTypePRComment{ + ReviewMessage: "{{ ", + }, + wantErr: true, + }, + { + name: "empty PR comment message is invalid", + wantErr: true, + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + err := tt.prAlert.Validate() + if (err != nil) != tt.wantErr { + t.Errorf("Validate() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestRuleType_Definition_Remediate_Validate(t *testing.T) { + t.Parallel() + tests := []struct { + name string + rem *RuleType_Definition_Remediate + wantErr bool + }{ + { + name: "valid rest remediation", + rem: &RuleType_Definition_Remediate{ + Type: "rest", + Rest: &RestType{ + Endpoint: "https://example.com/api", + }, + }, + wantErr: false, + }, + { + name: "valid pull request remediation", + rem: &RuleType_Definition_Remediate{ + Type: "pull_request", + PullRequest: &RuleType_Definition_Remediate_PullRequestRemediation{ + Title: "Fix issue", + Body: "This PR fixes the issue.", + }, + }, + wantErr: false, + }, + { + name: "valid GitHub branch protection remediation", + rem: &RuleType_Definition_Remediate{ + Type: "gh_branch_protection", + GhBranchProtection: &RuleType_Definition_Remediate_GhBranchProtectionType{ + Patch: "patch content", + }, + }, + wantErr: false, + }, + { + name: "nil remediation", + rem: nil, + wantErr: false, + }, + { + name: "empty remediation type", + rem: &RuleType_Definition_Remediate{ + Type: "", + }, + wantErr: true, + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + err := tt.rem.Validate() + if (err != nil) != tt.wantErr { + t.Errorf("Validate() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestRestType_Validate(t *testing.T) { + t.Parallel() + tests := []struct { + name string + rest *RestType + wantErr bool + }{ + { + name: "valid rest remediation", + rest: &RestType{ + Endpoint: "https://example.com/api", + }, + wantErr: false, + }, + { + name: "empty remediation endpoint", + rest: &RestType{ + Endpoint: "", + }, + wantErr: true, + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + err := tt.rest.Validate() + if (err != nil) != tt.wantErr { + t.Errorf("Validate() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestRuleType_Definition_Remediate_PullRequestRemediation_Validate(t *testing.T) { + t.Parallel() + tests := []struct { + name string + prRem *RuleType_Definition_Remediate_PullRequestRemediation + wantErr bool + }{ + { + name: "valid pull request remediation", + prRem: &RuleType_Definition_Remediate_PullRequestRemediation{ + Title: "Fix issue", + Body: "This pull request adds a Dependabot configuration to the repository to handle package updates for {{.Profile.package_ecosystem }}.", + }, + wantErr: false, + }, + { + name: "empty pull request title", + prRem: &RuleType_Definition_Remediate_PullRequestRemediation{ + Title: "", + Body: "This pull request adds a Dependabot configuration to the repository to handle package updates for {{.Profile.package_ecosystem }}.", + }, + wantErr: true, + }, + { + name: "empty pull request body", + prRem: &RuleType_Definition_Remediate_PullRequestRemediation{ + Title: "Fix issue", + Body: "", + }, + wantErr: true, + }, + { + name: "malformed pull request body", + prRem: &RuleType_Definition_Remediate_PullRequestRemediation{ + Title: "Fix issue", + Body: "{{ .Name", + }, + wantErr: true, + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + err := tt.prRem.Validate() + if (err != nil) != tt.wantErr { + t.Errorf("Validate() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestRuleType_Definition_Remediate_GhBranchProtectionType_Validate(t *testing.T) { + t.Parallel() + tests := []struct { + name string + ghp *RuleType_Definition_Remediate_GhBranchProtectionType + wantErr bool + }{ + { + name: "valid GitHub branch protection remediation", + ghp: &RuleType_Definition_Remediate_GhBranchProtectionType{ + Patch: "patch content", + }, + wantErr: false, + }, + { + name: "empty branch protection patch template", + ghp: &RuleType_Definition_Remediate_GhBranchProtectionType{ + Patch: "", + }, + wantErr: true, + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + err := tt.ghp.Validate() + if (err != nil) != tt.wantErr { + t.Errorf("Validate() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/pkg/config/server/config.go b/pkg/config/server/config.go index 31e1127ef4..235d1e662b 100644 --- a/pkg/config/server/config.go +++ b/pkg/config/server/config.go @@ -30,6 +30,7 @@ type Config struct { Auth AuthConfig `mapstructure:"auth"` WebhookConfig WebhookConfig `mapstructure:"webhook-config"` Events EventConfig `mapstructure:"events"` + Features FeaturesConfig `mapstructure:"features"` Authz AuthzConfig `mapstructure:"authz"` Provider ProviderConfig `mapstructure:"provider"` Marketplace MarketplaceConfig `mapstructure:"marketplace"` diff --git a/pkg/config/server/events.go b/pkg/config/server/events.go index 9fc248e84a..182c155250 100644 --- a/pkg/config/server/events.go +++ b/pkg/config/server/events.go @@ -13,6 +13,9 @@ import ( type EventConfig struct { // Driver is the driver used to store events Driver string `mapstructure:"driver" default:"go-channel"` + // Flags is the configuration for selecting multiple publishing drivers + // via the "alternate_message_driver" feature flag. + Flags FlagDriverConfig `mapstructure:"flags"` // RouterCloseTimeout is the timeout for closing the router in seconds RouterCloseTimeout int64 `mapstructure:"router_close_timeout" default:"10"` // GoChannel is the configuration for the go channel event driver @@ -65,3 +68,16 @@ type NatsConfig struct { // queue groups allow multiple process to round-robin process messages. Queue string `mapstructure:"queue" default:"minder"` } + +// FlagDriverConfig holds the configuration for selecting multiple publishing drivers +// when using feature flags to migrate from one publishing mechanism to another. +// When using the "flagged" driver, events will be read from _both_ drivers, but +// published to the driver selected by the flag configuration. +type FlagDriverConfig struct { + // MainDriver is the default driver used to publish events if not selected + // by the feature flag. + MainDriver string `mapstructure:"main_driver" default:""` + // AlternateDriver is a driver used to publish events selected by the + // feature flag. + AlternateDriver string `mapstructure:"alternate_driver" default:""` +} diff --git a/pkg/config/server/features.go b/pkg/config/server/features.go new file mode 100644 index 0000000000..a07c4c7237 --- /dev/null +++ b/pkg/config/server/features.go @@ -0,0 +1,53 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package server + +import ( + "context" + + "github.com/mindersec/minder/internal/auth/jwt" +) + +// FeaturesConfig is the configuration for the features +type FeaturesConfig struct { + // MembershipFeatureMapping maps a membership to a feature + MembershipFeatureMapping map[string]string `mapstructure:"membership_feature_mapping"` +} + +// GetFeaturesForMemberships returns the features associated with the memberships in the context +func (fc *FeaturesConfig) GetFeaturesForMemberships(ctx context.Context) []string { + memberships := extractMembershipsFromContext(ctx) + + features := make([]string, 0, len(memberships)) + for _, m := range memberships { + if feature := fc.MembershipFeatureMapping[m]; feature != "" { + features = append(features, feature) + } + } + + return features +} + +// extractMembershipsFromContext extracts memberships from the JWT in the context. +// Returns empty slice if no memberships are found. +func extractMembershipsFromContext(ctx context.Context) []string { + realmAccess, ok := jwt.GetUserClaimFromContext[map[string]any](ctx, "realm_access") + if !ok { + return nil + } + + rawMemberships, ok := realmAccess["roles"].([]any) + if !ok { + return nil + } + + memberships := make([]string, 0, len(rawMemberships)) + for _, membership := range rawMemberships { + if membershipStr, ok := membership.(string); ok { + memberships = append(memberships, membershipStr) + } + } + + return memberships +} diff --git a/pkg/datasources/v1/datasources.go b/pkg/datasources/v1/datasources.go new file mode 100644 index 0000000000..c5bbc6c5cb --- /dev/null +++ b/pkg/datasources/v1/datasources.go @@ -0,0 +1,65 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package v1 provides the interfaces and types for the data sources. +package v1 + +import ( + "context" + + "github.com/mindersec/minder/pkg/engine/v1/interfaces" +) + +//go:generate go run go.uber.org/mock/mockgen -package mock_$GOPACKAGE -destination=./mock/$GOFILE -source=./$GOFILE + +const ( + // DataSourceDriverStruct is the driver type for the structured data source + DataSourceDriverStruct = "structured" + // DataSourceDriverRest is the driver type for a REST data source. + DataSourceDriverRest = "rest" +) + +// DataSourceFuncKey is the key that uniquely identifies a data source function. +type DataSourceFuncKey string + +// String returns the string representation of the data source function key. +func (k DataSourceFuncKey) String() string { + return string(k) +} + +// DataSourceFuncDef is the definition of a data source function. +// It contains the key that uniquely identifies the function and the arguments +// that the function can take. +type DataSourceFuncDef interface { + // ValidateArgs validates the arguments of the function. + ValidateArgs(obj any) error + // ValidateUpdate validates the update to the data source. + // The data source implementation should respect the update and return an error + // if the update is invalid. + ValidateUpdate(obj any) error + // Call calls the function with the given arguments. + // It is the responsibility of the data source implementation to handle the call. + // It is also the responsibility of the caller to validate the arguments + // before calling the function. + Call(ctx context.Context, args any) (any, error) + // GetArgsSchema returns the schema of the arguments. + GetArgsSchema() any +} + +// DataSource is the interface that a data source must implement. +// It implements several functions that will be used by the engine to +// interact with external systems. These get taken into used by the Evaluator. +// Moreover, a data source must be able to validate an update to itself. +type DataSource interface { + // GetFuncs returns the functions that the data source provides. + GetFuncs() map[DataSourceFuncKey]DataSourceFuncDef +} + +// ContextKey type to store/retrieve the context +type ContextKey struct { +} + +// Context encapsulates the context passed to all context function calls +type Context struct { + Ingest *interfaces.Result +} diff --git a/pkg/datasources/v1/mock/datasources.go b/pkg/datasources/v1/mock/datasources.go new file mode 100644 index 0000000000..596e851c76 --- /dev/null +++ b/pkg/datasources/v1/mock/datasources.go @@ -0,0 +1,137 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: ./datasources.go +// +// Generated by this command: +// +// mockgen -package mock_v1 -destination=./mock/datasources.go -source=./datasources.go +// + +// Package mock_v1 is a generated GoMock package. +package mock_v1 + +import ( + context "context" + reflect "reflect" + + v1 "github.com/mindersec/minder/pkg/datasources/v1" + gomock "go.uber.org/mock/gomock" +) + +// MockDataSourceFuncDef is a mock of DataSourceFuncDef interface. +type MockDataSourceFuncDef struct { + ctrl *gomock.Controller + recorder *MockDataSourceFuncDefMockRecorder + isgomock struct{} +} + +// MockDataSourceFuncDefMockRecorder is the mock recorder for MockDataSourceFuncDef. +type MockDataSourceFuncDefMockRecorder struct { + mock *MockDataSourceFuncDef +} + +// NewMockDataSourceFuncDef creates a new mock instance. +func NewMockDataSourceFuncDef(ctrl *gomock.Controller) *MockDataSourceFuncDef { + mock := &MockDataSourceFuncDef{ctrl: ctrl} + mock.recorder = &MockDataSourceFuncDefMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockDataSourceFuncDef) EXPECT() *MockDataSourceFuncDefMockRecorder { + return m.recorder +} + +// Call mocks base method. +func (m *MockDataSourceFuncDef) Call(ctx context.Context, args any) (any, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Call", ctx, args) + ret0, _ := ret[0].(any) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Call indicates an expected call of Call. +func (mr *MockDataSourceFuncDefMockRecorder) Call(ctx, args any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Call", reflect.TypeOf((*MockDataSourceFuncDef)(nil).Call), ctx, args) +} + +// GetArgsSchema mocks base method. +func (m *MockDataSourceFuncDef) GetArgsSchema() any { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetArgsSchema") + ret0, _ := ret[0].(any) + return ret0 +} + +// GetArgsSchema indicates an expected call of GetArgsSchema. +func (mr *MockDataSourceFuncDefMockRecorder) GetArgsSchema() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetArgsSchema", reflect.TypeOf((*MockDataSourceFuncDef)(nil).GetArgsSchema)) +} + +// ValidateArgs mocks base method. +func (m *MockDataSourceFuncDef) ValidateArgs(obj any) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ValidateArgs", obj) + ret0, _ := ret[0].(error) + return ret0 +} + +// ValidateArgs indicates an expected call of ValidateArgs. +func (mr *MockDataSourceFuncDefMockRecorder) ValidateArgs(obj any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidateArgs", reflect.TypeOf((*MockDataSourceFuncDef)(nil).ValidateArgs), obj) +} + +// ValidateUpdate mocks base method. +func (m *MockDataSourceFuncDef) ValidateUpdate(obj any) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ValidateUpdate", obj) + ret0, _ := ret[0].(error) + return ret0 +} + +// ValidateUpdate indicates an expected call of ValidateUpdate. +func (mr *MockDataSourceFuncDefMockRecorder) ValidateUpdate(obj any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidateUpdate", reflect.TypeOf((*MockDataSourceFuncDef)(nil).ValidateUpdate), obj) +} + +// MockDataSource is a mock of DataSource interface. +type MockDataSource struct { + ctrl *gomock.Controller + recorder *MockDataSourceMockRecorder + isgomock struct{} +} + +// MockDataSourceMockRecorder is the mock recorder for MockDataSource. +type MockDataSourceMockRecorder struct { + mock *MockDataSource +} + +// NewMockDataSource creates a new mock instance. +func NewMockDataSource(ctrl *gomock.Controller) *MockDataSource { + mock := &MockDataSource{ctrl: ctrl} + mock.recorder = &MockDataSourceMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockDataSource) EXPECT() *MockDataSourceMockRecorder { + return m.recorder +} + +// GetFuncs mocks base method. +func (m *MockDataSource) GetFuncs() map[v1.DataSourceFuncKey]v1.DataSourceFuncDef { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetFuncs") + ret0, _ := ret[0].(map[v1.DataSourceFuncKey]v1.DataSourceFuncDef) + return ret0 +} + +// GetFuncs indicates an expected call of GetFuncs. +func (mr *MockDataSourceMockRecorder) GetFuncs() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetFuncs", reflect.TypeOf((*MockDataSource)(nil).GetFuncs)) +} diff --git a/pkg/datasources/v1/registry.go b/pkg/datasources/v1/registry.go new file mode 100644 index 0000000000..a1b71a92f5 --- /dev/null +++ b/pkg/datasources/v1/registry.go @@ -0,0 +1,66 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +package v1 + +import ( + "errors" + "fmt" + + "github.com/puzpuzpuz/xsync/v3" +) + +var ( + // ErrDuplicateDataSourceFuncKey is the error returned when a data source + // function key is already registered. + ErrDuplicateDataSourceFuncKey = errors.New("duplicate data source function key") +) + +// DataSourceRegistry is the interface that a data source registry must implement. +// It provides methods to register a data source and get all functions that +// data sources provide globally. +type DataSourceRegistry struct { + r *xsync.MapOf[DataSourceFuncKey, DataSourceFuncDef] +} + +// NewDataSourceRegistry creates a new data source registry. +func NewDataSourceRegistry() *DataSourceRegistry { + return &DataSourceRegistry{ + r: xsync.NewMapOf[DataSourceFuncKey, DataSourceFuncDef](), + } +} + +// RegisterDataSource registers a data source with the registry. +// Note that the name of the data source must be unique. +func (reg *DataSourceRegistry) RegisterDataSource(name string, ds DataSource) (err error) { + for key, f := range ds.GetFuncs() { + funckey := makeKey(name, key) + if _, ok := reg.r.Load(funckey); ok { + return fmt.Errorf("%w: %s", ErrDuplicateDataSourceFuncKey, funckey) + } + + // We only flush the store if there was no error + defer func() { + if err == nil { + reg.r.Store(funckey, f) + } + }() + } + + return nil +} + +// GetFuncs returns all functions that data sources provide globally. +func (reg *DataSourceRegistry) GetFuncs() map[DataSourceFuncKey]DataSourceFuncDef { + out := make(map[DataSourceFuncKey]DataSourceFuncDef, reg.r.Size()) + reg.r.Range(func(key DataSourceFuncKey, value DataSourceFuncDef) bool { + out[key] = value + return true + }) + + return out +} + +func makeKey(name string, key DataSourceFuncKey) DataSourceFuncKey { + return DataSourceFuncKey(name + "." + key.String()) +} diff --git a/pkg/engine/v1/interfaces/interfaces.go b/pkg/engine/v1/interfaces/interfaces.go index f7f499ac6a..261bc2aa97 100644 --- a/pkg/engine/v1/interfaces/interfaces.go +++ b/pkg/engine/v1/interfaces/interfaces.go @@ -26,7 +26,7 @@ type Ingester interface { // Evaluator is the interface for a rule type evaluator type Evaluator interface { - Eval(ctx context.Context, profile map[string]any, entity protoreflect.ProtoMessage, res *Result) error + Eval(ctx context.Context, profile map[string]any, entity protoreflect.ProtoMessage, res *Result) (*EvaluationResult, error) } // Result is the result of an ingester @@ -38,6 +38,9 @@ type Result struct { // is normally used by the evaluator to do rule evaluation. The filesystem // may be a git repo, or a memory filesystem. Fs billy.Filesystem + // BaseFs is the base filesystem for a pull request. It can be used in the + // evaluator for diffing the PR target files against the base files. + BaseFs billy.Filesystem // Storer is the git storer that was created as a result of the ingestion. // FIXME: It might be cleaner to either wrap both Fs and Storer in a struct // or pass out the git.Repository structure instead of the storer. @@ -48,6 +51,13 @@ type Result struct { Checkpoint *checkpoints.CheckpointEnvelopeV1 } +// EvaluationResult is the result of an evaluation +type EvaluationResult struct { + // Output is the output of the evaluation. This contains a list of additional + // information about the evaluation, which may be used in downstream actions. + Output any +} + // GetCheckpoint returns the checkpoint of the result func (r *Result) GetCheckpoint() *checkpoints.CheckpointEnvelopeV1 { if r == nil { diff --git a/pkg/engine/v1/rtengine/engine.go b/pkg/engine/v1/rtengine/engine.go index d72fa698b4..e8d0d0c504 100644 --- a/pkg/engine/v1/rtengine/engine.go +++ b/pkg/engine/v1/rtengine/engine.go @@ -10,6 +10,7 @@ import ( "runtime/debug" "strings" + "github.com/open-feature/go-sdk/openfeature" "github.com/rs/zerolog" "google.golang.org/protobuf/reflect/protoreflect" @@ -67,6 +68,7 @@ func NewRuleTypeEngine( ctx context.Context, ruletype *minderv1.RuleType, provider provinfv1.Provider, + experiments openfeature.IClient, opts ...eoptions.Option, ) (*RuleTypeEngine, error) { rval, err := profiles.NewRuleValidator(ruletype) @@ -79,7 +81,7 @@ func NewRuleTypeEngine( return nil, fmt.Errorf("cannot create rule data ingest: %w", err) } - evaluator, err := eval.NewRuleEvaluator(ctx, ruletype, provider, opts...) + evaluator, err := eval.NewRuleEvaluator(ctx, ruletype, provider, experiments, opts...) if err != nil { return nil, fmt.Errorf("cannot create rule evaluator: %w", err) } @@ -135,7 +137,7 @@ func (r *RuleTypeEngine) Eval( ruleDef map[string]any, ruleParams map[string]any, params interfaces.ResultSink, -) (finalErr error) { +) (res *interfaces.EvaluationResult, finalErr error) { logger := zerolog.Ctx(ctx) defer func() { if r := recover(); r != nil { @@ -146,6 +148,22 @@ func (r *RuleTypeEngine) Eval( } }() + // The rule type has already been validated at creation time. However, + // re-validating it here is a good idea to ensure that the rule type + // has not been tampered with. Also, this sets the defaults for the + // rule definition. + if ruleDef != nil { + if err := r.ruleValidator.ValidateRuleDefAgainstSchema(ruleDef); err != nil { + return nil, fmt.Errorf("rule definition validation failed: %w", err) + } + } + + if ruleParams != nil { + if err := r.ruleValidator.ValidateParamsAgainstSchema(ruleParams); err != nil { + return nil, fmt.Errorf("rule parameters validation failed: %w", err) + } + } + logger.Info().Msg("entity evaluation - ingest started") // Try looking at the ingesting cache first result, ok := r.ingestCache.Get(r.ingester, entity, ruleParams) @@ -156,7 +174,7 @@ func (r *RuleTypeEngine) Eval( if err != nil { // Ingesting failed, so we can't evaluate the rule. // Note that for some types of ingesting the evalErr can already be set from the ingester. - return fmt.Errorf("error ingesting data: %w", err) + return nil, fmt.Errorf("error ingesting data: %w", err) } r.ingestCache.Set(r.ingester, entity, ruleParams, result) } else { @@ -167,9 +185,9 @@ func (r *RuleTypeEngine) Eval( // Process evaluation logger.Info().Msg("entity evaluation - evaluation started") - err := r.ruleEvaluator.Eval(ctx, ruleDef, entity, result) + res, err := r.ruleEvaluator.Eval(ctx, ruleDef, entity, result) logger.Info().Msg("entity evaluation - evaluation completed") - return err + return res, err } // WithCustomIngester sets a custom ingester for the rule type engine. This is handy for testing diff --git a/pkg/engine/v1/rtengine/engine_test.go b/pkg/engine/v1/rtengine/engine_test.go index 9aa97169fc..477048c4a4 100644 --- a/pkg/engine/v1/rtengine/engine_test.go +++ b/pkg/engine/v1/rtengine/engine_test.go @@ -92,13 +92,13 @@ allow { } tk := tkv1.NewTestKit(tkv1.WithGitDir(tdir)) - rte, err := NewRuleTypeEngine(ctx, tt.ruleType, tk) + rte, err := NewRuleTypeEngine(ctx, tt.ruleType, tk, nil) require.NoError(t, err, "NewRuleTypeEngine() failed") // Override ingester. This is needed for the test. rte.WithCustomIngester(tk) - err = rte.Eval(ctx, tt.ent, tt.ri.Def, tt.ri.Params, tkv1.NewVoidResultSink()) + _, err = rte.Eval(ctx, tt.ent, tt.ri.Def, tt.ri.Params, tkv1.NewVoidResultSink()) if tt.wantErr { assert.Error(t, err, "Eval() should have failed") } else { diff --git a/pkg/eventer/constants/constants.go b/pkg/eventer/constants/constants.go index cd7c0041e7..f6fbc4b4f9 100644 --- a/pkg/eventer/constants/constants.go +++ b/pkg/eventer/constants/constants.go @@ -14,18 +14,12 @@ const ( GoChannelDriver = "go-channel" SQLDriver = "sql" NATSDriver = "cloudevents-nats" + FlaggedDriver = "flagged" DeadLetterQueueTopic = "dead_letter_queue" PublishedKey = "published_at" ) -const ( - // MetricsNamespace is the namespace for all metrics emitted by the eventer - MetricsNamespace = "minder" - // MetricsSubsystem is the subsystem for all metrics emitted by the eventer - MetricsSubsystem = "eventer" -) - const ( // TopicQueueOriginatingEntityAdd adds an entity originating from another entity to the database TopicQueueOriginatingEntityAdd = "originating.entity.add.event" diff --git a/pkg/profiles/rule_validator.go b/pkg/profiles/rule_validator.go index e0c7a168dd..3e800fa3a6 100644 --- a/pkg/profiles/rule_validator.go +++ b/pkg/profiles/rule_validator.go @@ -5,10 +5,10 @@ package profiles import ( "fmt" - "strings" - "github.com/xeipuuv/gojsonschema" + "github.com/santhosh-tekuri/jsonschema/v6" + "github.com/mindersec/minder/internal/util/schemavalidate" minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" ) @@ -18,32 +18,32 @@ type RuleValidator struct { ruleTypeName string // schema is the schema that this rule type must conform to - schema *gojsonschema.Schema + schema *jsonschema.Schema // paramSchema is the schema that the parameters for this rule type must conform to - paramSchema *gojsonschema.Schema + paramSchema *jsonschema.Schema } // NewRuleValidator creates a new rule validator func NewRuleValidator(rt *minderv1.RuleType) (*RuleValidator, error) { - // Load schemas - schemaLoader := gojsonschema.NewGoLoader(rt.Def.RuleSchema) - schema, err := gojsonschema.NewSchema(schemaLoader) + if rt.GetDef().GetRuleSchema() == nil { + return nil, fmt.Errorf("rule type %s does not have a rule schema", rt.Name) + } + // Create a new schema compiler + // Compile the main rule schema + mainSchema, err := schemavalidate.CompileSchemaFromPB(rt.GetDef().GetRuleSchema()) if err != nil { return nil, fmt.Errorf("cannot create json schema: %w", err) } - var paramSchema *gojsonschema.Schema - if rt.Def.ParamSchema != nil { - paramSchemaLoader := gojsonschema.NewGoLoader(rt.Def.ParamSchema) - paramSchema, err = gojsonschema.NewSchema(paramSchemaLoader) - if err != nil { - return nil, fmt.Errorf("cannot create json schema for params: %w", err) - } + // Compile the parameter schema if it exists + paramSchema, err := schemavalidate.CompileSchemaFromPB(rt.GetDef().GetParamSchema()) + if err != nil { + return nil, fmt.Errorf("cannot create json schema for params: %w", err) } return &RuleValidator{ ruleTypeName: rt.Name, - schema: schema, + schema: mainSchema, paramSchema: paramSchema, }, nil } @@ -51,13 +51,13 @@ func NewRuleValidator(rt *minderv1.RuleType) (*RuleValidator, error) { // ValidateRuleDefAgainstSchema validates the given contextual profile against the // schema for this rule type func (r *RuleValidator) ValidateRuleDefAgainstSchema(contextualProfile map[string]any) error { - if err := validateAgainstSchema(r.schema, contextualProfile); err != nil { + if err := schemavalidate.ValidateAgainstSchema(r.schema, contextualProfile); err != nil { return &RuleValidationError{ RuleType: r.ruleTypeName, Err: err.Error(), } } - + schemavalidate.ApplyDefaults(r.schema, contextualProfile) return nil } @@ -67,36 +67,12 @@ func (r *RuleValidator) ValidateParamsAgainstSchema(params map[string]any) error if r.paramSchema == nil { return nil } - - if err := validateAgainstSchema(r.paramSchema, params); err != nil { + if err := schemavalidate.ValidateAgainstSchema(r.paramSchema, params); err != nil { return &RuleValidationError{ RuleType: r.ruleTypeName, Err: err.Error(), } } - - return nil -} - -func validateAgainstSchema(schema *gojsonschema.Schema, obj map[string]any) error { - documentLoader := gojsonschema.NewGoLoader(obj) - result, err := schema.Validate(documentLoader) - if err != nil { - return fmt.Errorf("cannot validate json schema: %s", err) - } - - if !result.Valid() { - return buildValidationError(result.Errors()) - } - + schemavalidate.ApplyDefaults(r.paramSchema, params) return nil } - -func buildValidationError(errs []gojsonschema.ResultError) error { - problems := make([]string, 0, len(errs)) - for _, desc := range errs { - problems = append(problems, desc.String()) - } - - return fmt.Errorf("invalid json schema: %s", strings.TrimSpace(strings.Join(problems, "\n"))) -} diff --git a/pkg/profiles/rule_validator_test.go b/pkg/profiles/rule_validator_test.go index 6e9dde9782..7112c2efcf 100644 --- a/pkg/profiles/rule_validator_test.go +++ b/pkg/profiles/rule_validator_test.go @@ -6,6 +6,7 @@ package profiles_test import ( "os" "path/filepath" + "strings" "testing" "github.com/stretchr/testify/require" @@ -14,6 +15,77 @@ import ( "github.com/mindersec/minder/pkg/profiles" ) +func TestSetDefaultValuesOnValidation(t *testing.T) { + t.Parallel() + + rtstr := ` +--- +version: v1 +release_phase: alpha +type: rule-type +name: foo +display_name: Foo +short_failure_message: Foo failed +severity: + value: medium +context: + provider: github +description: Very important rule +guidance: | + This is how you should do it. +def: + in_entity: repository + rule_schema: + type: object + properties: + schedule_interval: + type: string + description: | + Sets the schedule interval in cron format for the workflow. Only applicable for remediation. + publish_results: + type: boolean + description: | + Publish the results of the analysis. + default: true + retention_days: + type: integer + description: | + Number of days to retain the SARIF file. + default: 5 + sarif_file: + type: string + description: | + Name of the SARIF file. + default: "results.sarif" + required: + - schedule_interval + - publish_results +` + + rt := &minderv1.RuleType{} + require.NoError(t, minderv1.ParseResource(strings.NewReader(rtstr), rt), "failed to parse rule type") + + rval, err := profiles.NewRuleValidator(rt) + require.NoError(t, err, "failed to create rule validator") + + obj := map[string]any{ + "schedule_interval": "0 0 * * *", + "publish_results": false, + "retention_days": 10, + } + + // Validation should pass + require.NoError(t, rval.ValidateRuleDefAgainstSchema(obj), "failed to validate rule definition") + + // Value is left as is + require.Equal(t, "0 0 * * *", obj["schedule_interval"]) + require.Equal(t, 10, obj["retention_days"]) + require.Equal(t, false, obj["publish_results"]) + + // default is set + require.Equal(t, "results.sarif", obj["sarif_file"]) +} + func TestExampleRulesAreValidatedCorrectly(t *testing.T) { t.Parallel() @@ -33,6 +105,11 @@ func TestExampleRulesAreValidatedCorrectly(t *testing.T) { return nil } + // skip test files + if strings.HasSuffix(path, ".test.yaml") || strings.HasSuffix(path, ".test.yml") || strings.Contains(filepath.Dir(path), ".testdata") { + return nil + } + fname := filepath.Base(path) t.Run(fname, func(t *testing.T) { t.Parallel() diff --git a/pkg/profiles/service.go b/pkg/profiles/service.go index f5dab7c177..a24422d78c 100644 --- a/pkg/profiles/service.go +++ b/pkg/profiles/service.go @@ -479,10 +479,10 @@ func getProfileFromPBForUpdateByName( func validateProfileUpdate( old *db.Profile, - new *minderv1.Profile, + newProfile *minderv1.Profile, projectID uuid.UUID, ) error { - if old.Name != new.Name { + if old.Name != newProfile.Name { return util.UserVisibleError(codes.InvalidArgument, "cannot change profile name") } @@ -490,7 +490,7 @@ func validateProfileUpdate( return util.UserVisibleError(codes.InvalidArgument, "cannot change profile project") } - if err := namespaces.ValidateLabelsUpdate(new.GetLabels(), old.Labels); err != nil { + if err := namespaces.ValidateLabelsUpdate(newProfile.GetLabels(), old.Labels); err != nil { return util.UserVisibleError(codes.InvalidArgument, "labels update failed validation: %v", err) } diff --git a/pkg/profiles/validator_test.go b/pkg/profiles/validator_test.go index e53e80c756..70dd55127d 100644 --- a/pkg/profiles/validator_test.go +++ b/pkg/profiles/validator_test.go @@ -7,7 +7,7 @@ import ( "context" "database/sql" "encoding/json" - "os" + "strings" "testing" "github.com/google/uuid" @@ -151,6 +151,78 @@ func TestValidatorScenarios(t *testing.T) { var ruleTypeName = "branch_protection_allow_force_pushes" var ruleTypeDisplayName = "Allow force pushes to the branch" +var ruleTypeContent = ` +--- +version: v1 +release_phase: beta +type: rule-type +name: branch_protection_allow_force_pushes +display_name: Prevent overwriting git history +short_failure_message: Force pushes are allowed +severity: + value: medium +context: + provider: github +description: Disallow force pushes to the branch +guidance: | + Ensure that the appropriate setting is disabled for the branch + protection rule. + + This setting prevents users with push access to force push to the + branch. + + For more information, see [GitHub's + documentation](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/managing-a-branch-protection-rule). +def: + # Defines the section of the pipeline the rule will appear in. + # This will affect the template used to render multiple parts + # of the rule. + in_entity: repository + # Defines the schema for parameters that will be passed to the rule + param_schema: + properties: + branch: + type: string + description: "The name of the branch to check. If left empty, the default branch will be used." + required: + - branch + # Defines the schema for writing a rule with this rule being checked + rule_schema: + type: object + properties: {} + # Defines the configuration for ingesting data relevant for the rule + ingest: + type: rest + rest: + # This is the path to the data source. Given that this will evaluate + # for each repository in the organization, we use a template that + # will be evaluated for each repository. The structure to use is the + # protobuf structure for the entity that is being evaluated. + endpoint: '{{ $branch_param := index .Params "branch" }}/repos/{{.Entity.Owner}}/{{.Entity.Name}}/branches/{{if ne $branch_param "" }}{{ $branch_param }}{{ else }}{{ .Entity.DefaultBranch }}{{ end }}/protection' + # This is the method to use to retrieve the data. It should already default to JSON + parse: json + fallback: + - http_code: 404 + body: | + {"http_status": 404, "message": "Not Protected"} + # Defines the configuration for evaluating data ingested against the given policy + eval: + type: jq + jq: + - ingested: + def: ".allow_force_pushes.enabled" + constant: false + # Defines the configuration for remediating the rule + remediate: + type: gh_branch_protection + gh_branch_protection: + patch: | + {"allow_force_pushes": false } + # Defines the configuration for alerting on the rule + alert: + type: security_advisory + security_advisory: {} +` var ruleName = "MyRule" var ruleUUID = uuid.New() var projectID = uuid.New() @@ -277,11 +349,7 @@ func makeProfile(opts ...func(*minderv1.Profile)) *minderv1.Profile { func loadRawRuleTypeDef() (json.RawMessage, error) { // read rule type from disk and set it up as a fixture - f, err := os.Open("../../examples/rules-and-profiles/rule-types/github/branch_protection_allow_force_pushes.yaml") - if err != nil { - return nil, err - } - defer f.Close() + f := strings.NewReader(ruleTypeContent) ruleType := &minderv1.RuleType{} if err := minderv1.ParseResource(f, ruleType); err != nil { diff --git a/pkg/providers/v1/mock/providers.go b/pkg/providers/v1/mock/providers.go new file mode 100644 index 0000000000..1501431d3d --- /dev/null +++ b/pkg/providers/v1/mock/providers.go @@ -0,0 +1,2018 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: ./providers.go +// +// Generated by this command: +// +// mockgen -package mock_v1 -destination=./mock/providers.go -source=./providers.go +// + +// Package mock_v1 is a generated GoMock package. +package mock_v1 + +import ( + context "context" + http "net/http" + reflect "reflect" + time "time" + + git "github.com/go-git/go-git/v5" + authn "github.com/google/go-containerregistry/pkg/authn" + v1 "github.com/google/go-containerregistry/pkg/v1" + github "github.com/google/go-github/v63/github" + properties "github.com/mindersec/minder/internal/entities/properties" + v10 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + v11 "github.com/mindersec/minder/pkg/providers/v1" + gomock "go.uber.org/mock/gomock" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" +) + +// MockProvider is a mock of Provider interface. +type MockProvider struct { + ctrl *gomock.Controller + recorder *MockProviderMockRecorder + isgomock struct{} +} + +// MockProviderMockRecorder is the mock recorder for MockProvider. +type MockProviderMockRecorder struct { + mock *MockProvider +} + +// NewMockProvider creates a new mock instance. +func NewMockProvider(ctrl *gomock.Controller) *MockProvider { + mock := &MockProvider{ctrl: ctrl} + mock.recorder = &MockProviderMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockProvider) EXPECT() *MockProviderMockRecorder { + return m.recorder +} + +// CanImplement mocks base method. +func (m *MockProvider) CanImplement(trait v10.ProviderType) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CanImplement", trait) + ret0, _ := ret[0].(bool) + return ret0 +} + +// CanImplement indicates an expected call of CanImplement. +func (mr *MockProviderMockRecorder) CanImplement(trait any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CanImplement", reflect.TypeOf((*MockProvider)(nil).CanImplement), trait) +} + +// DeregisterEntity mocks base method. +func (m *MockProvider) DeregisterEntity(ctx context.Context, entType v10.Entity, props *properties.Properties) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeregisterEntity", ctx, entType, props) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeregisterEntity indicates an expected call of DeregisterEntity. +func (mr *MockProviderMockRecorder) DeregisterEntity(ctx, entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeregisterEntity", reflect.TypeOf((*MockProvider)(nil).DeregisterEntity), ctx, entType, props) +} + +// FetchAllProperties mocks base method. +func (m *MockProvider) FetchAllProperties(ctx context.Context, getByProps *properties.Properties, entType v10.Entity, cachedProps *properties.Properties) (*properties.Properties, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchAllProperties", ctx, getByProps, entType, cachedProps) + ret0, _ := ret[0].(*properties.Properties) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchAllProperties indicates an expected call of FetchAllProperties. +func (mr *MockProviderMockRecorder) FetchAllProperties(ctx, getByProps, entType, cachedProps any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchAllProperties", reflect.TypeOf((*MockProvider)(nil).FetchAllProperties), ctx, getByProps, entType, cachedProps) +} + +// FetchProperty mocks base method. +func (m *MockProvider) FetchProperty(ctx context.Context, getByProps *properties.Properties, entType v10.Entity, key string) (*properties.Property, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchProperty", ctx, getByProps, entType, key) + ret0, _ := ret[0].(*properties.Property) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchProperty indicates an expected call of FetchProperty. +func (mr *MockProviderMockRecorder) FetchProperty(ctx, getByProps, entType, key any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchProperty", reflect.TypeOf((*MockProvider)(nil).FetchProperty), ctx, getByProps, entType, key) +} + +// GetEntityName mocks base method. +func (m *MockProvider) GetEntityName(entType v10.Entity, props *properties.Properties) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetEntityName", entType, props) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetEntityName indicates an expected call of GetEntityName. +func (mr *MockProviderMockRecorder) GetEntityName(entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetEntityName", reflect.TypeOf((*MockProvider)(nil).GetEntityName), entType, props) +} + +// PropertiesToProtoMessage mocks base method. +func (m *MockProvider) PropertiesToProtoMessage(entType v10.Entity, props *properties.Properties) (protoreflect.ProtoMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PropertiesToProtoMessage", entType, props) + ret0, _ := ret[0].(protoreflect.ProtoMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PropertiesToProtoMessage indicates an expected call of PropertiesToProtoMessage. +func (mr *MockProviderMockRecorder) PropertiesToProtoMessage(entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PropertiesToProtoMessage", reflect.TypeOf((*MockProvider)(nil).PropertiesToProtoMessage), entType, props) +} + +// RegisterEntity mocks base method. +func (m *MockProvider) RegisterEntity(ctx context.Context, entType v10.Entity, props *properties.Properties) (*properties.Properties, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RegisterEntity", ctx, entType, props) + ret0, _ := ret[0].(*properties.Properties) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RegisterEntity indicates an expected call of RegisterEntity. +func (mr *MockProviderMockRecorder) RegisterEntity(ctx, entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RegisterEntity", reflect.TypeOf((*MockProvider)(nil).RegisterEntity), ctx, entType, props) +} + +// ReregisterEntity mocks base method. +func (m *MockProvider) ReregisterEntity(ctx context.Context, entType v10.Entity, props *properties.Properties) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReregisterEntity", ctx, entType, props) + ret0, _ := ret[0].(error) + return ret0 +} + +// ReregisterEntity indicates an expected call of ReregisterEntity. +func (mr *MockProviderMockRecorder) ReregisterEntity(ctx, entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReregisterEntity", reflect.TypeOf((*MockProvider)(nil).ReregisterEntity), ctx, entType, props) +} + +// SupportsEntity mocks base method. +func (m *MockProvider) SupportsEntity(entType v10.Entity) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SupportsEntity", entType) + ret0, _ := ret[0].(bool) + return ret0 +} + +// SupportsEntity indicates an expected call of SupportsEntity. +func (mr *MockProviderMockRecorder) SupportsEntity(entType any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SupportsEntity", reflect.TypeOf((*MockProvider)(nil).SupportsEntity), entType) +} + +// MockGit is a mock of Git interface. +type MockGit struct { + ctrl *gomock.Controller + recorder *MockGitMockRecorder + isgomock struct{} +} + +// MockGitMockRecorder is the mock recorder for MockGit. +type MockGitMockRecorder struct { + mock *MockGit +} + +// NewMockGit creates a new mock instance. +func NewMockGit(ctrl *gomock.Controller) *MockGit { + mock := &MockGit{ctrl: ctrl} + mock.recorder = &MockGitMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockGit) EXPECT() *MockGitMockRecorder { + return m.recorder +} + +// CanImplement mocks base method. +func (m *MockGit) CanImplement(trait v10.ProviderType) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CanImplement", trait) + ret0, _ := ret[0].(bool) + return ret0 +} + +// CanImplement indicates an expected call of CanImplement. +func (mr *MockGitMockRecorder) CanImplement(trait any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CanImplement", reflect.TypeOf((*MockGit)(nil).CanImplement), trait) +} + +// Clone mocks base method. +func (m *MockGit) Clone(ctx context.Context, url, branch string) (*git.Repository, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Clone", ctx, url, branch) + ret0, _ := ret[0].(*git.Repository) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Clone indicates an expected call of Clone. +func (mr *MockGitMockRecorder) Clone(ctx, url, branch any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clone", reflect.TypeOf((*MockGit)(nil).Clone), ctx, url, branch) +} + +// DeregisterEntity mocks base method. +func (m *MockGit) DeregisterEntity(ctx context.Context, entType v10.Entity, props *properties.Properties) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeregisterEntity", ctx, entType, props) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeregisterEntity indicates an expected call of DeregisterEntity. +func (mr *MockGitMockRecorder) DeregisterEntity(ctx, entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeregisterEntity", reflect.TypeOf((*MockGit)(nil).DeregisterEntity), ctx, entType, props) +} + +// FetchAllProperties mocks base method. +func (m *MockGit) FetchAllProperties(ctx context.Context, getByProps *properties.Properties, entType v10.Entity, cachedProps *properties.Properties) (*properties.Properties, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchAllProperties", ctx, getByProps, entType, cachedProps) + ret0, _ := ret[0].(*properties.Properties) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchAllProperties indicates an expected call of FetchAllProperties. +func (mr *MockGitMockRecorder) FetchAllProperties(ctx, getByProps, entType, cachedProps any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchAllProperties", reflect.TypeOf((*MockGit)(nil).FetchAllProperties), ctx, getByProps, entType, cachedProps) +} + +// FetchProperty mocks base method. +func (m *MockGit) FetchProperty(ctx context.Context, getByProps *properties.Properties, entType v10.Entity, key string) (*properties.Property, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchProperty", ctx, getByProps, entType, key) + ret0, _ := ret[0].(*properties.Property) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchProperty indicates an expected call of FetchProperty. +func (mr *MockGitMockRecorder) FetchProperty(ctx, getByProps, entType, key any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchProperty", reflect.TypeOf((*MockGit)(nil).FetchProperty), ctx, getByProps, entType, key) +} + +// GetEntityName mocks base method. +func (m *MockGit) GetEntityName(entType v10.Entity, props *properties.Properties) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetEntityName", entType, props) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetEntityName indicates an expected call of GetEntityName. +func (mr *MockGitMockRecorder) GetEntityName(entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetEntityName", reflect.TypeOf((*MockGit)(nil).GetEntityName), entType, props) +} + +// PropertiesToProtoMessage mocks base method. +func (m *MockGit) PropertiesToProtoMessage(entType v10.Entity, props *properties.Properties) (protoreflect.ProtoMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PropertiesToProtoMessage", entType, props) + ret0, _ := ret[0].(protoreflect.ProtoMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PropertiesToProtoMessage indicates an expected call of PropertiesToProtoMessage. +func (mr *MockGitMockRecorder) PropertiesToProtoMessage(entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PropertiesToProtoMessage", reflect.TypeOf((*MockGit)(nil).PropertiesToProtoMessage), entType, props) +} + +// RegisterEntity mocks base method. +func (m *MockGit) RegisterEntity(ctx context.Context, entType v10.Entity, props *properties.Properties) (*properties.Properties, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RegisterEntity", ctx, entType, props) + ret0, _ := ret[0].(*properties.Properties) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RegisterEntity indicates an expected call of RegisterEntity. +func (mr *MockGitMockRecorder) RegisterEntity(ctx, entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RegisterEntity", reflect.TypeOf((*MockGit)(nil).RegisterEntity), ctx, entType, props) +} + +// ReregisterEntity mocks base method. +func (m *MockGit) ReregisterEntity(ctx context.Context, entType v10.Entity, props *properties.Properties) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReregisterEntity", ctx, entType, props) + ret0, _ := ret[0].(error) + return ret0 +} + +// ReregisterEntity indicates an expected call of ReregisterEntity. +func (mr *MockGitMockRecorder) ReregisterEntity(ctx, entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReregisterEntity", reflect.TypeOf((*MockGit)(nil).ReregisterEntity), ctx, entType, props) +} + +// SupportsEntity mocks base method. +func (m *MockGit) SupportsEntity(entType v10.Entity) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SupportsEntity", entType) + ret0, _ := ret[0].(bool) + return ret0 +} + +// SupportsEntity indicates an expected call of SupportsEntity. +func (mr *MockGitMockRecorder) SupportsEntity(entType any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SupportsEntity", reflect.TypeOf((*MockGit)(nil).SupportsEntity), entType) +} + +// MockREST is a mock of REST interface. +type MockREST struct { + ctrl *gomock.Controller + recorder *MockRESTMockRecorder + isgomock struct{} +} + +// MockRESTMockRecorder is the mock recorder for MockREST. +type MockRESTMockRecorder struct { + mock *MockREST +} + +// NewMockREST creates a new mock instance. +func NewMockREST(ctrl *gomock.Controller) *MockREST { + mock := &MockREST{ctrl: ctrl} + mock.recorder = &MockRESTMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockREST) EXPECT() *MockRESTMockRecorder { + return m.recorder +} + +// CanImplement mocks base method. +func (m *MockREST) CanImplement(trait v10.ProviderType) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CanImplement", trait) + ret0, _ := ret[0].(bool) + return ret0 +} + +// CanImplement indicates an expected call of CanImplement. +func (mr *MockRESTMockRecorder) CanImplement(trait any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CanImplement", reflect.TypeOf((*MockREST)(nil).CanImplement), trait) +} + +// DeregisterEntity mocks base method. +func (m *MockREST) DeregisterEntity(ctx context.Context, entType v10.Entity, props *properties.Properties) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeregisterEntity", ctx, entType, props) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeregisterEntity indicates an expected call of DeregisterEntity. +func (mr *MockRESTMockRecorder) DeregisterEntity(ctx, entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeregisterEntity", reflect.TypeOf((*MockREST)(nil).DeregisterEntity), ctx, entType, props) +} + +// Do mocks base method. +func (m *MockREST) Do(ctx context.Context, req *http.Request) (*http.Response, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Do", ctx, req) + ret0, _ := ret[0].(*http.Response) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Do indicates an expected call of Do. +func (mr *MockRESTMockRecorder) Do(ctx, req any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Do", reflect.TypeOf((*MockREST)(nil).Do), ctx, req) +} + +// FetchAllProperties mocks base method. +func (m *MockREST) FetchAllProperties(ctx context.Context, getByProps *properties.Properties, entType v10.Entity, cachedProps *properties.Properties) (*properties.Properties, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchAllProperties", ctx, getByProps, entType, cachedProps) + ret0, _ := ret[0].(*properties.Properties) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchAllProperties indicates an expected call of FetchAllProperties. +func (mr *MockRESTMockRecorder) FetchAllProperties(ctx, getByProps, entType, cachedProps any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchAllProperties", reflect.TypeOf((*MockREST)(nil).FetchAllProperties), ctx, getByProps, entType, cachedProps) +} + +// FetchProperty mocks base method. +func (m *MockREST) FetchProperty(ctx context.Context, getByProps *properties.Properties, entType v10.Entity, key string) (*properties.Property, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchProperty", ctx, getByProps, entType, key) + ret0, _ := ret[0].(*properties.Property) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchProperty indicates an expected call of FetchProperty. +func (mr *MockRESTMockRecorder) FetchProperty(ctx, getByProps, entType, key any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchProperty", reflect.TypeOf((*MockREST)(nil).FetchProperty), ctx, getByProps, entType, key) +} + +// GetBaseURL mocks base method. +func (m *MockREST) GetBaseURL() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetBaseURL") + ret0, _ := ret[0].(string) + return ret0 +} + +// GetBaseURL indicates an expected call of GetBaseURL. +func (mr *MockRESTMockRecorder) GetBaseURL() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBaseURL", reflect.TypeOf((*MockREST)(nil).GetBaseURL)) +} + +// GetEntityName mocks base method. +func (m *MockREST) GetEntityName(entType v10.Entity, props *properties.Properties) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetEntityName", entType, props) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetEntityName indicates an expected call of GetEntityName. +func (mr *MockRESTMockRecorder) GetEntityName(entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetEntityName", reflect.TypeOf((*MockREST)(nil).GetEntityName), entType, props) +} + +// NewRequest mocks base method. +func (m *MockREST) NewRequest(method, url string, body any) (*http.Request, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NewRequest", method, url, body) + ret0, _ := ret[0].(*http.Request) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NewRequest indicates an expected call of NewRequest. +func (mr *MockRESTMockRecorder) NewRequest(method, url, body any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewRequest", reflect.TypeOf((*MockREST)(nil).NewRequest), method, url, body) +} + +// PropertiesToProtoMessage mocks base method. +func (m *MockREST) PropertiesToProtoMessage(entType v10.Entity, props *properties.Properties) (protoreflect.ProtoMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PropertiesToProtoMessage", entType, props) + ret0, _ := ret[0].(protoreflect.ProtoMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PropertiesToProtoMessage indicates an expected call of PropertiesToProtoMessage. +func (mr *MockRESTMockRecorder) PropertiesToProtoMessage(entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PropertiesToProtoMessage", reflect.TypeOf((*MockREST)(nil).PropertiesToProtoMessage), entType, props) +} + +// RegisterEntity mocks base method. +func (m *MockREST) RegisterEntity(ctx context.Context, entType v10.Entity, props *properties.Properties) (*properties.Properties, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RegisterEntity", ctx, entType, props) + ret0, _ := ret[0].(*properties.Properties) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RegisterEntity indicates an expected call of RegisterEntity. +func (mr *MockRESTMockRecorder) RegisterEntity(ctx, entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RegisterEntity", reflect.TypeOf((*MockREST)(nil).RegisterEntity), ctx, entType, props) +} + +// ReregisterEntity mocks base method. +func (m *MockREST) ReregisterEntity(ctx context.Context, entType v10.Entity, props *properties.Properties) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReregisterEntity", ctx, entType, props) + ret0, _ := ret[0].(error) + return ret0 +} + +// ReregisterEntity indicates an expected call of ReregisterEntity. +func (mr *MockRESTMockRecorder) ReregisterEntity(ctx, entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReregisterEntity", reflect.TypeOf((*MockREST)(nil).ReregisterEntity), ctx, entType, props) +} + +// SupportsEntity mocks base method. +func (m *MockREST) SupportsEntity(entType v10.Entity) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SupportsEntity", entType) + ret0, _ := ret[0].(bool) + return ret0 +} + +// SupportsEntity indicates an expected call of SupportsEntity. +func (mr *MockRESTMockRecorder) SupportsEntity(entType any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SupportsEntity", reflect.TypeOf((*MockREST)(nil).SupportsEntity), entType) +} + +// MockRepoLister is a mock of RepoLister interface. +type MockRepoLister struct { + ctrl *gomock.Controller + recorder *MockRepoListerMockRecorder + isgomock struct{} +} + +// MockRepoListerMockRecorder is the mock recorder for MockRepoLister. +type MockRepoListerMockRecorder struct { + mock *MockRepoLister +} + +// NewMockRepoLister creates a new mock instance. +func NewMockRepoLister(ctrl *gomock.Controller) *MockRepoLister { + mock := &MockRepoLister{ctrl: ctrl} + mock.recorder = &MockRepoListerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockRepoLister) EXPECT() *MockRepoListerMockRecorder { + return m.recorder +} + +// CanImplement mocks base method. +func (m *MockRepoLister) CanImplement(trait v10.ProviderType) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CanImplement", trait) + ret0, _ := ret[0].(bool) + return ret0 +} + +// CanImplement indicates an expected call of CanImplement. +func (mr *MockRepoListerMockRecorder) CanImplement(trait any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CanImplement", reflect.TypeOf((*MockRepoLister)(nil).CanImplement), trait) +} + +// DeregisterEntity mocks base method. +func (m *MockRepoLister) DeregisterEntity(ctx context.Context, entType v10.Entity, props *properties.Properties) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeregisterEntity", ctx, entType, props) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeregisterEntity indicates an expected call of DeregisterEntity. +func (mr *MockRepoListerMockRecorder) DeregisterEntity(ctx, entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeregisterEntity", reflect.TypeOf((*MockRepoLister)(nil).DeregisterEntity), ctx, entType, props) +} + +// FetchAllProperties mocks base method. +func (m *MockRepoLister) FetchAllProperties(ctx context.Context, getByProps *properties.Properties, entType v10.Entity, cachedProps *properties.Properties) (*properties.Properties, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchAllProperties", ctx, getByProps, entType, cachedProps) + ret0, _ := ret[0].(*properties.Properties) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchAllProperties indicates an expected call of FetchAllProperties. +func (mr *MockRepoListerMockRecorder) FetchAllProperties(ctx, getByProps, entType, cachedProps any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchAllProperties", reflect.TypeOf((*MockRepoLister)(nil).FetchAllProperties), ctx, getByProps, entType, cachedProps) +} + +// FetchProperty mocks base method. +func (m *MockRepoLister) FetchProperty(ctx context.Context, getByProps *properties.Properties, entType v10.Entity, key string) (*properties.Property, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchProperty", ctx, getByProps, entType, key) + ret0, _ := ret[0].(*properties.Property) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchProperty indicates an expected call of FetchProperty. +func (mr *MockRepoListerMockRecorder) FetchProperty(ctx, getByProps, entType, key any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchProperty", reflect.TypeOf((*MockRepoLister)(nil).FetchProperty), ctx, getByProps, entType, key) +} + +// GetEntityName mocks base method. +func (m *MockRepoLister) GetEntityName(entType v10.Entity, props *properties.Properties) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetEntityName", entType, props) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetEntityName indicates an expected call of GetEntityName. +func (mr *MockRepoListerMockRecorder) GetEntityName(entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetEntityName", reflect.TypeOf((*MockRepoLister)(nil).GetEntityName), entType, props) +} + +// ListAllRepositories mocks base method. +func (m *MockRepoLister) ListAllRepositories(arg0 context.Context) ([]*v10.Repository, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListAllRepositories", arg0) + ret0, _ := ret[0].([]*v10.Repository) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListAllRepositories indicates an expected call of ListAllRepositories. +func (mr *MockRepoListerMockRecorder) ListAllRepositories(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAllRepositories", reflect.TypeOf((*MockRepoLister)(nil).ListAllRepositories), arg0) +} + +// PropertiesToProtoMessage mocks base method. +func (m *MockRepoLister) PropertiesToProtoMessage(entType v10.Entity, props *properties.Properties) (protoreflect.ProtoMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PropertiesToProtoMessage", entType, props) + ret0, _ := ret[0].(protoreflect.ProtoMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PropertiesToProtoMessage indicates an expected call of PropertiesToProtoMessage. +func (mr *MockRepoListerMockRecorder) PropertiesToProtoMessage(entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PropertiesToProtoMessage", reflect.TypeOf((*MockRepoLister)(nil).PropertiesToProtoMessage), entType, props) +} + +// RegisterEntity mocks base method. +func (m *MockRepoLister) RegisterEntity(ctx context.Context, entType v10.Entity, props *properties.Properties) (*properties.Properties, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RegisterEntity", ctx, entType, props) + ret0, _ := ret[0].(*properties.Properties) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RegisterEntity indicates an expected call of RegisterEntity. +func (mr *MockRepoListerMockRecorder) RegisterEntity(ctx, entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RegisterEntity", reflect.TypeOf((*MockRepoLister)(nil).RegisterEntity), ctx, entType, props) +} + +// ReregisterEntity mocks base method. +func (m *MockRepoLister) ReregisterEntity(ctx context.Context, entType v10.Entity, props *properties.Properties) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReregisterEntity", ctx, entType, props) + ret0, _ := ret[0].(error) + return ret0 +} + +// ReregisterEntity indicates an expected call of ReregisterEntity. +func (mr *MockRepoListerMockRecorder) ReregisterEntity(ctx, entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReregisterEntity", reflect.TypeOf((*MockRepoLister)(nil).ReregisterEntity), ctx, entType, props) +} + +// SupportsEntity mocks base method. +func (m *MockRepoLister) SupportsEntity(entType v10.Entity) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SupportsEntity", entType) + ret0, _ := ret[0].(bool) + return ret0 +} + +// SupportsEntity indicates an expected call of SupportsEntity. +func (mr *MockRepoListerMockRecorder) SupportsEntity(entType any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SupportsEntity", reflect.TypeOf((*MockRepoLister)(nil).SupportsEntity), entType) +} + +// MockGetArtifactVersionsFilter is a mock of GetArtifactVersionsFilter interface. +type MockGetArtifactVersionsFilter struct { + ctrl *gomock.Controller + recorder *MockGetArtifactVersionsFilterMockRecorder + isgomock struct{} +} + +// MockGetArtifactVersionsFilterMockRecorder is the mock recorder for MockGetArtifactVersionsFilter. +type MockGetArtifactVersionsFilterMockRecorder struct { + mock *MockGetArtifactVersionsFilter +} + +// NewMockGetArtifactVersionsFilter creates a new mock instance. +func NewMockGetArtifactVersionsFilter(ctrl *gomock.Controller) *MockGetArtifactVersionsFilter { + mock := &MockGetArtifactVersionsFilter{ctrl: ctrl} + mock.recorder = &MockGetArtifactVersionsFilterMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockGetArtifactVersionsFilter) EXPECT() *MockGetArtifactVersionsFilterMockRecorder { + return m.recorder +} + +// IsSkippable mocks base method. +func (m *MockGetArtifactVersionsFilter) IsSkippable(createdAt time.Time, tags []string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsSkippable", createdAt, tags) + ret0, _ := ret[0].(error) + return ret0 +} + +// IsSkippable indicates an expected call of IsSkippable. +func (mr *MockGetArtifactVersionsFilterMockRecorder) IsSkippable(createdAt, tags any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsSkippable", reflect.TypeOf((*MockGetArtifactVersionsFilter)(nil).IsSkippable), createdAt, tags) +} + +// MockArtifactProvider is a mock of ArtifactProvider interface. +type MockArtifactProvider struct { + ctrl *gomock.Controller + recorder *MockArtifactProviderMockRecorder + isgomock struct{} +} + +// MockArtifactProviderMockRecorder is the mock recorder for MockArtifactProvider. +type MockArtifactProviderMockRecorder struct { + mock *MockArtifactProvider +} + +// NewMockArtifactProvider creates a new mock instance. +func NewMockArtifactProvider(ctrl *gomock.Controller) *MockArtifactProvider { + mock := &MockArtifactProvider{ctrl: ctrl} + mock.recorder = &MockArtifactProviderMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockArtifactProvider) EXPECT() *MockArtifactProviderMockRecorder { + return m.recorder +} + +// GetArtifactVersions mocks base method. +func (m *MockArtifactProvider) GetArtifactVersions(ctx context.Context, artifact *v10.Artifact, filter v11.GetArtifactVersionsFilter) ([]*v10.ArtifactVersion, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetArtifactVersions", ctx, artifact, filter) + ret0, _ := ret[0].([]*v10.ArtifactVersion) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetArtifactVersions indicates an expected call of GetArtifactVersions. +func (mr *MockArtifactProviderMockRecorder) GetArtifactVersions(ctx, artifact, filter any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetArtifactVersions", reflect.TypeOf((*MockArtifactProvider)(nil).GetArtifactVersions), ctx, artifact, filter) +} + +// MockGitHub is a mock of GitHub interface. +type MockGitHub struct { + ctrl *gomock.Controller + recorder *MockGitHubMockRecorder + isgomock struct{} +} + +// MockGitHubMockRecorder is the mock recorder for MockGitHub. +type MockGitHubMockRecorder struct { + mock *MockGitHub +} + +// NewMockGitHub creates a new mock instance. +func NewMockGitHub(ctrl *gomock.Controller) *MockGitHub { + mock := &MockGitHub{ctrl: ctrl} + mock.recorder = &MockGitHubMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockGitHub) EXPECT() *MockGitHubMockRecorder { + return m.recorder +} + +// AddAuthToPushOptions mocks base method. +func (m *MockGitHub) AddAuthToPushOptions(ctx context.Context, options *git.PushOptions) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddAuthToPushOptions", ctx, options) + ret0, _ := ret[0].(error) + return ret0 +} + +// AddAuthToPushOptions indicates an expected call of AddAuthToPushOptions. +func (mr *MockGitHubMockRecorder) AddAuthToPushOptions(ctx, options any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddAuthToPushOptions", reflect.TypeOf((*MockGitHub)(nil).AddAuthToPushOptions), ctx, options) +} + +// CanImplement mocks base method. +func (m *MockGitHub) CanImplement(trait v10.ProviderType) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CanImplement", trait) + ret0, _ := ret[0].(bool) + return ret0 +} + +// CanImplement indicates an expected call of CanImplement. +func (mr *MockGitHubMockRecorder) CanImplement(trait any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CanImplement", reflect.TypeOf((*MockGitHub)(nil).CanImplement), trait) +} + +// Clone mocks base method. +func (m *MockGitHub) Clone(ctx context.Context, url, branch string) (*git.Repository, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Clone", ctx, url, branch) + ret0, _ := ret[0].(*git.Repository) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Clone indicates an expected call of Clone. +func (mr *MockGitHubMockRecorder) Clone(ctx, url, branch any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clone", reflect.TypeOf((*MockGitHub)(nil).Clone), ctx, url, branch) +} + +// ClosePullRequest mocks base method. +func (m *MockGitHub) ClosePullRequest(ctx context.Context, owner, repo string, number int) (*github.PullRequest, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClosePullRequest", ctx, owner, repo, number) + ret0, _ := ret[0].(*github.PullRequest) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ClosePullRequest indicates an expected call of ClosePullRequest. +func (mr *MockGitHubMockRecorder) ClosePullRequest(ctx, owner, repo, number any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClosePullRequest", reflect.TypeOf((*MockGitHub)(nil).ClosePullRequest), ctx, owner, repo, number) +} + +// CloseSecurityAdvisory mocks base method. +func (m *MockGitHub) CloseSecurityAdvisory(ctx context.Context, owner, repo, id string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CloseSecurityAdvisory", ctx, owner, repo, id) + ret0, _ := ret[0].(error) + return ret0 +} + +// CloseSecurityAdvisory indicates an expected call of CloseSecurityAdvisory. +func (mr *MockGitHubMockRecorder) CloseSecurityAdvisory(ctx, owner, repo, id any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CloseSecurityAdvisory", reflect.TypeOf((*MockGitHub)(nil).CloseSecurityAdvisory), ctx, owner, repo, id) +} + +// CreateHook mocks base method. +func (m *MockGitHub) CreateHook(ctx context.Context, owner, repo string, hook *github.Hook) (*github.Hook, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateHook", ctx, owner, repo, hook) + ret0, _ := ret[0].(*github.Hook) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateHook indicates an expected call of CreateHook. +func (mr *MockGitHubMockRecorder) CreateHook(ctx, owner, repo, hook any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateHook", reflect.TypeOf((*MockGitHub)(nil).CreateHook), ctx, owner, repo, hook) +} + +// CreateIssueComment mocks base method. +func (m *MockGitHub) CreateIssueComment(ctx context.Context, owner, repo string, number int, comment string) (*github.IssueComment, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateIssueComment", ctx, owner, repo, number, comment) + ret0, _ := ret[0].(*github.IssueComment) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateIssueComment indicates an expected call of CreateIssueComment. +func (mr *MockGitHubMockRecorder) CreateIssueComment(ctx, owner, repo, number, comment any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateIssueComment", reflect.TypeOf((*MockGitHub)(nil).CreateIssueComment), ctx, owner, repo, number, comment) +} + +// CreatePullRequest mocks base method. +func (m *MockGitHub) CreatePullRequest(ctx context.Context, owner, repo, title, body, head, base string) (*github.PullRequest, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreatePullRequest", ctx, owner, repo, title, body, head, base) + ret0, _ := ret[0].(*github.PullRequest) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreatePullRequest indicates an expected call of CreatePullRequest. +func (mr *MockGitHubMockRecorder) CreatePullRequest(ctx, owner, repo, title, body, head, base any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreatePullRequest", reflect.TypeOf((*MockGitHub)(nil).CreatePullRequest), ctx, owner, repo, title, body, head, base) +} + +// CreateReview mocks base method. +func (m *MockGitHub) CreateReview(arg0 context.Context, arg1, arg2 string, arg3 int, arg4 *github.PullRequestReviewRequest) (*github.PullRequestReview, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateReview", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(*github.PullRequestReview) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateReview indicates an expected call of CreateReview. +func (mr *MockGitHubMockRecorder) CreateReview(arg0, arg1, arg2, arg3, arg4 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateReview", reflect.TypeOf((*MockGitHub)(nil).CreateReview), arg0, arg1, arg2, arg3, arg4) +} + +// CreateSecurityAdvisory mocks base method. +func (m *MockGitHub) CreateSecurityAdvisory(ctx context.Context, owner, repo, severity, summary, description string, v []*github.AdvisoryVulnerability) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateSecurityAdvisory", ctx, owner, repo, severity, summary, description, v) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateSecurityAdvisory indicates an expected call of CreateSecurityAdvisory. +func (mr *MockGitHubMockRecorder) CreateSecurityAdvisory(ctx, owner, repo, severity, summary, description, v any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateSecurityAdvisory", reflect.TypeOf((*MockGitHub)(nil).CreateSecurityAdvisory), ctx, owner, repo, severity, summary, description, v) +} + +// DeleteHook mocks base method. +func (m *MockGitHub) DeleteHook(ctx context.Context, owner, repo string, id int64) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteHook", ctx, owner, repo, id) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeleteHook indicates an expected call of DeleteHook. +func (mr *MockGitHubMockRecorder) DeleteHook(ctx, owner, repo, id any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteHook", reflect.TypeOf((*MockGitHub)(nil).DeleteHook), ctx, owner, repo, id) +} + +// DeregisterEntity mocks base method. +func (m *MockGitHub) DeregisterEntity(ctx context.Context, entType v10.Entity, props *properties.Properties) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeregisterEntity", ctx, entType, props) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeregisterEntity indicates an expected call of DeregisterEntity. +func (mr *MockGitHubMockRecorder) DeregisterEntity(ctx, entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeregisterEntity", reflect.TypeOf((*MockGitHub)(nil).DeregisterEntity), ctx, entType, props) +} + +// DismissReview mocks base method. +func (m *MockGitHub) DismissReview(arg0 context.Context, arg1, arg2 string, arg3 int, arg4 int64, arg5 *github.PullRequestReviewDismissalRequest) (*github.PullRequestReview, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DismissReview", arg0, arg1, arg2, arg3, arg4, arg5) + ret0, _ := ret[0].(*github.PullRequestReview) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DismissReview indicates an expected call of DismissReview. +func (mr *MockGitHubMockRecorder) DismissReview(arg0, arg1, arg2, arg3, arg4, arg5 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DismissReview", reflect.TypeOf((*MockGitHub)(nil).DismissReview), arg0, arg1, arg2, arg3, arg4, arg5) +} + +// Do mocks base method. +func (m *MockGitHub) Do(ctx context.Context, req *http.Request) (*http.Response, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Do", ctx, req) + ret0, _ := ret[0].(*http.Response) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Do indicates an expected call of Do. +func (mr *MockGitHubMockRecorder) Do(ctx, req any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Do", reflect.TypeOf((*MockGitHub)(nil).Do), ctx, req) +} + +// EditHook mocks base method. +func (m *MockGitHub) EditHook(ctx context.Context, owner, repo string, id int64, hook *github.Hook) (*github.Hook, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "EditHook", ctx, owner, repo, id, hook) + ret0, _ := ret[0].(*github.Hook) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// EditHook indicates an expected call of EditHook. +func (mr *MockGitHubMockRecorder) EditHook(ctx, owner, repo, id, hook any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EditHook", reflect.TypeOf((*MockGitHub)(nil).EditHook), ctx, owner, repo, id, hook) +} + +// FetchAllProperties mocks base method. +func (m *MockGitHub) FetchAllProperties(ctx context.Context, getByProps *properties.Properties, entType v10.Entity, cachedProps *properties.Properties) (*properties.Properties, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchAllProperties", ctx, getByProps, entType, cachedProps) + ret0, _ := ret[0].(*properties.Properties) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchAllProperties indicates an expected call of FetchAllProperties. +func (mr *MockGitHubMockRecorder) FetchAllProperties(ctx, getByProps, entType, cachedProps any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchAllProperties", reflect.TypeOf((*MockGitHub)(nil).FetchAllProperties), ctx, getByProps, entType, cachedProps) +} + +// FetchProperty mocks base method. +func (m *MockGitHub) FetchProperty(ctx context.Context, getByProps *properties.Properties, entType v10.Entity, key string) (*properties.Property, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchProperty", ctx, getByProps, entType, key) + ret0, _ := ret[0].(*properties.Property) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchProperty indicates an expected call of FetchProperty. +func (mr *MockGitHubMockRecorder) FetchProperty(ctx, getByProps, entType, key any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchProperty", reflect.TypeOf((*MockGitHub)(nil).FetchProperty), ctx, getByProps, entType, key) +} + +// GetArtifactVersions mocks base method. +func (m *MockGitHub) GetArtifactVersions(ctx context.Context, artifact *v10.Artifact, filter v11.GetArtifactVersionsFilter) ([]*v10.ArtifactVersion, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetArtifactVersions", ctx, artifact, filter) + ret0, _ := ret[0].([]*v10.ArtifactVersion) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetArtifactVersions indicates an expected call of GetArtifactVersions. +func (mr *MockGitHubMockRecorder) GetArtifactVersions(ctx, artifact, filter any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetArtifactVersions", reflect.TypeOf((*MockGitHub)(nil).GetArtifactVersions), ctx, artifact, filter) +} + +// GetBaseURL mocks base method. +func (m *MockGitHub) GetBaseURL() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetBaseURL") + ret0, _ := ret[0].(string) + return ret0 +} + +// GetBaseURL indicates an expected call of GetBaseURL. +func (mr *MockGitHubMockRecorder) GetBaseURL() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBaseURL", reflect.TypeOf((*MockGitHub)(nil).GetBaseURL)) +} + +// GetBranchProtection mocks base method. +func (m *MockGitHub) GetBranchProtection(arg0 context.Context, arg1, arg2, arg3 string) (*github.Protection, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetBranchProtection", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*github.Protection) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetBranchProtection indicates an expected call of GetBranchProtection. +func (mr *MockGitHubMockRecorder) GetBranchProtection(arg0, arg1, arg2, arg3 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBranchProtection", reflect.TypeOf((*MockGitHub)(nil).GetBranchProtection), arg0, arg1, arg2, arg3) +} + +// GetCredential mocks base method. +func (m *MockGitHub) GetCredential() v11.GitHubCredential { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetCredential") + ret0, _ := ret[0].(v11.GitHubCredential) + return ret0 +} + +// GetCredential indicates an expected call of GetCredential. +func (mr *MockGitHubMockRecorder) GetCredential() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCredential", reflect.TypeOf((*MockGitHub)(nil).GetCredential)) +} + +// GetEntityName mocks base method. +func (m *MockGitHub) GetEntityName(entType v10.Entity, props *properties.Properties) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetEntityName", entType, props) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetEntityName indicates an expected call of GetEntityName. +func (mr *MockGitHubMockRecorder) GetEntityName(entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetEntityName", reflect.TypeOf((*MockGitHub)(nil).GetEntityName), entType, props) +} + +// GetLogin mocks base method. +func (m *MockGitHub) GetLogin(ctx context.Context) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetLogin", ctx) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetLogin indicates an expected call of GetLogin. +func (mr *MockGitHubMockRecorder) GetLogin(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetLogin", reflect.TypeOf((*MockGitHub)(nil).GetLogin), ctx) +} + +// GetName mocks base method. +func (m *MockGitHub) GetName(ctx context.Context) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetName", ctx) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetName indicates an expected call of GetName. +func (mr *MockGitHubMockRecorder) GetName(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetName", reflect.TypeOf((*MockGitHub)(nil).GetName), ctx) +} + +// GetNamespaceURL mocks base method. +func (m *MockGitHub) GetNamespaceURL() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetNamespaceURL") + ret0, _ := ret[0].(string) + return ret0 +} + +// GetNamespaceURL indicates an expected call of GetNamespaceURL. +func (mr *MockGitHubMockRecorder) GetNamespaceURL() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNamespaceURL", reflect.TypeOf((*MockGitHub)(nil).GetNamespaceURL)) +} + +// GetPackageByName mocks base method. +func (m *MockGitHub) GetPackageByName(arg0 context.Context, arg1, arg2, arg3 string) (*github.Package, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetPackageByName", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*github.Package) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetPackageByName indicates an expected call of GetPackageByName. +func (mr *MockGitHubMockRecorder) GetPackageByName(arg0, arg1, arg2, arg3 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPackageByName", reflect.TypeOf((*MockGitHub)(nil).GetPackageByName), arg0, arg1, arg2, arg3) +} + +// GetPackageVersionById mocks base method. +func (m *MockGitHub) GetPackageVersionById(arg0 context.Context, arg1, arg2, arg3 string, arg4 int64) (*github.PackageVersion, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetPackageVersionById", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(*github.PackageVersion) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetPackageVersionById indicates an expected call of GetPackageVersionById. +func (mr *MockGitHubMockRecorder) GetPackageVersionById(arg0, arg1, arg2, arg3, arg4 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPackageVersionById", reflect.TypeOf((*MockGitHub)(nil).GetPackageVersionById), arg0, arg1, arg2, arg3, arg4) +} + +// GetPrimaryEmail mocks base method. +func (m *MockGitHub) GetPrimaryEmail(ctx context.Context) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetPrimaryEmail", ctx) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetPrimaryEmail indicates an expected call of GetPrimaryEmail. +func (mr *MockGitHubMockRecorder) GetPrimaryEmail(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPrimaryEmail", reflect.TypeOf((*MockGitHub)(nil).GetPrimaryEmail), ctx) +} + +// GetPullRequest mocks base method. +func (m *MockGitHub) GetPullRequest(arg0 context.Context, arg1, arg2 string, arg3 int) (*github.PullRequest, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetPullRequest", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*github.PullRequest) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetPullRequest indicates an expected call of GetPullRequest. +func (mr *MockGitHubMockRecorder) GetPullRequest(arg0, arg1, arg2, arg3 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPullRequest", reflect.TypeOf((*MockGitHub)(nil).GetPullRequest), arg0, arg1, arg2, arg3) +} + +// GetRepository mocks base method. +func (m *MockGitHub) GetRepository(arg0 context.Context, arg1, arg2 string) (*github.Repository, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetRepository", arg0, arg1, arg2) + ret0, _ := ret[0].(*github.Repository) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetRepository indicates an expected call of GetRepository. +func (mr *MockGitHubMockRecorder) GetRepository(arg0, arg1, arg2 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetRepository", reflect.TypeOf((*MockGitHub)(nil).GetRepository), arg0, arg1, arg2) +} + +// GetUserId mocks base method. +func (m *MockGitHub) GetUserId(ctx context.Context) (int64, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetUserId", ctx) + ret0, _ := ret[0].(int64) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetUserId indicates an expected call of GetUserId. +func (mr *MockGitHubMockRecorder) GetUserId(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUserId", reflect.TypeOf((*MockGitHub)(nil).GetUserId), ctx) +} + +// IsOrg mocks base method. +func (m *MockGitHub) IsOrg() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsOrg") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsOrg indicates an expected call of IsOrg. +func (mr *MockGitHubMockRecorder) IsOrg() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsOrg", reflect.TypeOf((*MockGitHub)(nil).IsOrg)) +} + +// ListAllRepositories mocks base method. +func (m *MockGitHub) ListAllRepositories(arg0 context.Context) ([]*v10.Repository, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListAllRepositories", arg0) + ret0, _ := ret[0].([]*v10.Repository) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListAllRepositories indicates an expected call of ListAllRepositories. +func (mr *MockGitHubMockRecorder) ListAllRepositories(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAllRepositories", reflect.TypeOf((*MockGitHub)(nil).ListAllRepositories), arg0) +} + +// ListFiles mocks base method. +func (m *MockGitHub) ListFiles(ctx context.Context, owner, repo string, prNumber, perPage, pageNumber int) ([]*github.CommitFile, *github.Response, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListFiles", ctx, owner, repo, prNumber, perPage, pageNumber) + ret0, _ := ret[0].([]*github.CommitFile) + ret1, _ := ret[1].(*github.Response) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// ListFiles indicates an expected call of ListFiles. +func (mr *MockGitHubMockRecorder) ListFiles(ctx, owner, repo, prNumber, perPage, pageNumber any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListFiles", reflect.TypeOf((*MockGitHub)(nil).ListFiles), ctx, owner, repo, prNumber, perPage, pageNumber) +} + +// ListHooks mocks base method. +func (m *MockGitHub) ListHooks(ctx context.Context, owner, repo string) ([]*github.Hook, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListHooks", ctx, owner, repo) + ret0, _ := ret[0].([]*github.Hook) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListHooks indicates an expected call of ListHooks. +func (mr *MockGitHubMockRecorder) ListHooks(ctx, owner, repo any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListHooks", reflect.TypeOf((*MockGitHub)(nil).ListHooks), ctx, owner, repo) +} + +// ListImages mocks base method. +func (m *MockGitHub) ListImages(ctx context.Context) ([]string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListImages", ctx) + ret0, _ := ret[0].([]string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListImages indicates an expected call of ListImages. +func (mr *MockGitHubMockRecorder) ListImages(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListImages", reflect.TypeOf((*MockGitHub)(nil).ListImages), ctx) +} + +// ListIssueComments mocks base method. +func (m *MockGitHub) ListIssueComments(ctx context.Context, owner, repo string, number int, opts *github.IssueListCommentsOptions) ([]*github.IssueComment, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListIssueComments", ctx, owner, repo, number, opts) + ret0, _ := ret[0].([]*github.IssueComment) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListIssueComments indicates an expected call of ListIssueComments. +func (mr *MockGitHubMockRecorder) ListIssueComments(ctx, owner, repo, number, opts any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListIssueComments", reflect.TypeOf((*MockGitHub)(nil).ListIssueComments), ctx, owner, repo, number, opts) +} + +// ListPackagesByRepository mocks base method. +func (m *MockGitHub) ListPackagesByRepository(arg0 context.Context, arg1, arg2 string, arg3 int64, arg4, arg5 int) ([]*github.Package, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListPackagesByRepository", arg0, arg1, arg2, arg3, arg4, arg5) + ret0, _ := ret[0].([]*github.Package) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListPackagesByRepository indicates an expected call of ListPackagesByRepository. +func (mr *MockGitHubMockRecorder) ListPackagesByRepository(arg0, arg1, arg2, arg3, arg4, arg5 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListPackagesByRepository", reflect.TypeOf((*MockGitHub)(nil).ListPackagesByRepository), arg0, arg1, arg2, arg3, arg4, arg5) +} + +// ListPullRequests mocks base method. +func (m *MockGitHub) ListPullRequests(ctx context.Context, owner, repo string, opt *github.PullRequestListOptions) ([]*github.PullRequest, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListPullRequests", ctx, owner, repo, opt) + ret0, _ := ret[0].([]*github.PullRequest) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListPullRequests indicates an expected call of ListPullRequests. +func (mr *MockGitHubMockRecorder) ListPullRequests(ctx, owner, repo, opt any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListPullRequests", reflect.TypeOf((*MockGitHub)(nil).ListPullRequests), ctx, owner, repo, opt) +} + +// ListReviews mocks base method. +func (m *MockGitHub) ListReviews(arg0 context.Context, arg1, arg2 string, arg3 int, arg4 *github.ListOptions) ([]*github.PullRequestReview, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListReviews", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].([]*github.PullRequestReview) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListReviews indicates an expected call of ListReviews. +func (mr *MockGitHubMockRecorder) ListReviews(arg0, arg1, arg2, arg3, arg4 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListReviews", reflect.TypeOf((*MockGitHub)(nil).ListReviews), arg0, arg1, arg2, arg3, arg4) +} + +// NewRequest mocks base method. +func (m *MockGitHub) NewRequest(method, url string, body any) (*http.Request, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NewRequest", method, url, body) + ret0, _ := ret[0].(*http.Request) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NewRequest indicates an expected call of NewRequest. +func (mr *MockGitHubMockRecorder) NewRequest(method, url, body any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewRequest", reflect.TypeOf((*MockGitHub)(nil).NewRequest), method, url, body) +} + +// PropertiesToProtoMessage mocks base method. +func (m *MockGitHub) PropertiesToProtoMessage(entType v10.Entity, props *properties.Properties) (protoreflect.ProtoMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PropertiesToProtoMessage", entType, props) + ret0, _ := ret[0].(protoreflect.ProtoMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PropertiesToProtoMessage indicates an expected call of PropertiesToProtoMessage. +func (mr *MockGitHubMockRecorder) PropertiesToProtoMessage(entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PropertiesToProtoMessage", reflect.TypeOf((*MockGitHub)(nil).PropertiesToProtoMessage), entType, props) +} + +// RegisterEntity mocks base method. +func (m *MockGitHub) RegisterEntity(ctx context.Context, entType v10.Entity, props *properties.Properties) (*properties.Properties, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RegisterEntity", ctx, entType, props) + ret0, _ := ret[0].(*properties.Properties) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RegisterEntity indicates an expected call of RegisterEntity. +func (mr *MockGitHubMockRecorder) RegisterEntity(ctx, entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RegisterEntity", reflect.TypeOf((*MockGitHub)(nil).RegisterEntity), ctx, entType, props) +} + +// ReregisterEntity mocks base method. +func (m *MockGitHub) ReregisterEntity(ctx context.Context, entType v10.Entity, props *properties.Properties) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReregisterEntity", ctx, entType, props) + ret0, _ := ret[0].(error) + return ret0 +} + +// ReregisterEntity indicates an expected call of ReregisterEntity. +func (mr *MockGitHubMockRecorder) ReregisterEntity(ctx, entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReregisterEntity", reflect.TypeOf((*MockGitHub)(nil).ReregisterEntity), ctx, entType, props) +} + +// SetCommitStatus mocks base method. +func (m *MockGitHub) SetCommitStatus(arg0 context.Context, arg1, arg2, arg3 string, arg4 *github.RepoStatus) (*github.RepoStatus, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetCommitStatus", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(*github.RepoStatus) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SetCommitStatus indicates an expected call of SetCommitStatus. +func (mr *MockGitHubMockRecorder) SetCommitStatus(arg0, arg1, arg2, arg3, arg4 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetCommitStatus", reflect.TypeOf((*MockGitHub)(nil).SetCommitStatus), arg0, arg1, arg2, arg3, arg4) +} + +// StartCheckRun mocks base method. +func (m *MockGitHub) StartCheckRun(arg0 context.Context, arg1, arg2 string, arg3 *github.CreateCheckRunOptions) (*github.CheckRun, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StartCheckRun", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*github.CheckRun) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StartCheckRun indicates an expected call of StartCheckRun. +func (mr *MockGitHubMockRecorder) StartCheckRun(arg0, arg1, arg2, arg3 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StartCheckRun", reflect.TypeOf((*MockGitHub)(nil).StartCheckRun), arg0, arg1, arg2, arg3) +} + +// SupportsEntity mocks base method. +func (m *MockGitHub) SupportsEntity(entType v10.Entity) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SupportsEntity", entType) + ret0, _ := ret[0].(bool) + return ret0 +} + +// SupportsEntity indicates an expected call of SupportsEntity. +func (mr *MockGitHubMockRecorder) SupportsEntity(entType any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SupportsEntity", reflect.TypeOf((*MockGitHub)(nil).SupportsEntity), entType) +} + +// UpdateBranchProtection mocks base method. +func (m *MockGitHub) UpdateBranchProtection(arg0 context.Context, arg1, arg2, arg3 string, arg4 *github.ProtectionRequest) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateBranchProtection", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(error) + return ret0 +} + +// UpdateBranchProtection indicates an expected call of UpdateBranchProtection. +func (mr *MockGitHubMockRecorder) UpdateBranchProtection(arg0, arg1, arg2, arg3, arg4 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateBranchProtection", reflect.TypeOf((*MockGitHub)(nil).UpdateBranchProtection), arg0, arg1, arg2, arg3, arg4) +} + +// UpdateCheckRun mocks base method. +func (m *MockGitHub) UpdateCheckRun(arg0 context.Context, arg1, arg2 string, arg3 int64, arg4 *github.UpdateCheckRunOptions) (*github.CheckRun, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateCheckRun", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(*github.CheckRun) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateCheckRun indicates an expected call of UpdateCheckRun. +func (mr *MockGitHubMockRecorder) UpdateCheckRun(arg0, arg1, arg2, arg3, arg4 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateCheckRun", reflect.TypeOf((*MockGitHub)(nil).UpdateCheckRun), arg0, arg1, arg2, arg3, arg4) +} + +// UpdateIssueComment mocks base method. +func (m *MockGitHub) UpdateIssueComment(ctx context.Context, owner, repo string, number int64, comment string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateIssueComment", ctx, owner, repo, number, comment) + ret0, _ := ret[0].(error) + return ret0 +} + +// UpdateIssueComment indicates an expected call of UpdateIssueComment. +func (mr *MockGitHubMockRecorder) UpdateIssueComment(ctx, owner, repo, number, comment any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateIssueComment", reflect.TypeOf((*MockGitHub)(nil).UpdateIssueComment), ctx, owner, repo, number, comment) +} + +// UpdateReview mocks base method. +func (m *MockGitHub) UpdateReview(arg0 context.Context, arg1, arg2 string, arg3 int, arg4 int64, arg5 string) (*github.PullRequestReview, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateReview", arg0, arg1, arg2, arg3, arg4, arg5) + ret0, _ := ret[0].(*github.PullRequestReview) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateReview indicates an expected call of UpdateReview. +func (mr *MockGitHubMockRecorder) UpdateReview(arg0, arg1, arg2, arg3, arg4, arg5 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateReview", reflect.TypeOf((*MockGitHub)(nil).UpdateReview), arg0, arg1, arg2, arg3, arg4, arg5) +} + +// MockImageLister is a mock of ImageLister interface. +type MockImageLister struct { + ctrl *gomock.Controller + recorder *MockImageListerMockRecorder + isgomock struct{} +} + +// MockImageListerMockRecorder is the mock recorder for MockImageLister. +type MockImageListerMockRecorder struct { + mock *MockImageLister +} + +// NewMockImageLister creates a new mock instance. +func NewMockImageLister(ctrl *gomock.Controller) *MockImageLister { + mock := &MockImageLister{ctrl: ctrl} + mock.recorder = &MockImageListerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockImageLister) EXPECT() *MockImageListerMockRecorder { + return m.recorder +} + +// CanImplement mocks base method. +func (m *MockImageLister) CanImplement(trait v10.ProviderType) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CanImplement", trait) + ret0, _ := ret[0].(bool) + return ret0 +} + +// CanImplement indicates an expected call of CanImplement. +func (mr *MockImageListerMockRecorder) CanImplement(trait any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CanImplement", reflect.TypeOf((*MockImageLister)(nil).CanImplement), trait) +} + +// DeregisterEntity mocks base method. +func (m *MockImageLister) DeregisterEntity(ctx context.Context, entType v10.Entity, props *properties.Properties) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeregisterEntity", ctx, entType, props) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeregisterEntity indicates an expected call of DeregisterEntity. +func (mr *MockImageListerMockRecorder) DeregisterEntity(ctx, entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeregisterEntity", reflect.TypeOf((*MockImageLister)(nil).DeregisterEntity), ctx, entType, props) +} + +// FetchAllProperties mocks base method. +func (m *MockImageLister) FetchAllProperties(ctx context.Context, getByProps *properties.Properties, entType v10.Entity, cachedProps *properties.Properties) (*properties.Properties, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchAllProperties", ctx, getByProps, entType, cachedProps) + ret0, _ := ret[0].(*properties.Properties) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchAllProperties indicates an expected call of FetchAllProperties. +func (mr *MockImageListerMockRecorder) FetchAllProperties(ctx, getByProps, entType, cachedProps any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchAllProperties", reflect.TypeOf((*MockImageLister)(nil).FetchAllProperties), ctx, getByProps, entType, cachedProps) +} + +// FetchProperty mocks base method. +func (m *MockImageLister) FetchProperty(ctx context.Context, getByProps *properties.Properties, entType v10.Entity, key string) (*properties.Property, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchProperty", ctx, getByProps, entType, key) + ret0, _ := ret[0].(*properties.Property) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchProperty indicates an expected call of FetchProperty. +func (mr *MockImageListerMockRecorder) FetchProperty(ctx, getByProps, entType, key any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchProperty", reflect.TypeOf((*MockImageLister)(nil).FetchProperty), ctx, getByProps, entType, key) +} + +// GetEntityName mocks base method. +func (m *MockImageLister) GetEntityName(entType v10.Entity, props *properties.Properties) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetEntityName", entType, props) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetEntityName indicates an expected call of GetEntityName. +func (mr *MockImageListerMockRecorder) GetEntityName(entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetEntityName", reflect.TypeOf((*MockImageLister)(nil).GetEntityName), entType, props) +} + +// GetNamespaceURL mocks base method. +func (m *MockImageLister) GetNamespaceURL() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetNamespaceURL") + ret0, _ := ret[0].(string) + return ret0 +} + +// GetNamespaceURL indicates an expected call of GetNamespaceURL. +func (mr *MockImageListerMockRecorder) GetNamespaceURL() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNamespaceURL", reflect.TypeOf((*MockImageLister)(nil).GetNamespaceURL)) +} + +// ListImages mocks base method. +func (m *MockImageLister) ListImages(ctx context.Context) ([]string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListImages", ctx) + ret0, _ := ret[0].([]string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListImages indicates an expected call of ListImages. +func (mr *MockImageListerMockRecorder) ListImages(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListImages", reflect.TypeOf((*MockImageLister)(nil).ListImages), ctx) +} + +// PropertiesToProtoMessage mocks base method. +func (m *MockImageLister) PropertiesToProtoMessage(entType v10.Entity, props *properties.Properties) (protoreflect.ProtoMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PropertiesToProtoMessage", entType, props) + ret0, _ := ret[0].(protoreflect.ProtoMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PropertiesToProtoMessage indicates an expected call of PropertiesToProtoMessage. +func (mr *MockImageListerMockRecorder) PropertiesToProtoMessage(entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PropertiesToProtoMessage", reflect.TypeOf((*MockImageLister)(nil).PropertiesToProtoMessage), entType, props) +} + +// RegisterEntity mocks base method. +func (m *MockImageLister) RegisterEntity(ctx context.Context, entType v10.Entity, props *properties.Properties) (*properties.Properties, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RegisterEntity", ctx, entType, props) + ret0, _ := ret[0].(*properties.Properties) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RegisterEntity indicates an expected call of RegisterEntity. +func (mr *MockImageListerMockRecorder) RegisterEntity(ctx, entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RegisterEntity", reflect.TypeOf((*MockImageLister)(nil).RegisterEntity), ctx, entType, props) +} + +// ReregisterEntity mocks base method. +func (m *MockImageLister) ReregisterEntity(ctx context.Context, entType v10.Entity, props *properties.Properties) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReregisterEntity", ctx, entType, props) + ret0, _ := ret[0].(error) + return ret0 +} + +// ReregisterEntity indicates an expected call of ReregisterEntity. +func (mr *MockImageListerMockRecorder) ReregisterEntity(ctx, entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReregisterEntity", reflect.TypeOf((*MockImageLister)(nil).ReregisterEntity), ctx, entType, props) +} + +// SupportsEntity mocks base method. +func (m *MockImageLister) SupportsEntity(entType v10.Entity) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SupportsEntity", entType) + ret0, _ := ret[0].(bool) + return ret0 +} + +// SupportsEntity indicates an expected call of SupportsEntity. +func (mr *MockImageListerMockRecorder) SupportsEntity(entType any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SupportsEntity", reflect.TypeOf((*MockImageLister)(nil).SupportsEntity), entType) +} + +// MockOCI is a mock of OCI interface. +type MockOCI struct { + ctrl *gomock.Controller + recorder *MockOCIMockRecorder + isgomock struct{} +} + +// MockOCIMockRecorder is the mock recorder for MockOCI. +type MockOCIMockRecorder struct { + mock *MockOCI +} + +// NewMockOCI creates a new mock instance. +func NewMockOCI(ctrl *gomock.Controller) *MockOCI { + mock := &MockOCI{ctrl: ctrl} + mock.recorder = &MockOCIMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockOCI) EXPECT() *MockOCIMockRecorder { + return m.recorder +} + +// CanImplement mocks base method. +func (m *MockOCI) CanImplement(trait v10.ProviderType) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CanImplement", trait) + ret0, _ := ret[0].(bool) + return ret0 +} + +// CanImplement indicates an expected call of CanImplement. +func (mr *MockOCIMockRecorder) CanImplement(trait any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CanImplement", reflect.TypeOf((*MockOCI)(nil).CanImplement), trait) +} + +// DeregisterEntity mocks base method. +func (m *MockOCI) DeregisterEntity(ctx context.Context, entType v10.Entity, props *properties.Properties) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeregisterEntity", ctx, entType, props) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeregisterEntity indicates an expected call of DeregisterEntity. +func (mr *MockOCIMockRecorder) DeregisterEntity(ctx, entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeregisterEntity", reflect.TypeOf((*MockOCI)(nil).DeregisterEntity), ctx, entType, props) +} + +// FetchAllProperties mocks base method. +func (m *MockOCI) FetchAllProperties(ctx context.Context, getByProps *properties.Properties, entType v10.Entity, cachedProps *properties.Properties) (*properties.Properties, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchAllProperties", ctx, getByProps, entType, cachedProps) + ret0, _ := ret[0].(*properties.Properties) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchAllProperties indicates an expected call of FetchAllProperties. +func (mr *MockOCIMockRecorder) FetchAllProperties(ctx, getByProps, entType, cachedProps any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchAllProperties", reflect.TypeOf((*MockOCI)(nil).FetchAllProperties), ctx, getByProps, entType, cachedProps) +} + +// FetchProperty mocks base method. +func (m *MockOCI) FetchProperty(ctx context.Context, getByProps *properties.Properties, entType v10.Entity, key string) (*properties.Property, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchProperty", ctx, getByProps, entType, key) + ret0, _ := ret[0].(*properties.Property) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchProperty indicates an expected call of FetchProperty. +func (mr *MockOCIMockRecorder) FetchProperty(ctx, getByProps, entType, key any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchProperty", reflect.TypeOf((*MockOCI)(nil).FetchProperty), ctx, getByProps, entType, key) +} + +// GetArtifactVersions mocks base method. +func (m *MockOCI) GetArtifactVersions(ctx context.Context, artifact *v10.Artifact, filter v11.GetArtifactVersionsFilter) ([]*v10.ArtifactVersion, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetArtifactVersions", ctx, artifact, filter) + ret0, _ := ret[0].([]*v10.ArtifactVersion) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetArtifactVersions indicates an expected call of GetArtifactVersions. +func (mr *MockOCIMockRecorder) GetArtifactVersions(ctx, artifact, filter any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetArtifactVersions", reflect.TypeOf((*MockOCI)(nil).GetArtifactVersions), ctx, artifact, filter) +} + +// GetAuthenticator mocks base method. +func (m *MockOCI) GetAuthenticator() (authn.Authenticator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetAuthenticator") + ret0, _ := ret[0].(authn.Authenticator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetAuthenticator indicates an expected call of GetAuthenticator. +func (mr *MockOCIMockRecorder) GetAuthenticator() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAuthenticator", reflect.TypeOf((*MockOCI)(nil).GetAuthenticator)) +} + +// GetDigest mocks base method. +func (m *MockOCI) GetDigest(ctx context.Context, name, tag string) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetDigest", ctx, name, tag) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetDigest indicates an expected call of GetDigest. +func (mr *MockOCIMockRecorder) GetDigest(ctx, name, tag any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDigest", reflect.TypeOf((*MockOCI)(nil).GetDigest), ctx, name, tag) +} + +// GetEntityName mocks base method. +func (m *MockOCI) GetEntityName(entType v10.Entity, props *properties.Properties) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetEntityName", entType, props) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetEntityName indicates an expected call of GetEntityName. +func (mr *MockOCIMockRecorder) GetEntityName(entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetEntityName", reflect.TypeOf((*MockOCI)(nil).GetEntityName), entType, props) +} + +// GetManifest mocks base method. +func (m *MockOCI) GetManifest(ctx context.Context, name, tag string) (*v1.Manifest, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetManifest", ctx, name, tag) + ret0, _ := ret[0].(*v1.Manifest) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetManifest indicates an expected call of GetManifest. +func (mr *MockOCIMockRecorder) GetManifest(ctx, name, tag any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetManifest", reflect.TypeOf((*MockOCI)(nil).GetManifest), ctx, name, tag) +} + +// GetReferrer mocks base method. +func (m *MockOCI) GetReferrer(ctx context.Context, name, tag, artifactType string) (any, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetReferrer", ctx, name, tag, artifactType) + ret0, _ := ret[0].(any) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetReferrer indicates an expected call of GetReferrer. +func (mr *MockOCIMockRecorder) GetReferrer(ctx, name, tag, artifactType any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetReferrer", reflect.TypeOf((*MockOCI)(nil).GetReferrer), ctx, name, tag, artifactType) +} + +// GetRegistry mocks base method. +func (m *MockOCI) GetRegistry() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetRegistry") + ret0, _ := ret[0].(string) + return ret0 +} + +// GetRegistry indicates an expected call of GetRegistry. +func (mr *MockOCIMockRecorder) GetRegistry() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetRegistry", reflect.TypeOf((*MockOCI)(nil).GetRegistry)) +} + +// ListTags mocks base method. +func (m *MockOCI) ListTags(ctx context.Context, name string) ([]string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListTags", ctx, name) + ret0, _ := ret[0].([]string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListTags indicates an expected call of ListTags. +func (mr *MockOCIMockRecorder) ListTags(ctx, name any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListTags", reflect.TypeOf((*MockOCI)(nil).ListTags), ctx, name) +} + +// PropertiesToProtoMessage mocks base method. +func (m *MockOCI) PropertiesToProtoMessage(entType v10.Entity, props *properties.Properties) (protoreflect.ProtoMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PropertiesToProtoMessage", entType, props) + ret0, _ := ret[0].(protoreflect.ProtoMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PropertiesToProtoMessage indicates an expected call of PropertiesToProtoMessage. +func (mr *MockOCIMockRecorder) PropertiesToProtoMessage(entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PropertiesToProtoMessage", reflect.TypeOf((*MockOCI)(nil).PropertiesToProtoMessage), entType, props) +} + +// RegisterEntity mocks base method. +func (m *MockOCI) RegisterEntity(ctx context.Context, entType v10.Entity, props *properties.Properties) (*properties.Properties, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RegisterEntity", ctx, entType, props) + ret0, _ := ret[0].(*properties.Properties) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RegisterEntity indicates an expected call of RegisterEntity. +func (mr *MockOCIMockRecorder) RegisterEntity(ctx, entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RegisterEntity", reflect.TypeOf((*MockOCI)(nil).RegisterEntity), ctx, entType, props) +} + +// ReregisterEntity mocks base method. +func (m *MockOCI) ReregisterEntity(ctx context.Context, entType v10.Entity, props *properties.Properties) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReregisterEntity", ctx, entType, props) + ret0, _ := ret[0].(error) + return ret0 +} + +// ReregisterEntity indicates an expected call of ReregisterEntity. +func (mr *MockOCIMockRecorder) ReregisterEntity(ctx, entType, props any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReregisterEntity", reflect.TypeOf((*MockOCI)(nil).ReregisterEntity), ctx, entType, props) +} + +// SupportsEntity mocks base method. +func (m *MockOCI) SupportsEntity(entType v10.Entity) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SupportsEntity", entType) + ret0, _ := ret[0].(bool) + return ret0 +} + +// SupportsEntity indicates an expected call of SupportsEntity. +func (mr *MockOCIMockRecorder) SupportsEntity(entType any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SupportsEntity", reflect.TypeOf((*MockOCI)(nil).SupportsEntity), entType) +} diff --git a/pkg/providers/v1/providers.go b/pkg/providers/v1/providers.go index ef27ef01ef..8d084f5b6e 100644 --- a/pkg/providers/v1/providers.go +++ b/pkg/providers/v1/providers.go @@ -33,6 +33,8 @@ const ( // ErrEntityNotFound is the error returned when an entity is not found var ErrEntityNotFound = errors.New("entity not found") +//go:generate go run go.uber.org/mock/mockgen -package mock_$GOPACKAGE -destination=./mock/$GOFILE -source=./$GOFILE + // Provider is the general interface for all providers type Provider interface { // CanImplement returns true/false depending on whether the Provider diff --git a/pkg/querier/bundle.go b/pkg/querier/bundle.go new file mode 100644 index 0000000000..f93fdc7038 --- /dev/null +++ b/pkg/querier/bundle.go @@ -0,0 +1,122 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package querier provides tools to interact with the Minder database +package querier + +import ( + "context" + + "github.com/google/uuid" + + "github.com/mindersec/minder/internal/db" +) + +// BundleSubscription represents a bundle subscription +type BundleSubscription struct { + ID uuid.UUID + ProjectID uuid.UUID + BundleID uuid.UUID + CurrentVersion string +} + +// BundleHandlers interface provides functions to interact with bundles and subscriptions +type BundleHandlers interface { + GetSubscriptionByProjectBundle( + ctx context.Context, + projectID uuid.UUID, + bundleNamespace, bundleName string, + ) (*BundleSubscription, error) + SetCurrentVersion(ctx context.Context, projectID uuid.UUID, currentVersion string) error + UpsertBundle(ctx context.Context, namespace, name string) error + GetBundleID(ctx context.Context, namespace, name string) (uuid.UUID, error) + CreateSubscription(ctx context.Context, projectID, bundleID uuid.UUID, currentVersion string) (*BundleSubscription, error) +} + +// CreateSubscription creates a subscription for a project and bundle +func (q *querierType) CreateSubscription( + ctx context.Context, + projectID, bundleID uuid.UUID, + currentVersion string, +) (*BundleSubscription, error) { + if q.querier == nil { + return nil, ErrQuerierMissing + } + ret, err := q.querier.CreateSubscription(ctx, db.CreateSubscriptionParams{ + ProjectID: projectID, + BundleID: bundleID, + CurrentVersion: currentVersion, + }) + if err != nil { + return nil, err + } + return &BundleSubscription{ + ID: ret.ID, + ProjectID: ret.ProjectID, + BundleID: ret.BundleID, + CurrentVersion: ret.CurrentVersion, + }, nil +} + +// GetBundleID gets the bundle ID +func (q *querierType) GetBundleID(ctx context.Context, namespace, name string) (uuid.UUID, error) { + if q.querier == nil { + return uuid.Nil, ErrQuerierMissing + } + ret, err := q.querier.GetBundle(ctx, db.GetBundleParams{ + Namespace: namespace, + Name: name, + }) + if err != nil { + return uuid.Nil, err + } + // Return the bundle ID + return ret.ID, nil +} + +// UpsertBundle creates a bundle if it does not exist +func (q *querierType) UpsertBundle(ctx context.Context, namespace, name string) error { + if q.querier == nil { + return ErrQuerierMissing + } + return q.querier.UpsertBundle(ctx, db.UpsertBundleParams{ + Namespace: namespace, + Name: name, + }) +} + +// SetCurrentVersion sets the current version of the bundle for a project +func (q *querierType) SetCurrentVersion(ctx context.Context, projectID uuid.UUID, currentVersion string) error { + if q.querier == nil { + return ErrQuerierMissing + } + return q.querier.SetSubscriptionBundleVersion(ctx, db.SetSubscriptionBundleVersionParams{ + ProjectID: projectID, + CurrentVersion: currentVersion, + }) +} + +// GetSubscriptionByProjectBundle gets a subscription by project bundle +func (q *querierType) GetSubscriptionByProjectBundle( + ctx context.Context, + projectID uuid.UUID, + bundleNamespace, bundleName string, +) (*BundleSubscription, error) { + if q.querier == nil { + return nil, ErrQuerierMissing + } + ret, err := q.querier.GetSubscriptionByProjectBundle(ctx, db.GetSubscriptionByProjectBundleParams{ + Namespace: bundleNamespace, + Name: bundleName, + ProjectID: projectID, + }) + if err != nil { + return nil, err + } + return &BundleSubscription{ + ID: ret.ID, + ProjectID: ret.ProjectID, + BundleID: ret.BundleID, + CurrentVersion: ret.CurrentVersion, + }, nil +} diff --git a/pkg/querier/profile.go b/pkg/querier/profile.go new file mode 100644 index 0000000000..e87b59a5aa --- /dev/null +++ b/pkg/querier/profile.go @@ -0,0 +1,120 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package querier provides tools to interact with the Minder database +package querier + +import ( + "context" + + "github.com/google/uuid" + + "github.com/mindersec/minder/internal/db" + pb "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + "github.com/mindersec/minder/pkg/profiles" +) + +// ProfileHandlers interface provides functions to interact with profiles +type ProfileHandlers interface { + CreateProfile( + ctx context.Context, + projectID uuid.UUID, + subscriptionID uuid.UUID, + profile *pb.Profile, + ) (*pb.Profile, error) + UpdateProfile( + ctx context.Context, + projectID uuid.UUID, + subscriptionID uuid.UUID, + profile *pb.Profile, + ) (*pb.Profile, error) + DeleteProfile(ctx context.Context, projectID uuid.UUID, profileID uuid.UUID) error + ListProfilesInstantiatingRuleType(ctx context.Context, ruleTypeID uuid.UUID) ([]string, error) + GetProfileByProjectAndName(ctx context.Context, projectID uuid.UUID, name string) (map[string]*pb.Profile, error) + DeleteRuleInstanceOfProfileInProject(ctx context.Context, projectID, profileID, ruleTypeID uuid.UUID) error +} + +// DeleteProfile deletes a profile +func (q *querierType) DeleteProfile(ctx context.Context, projectID uuid.UUID, profileID uuid.UUID) error { + if q.querier == nil { + return ErrQuerierMissing + } + return q.querier.DeleteProfile(ctx, db.DeleteProfileParams{ + ProjectID: projectID, + ID: profileID, + }) +} + +// UpdateProfile updates a profile +func (q *querierType) UpdateProfile( + ctx context.Context, + projectID uuid.UUID, + subscriptionID uuid.UUID, + profile *pb.Profile, +) (*pb.Profile, error) { + if q.querier == nil { + return nil, ErrQuerierMissing + } + if q.profileSvc == nil { + return nil, ErrProfileSvcMissing + } + return q.profileSvc.UpdateProfile(ctx, projectID, subscriptionID, profile, q.querier) +} + +// CreateProfile creates a profile +func (q *querierType) CreateProfile( + ctx context.Context, + projectID uuid.UUID, + subscriptionID uuid.UUID, + profile *pb.Profile, +) (*pb.Profile, error) { + if q.querier == nil { + return nil, ErrQuerierMissing + } + if q.profileSvc == nil { + return nil, ErrProfileSvcMissing + } + return q.profileSvc.CreateProfile(ctx, projectID, subscriptionID, profile, q.querier) +} + +// ListProfilesInstantiatingRuleType returns a list of profiles instantiating a rule type +func (q *querierType) ListProfilesInstantiatingRuleType(ctx context.Context, ruleTypeID uuid.UUID) ([]string, error) { + if q.querier == nil { + return nil, ErrQuerierMissing + } + return q.querier.ListProfilesInstantiatingRuleType(ctx, ruleTypeID) +} + +// GetProfileByProjectAndName returns a profile by project ID and name +func (q *querierType) GetProfileByProjectAndName( + ctx context.Context, + projectID uuid.UUID, + name string, +) (map[string]*pb.Profile, error) { + if q.querier == nil { + return nil, ErrQuerierMissing + } + ret, err := q.querier.GetProfileByProjectAndName(ctx, db.GetProfileByProjectAndNameParams{ + Name: name, + ProjectID: projectID, + }) + if err != nil { + return nil, err + } + return profiles.MergeDatabaseGetByNameIntoProfiles(ret), nil +} + +// DeleteRuleInstanceOfProfileInProject deletes a rule instance for a profile in a project +func (q *querierType) DeleteRuleInstanceOfProfileInProject( + ctx context.Context, + projectID, profileID, ruleTypeID uuid.UUID, +) error { + if q.querier == nil { + return ErrQuerierMissing + } + return q.querier.DeleteRuleInstanceOfProfileInProject(ctx, db.DeleteRuleInstanceOfProfileInProjectParams{ + ProjectID: projectID, + ProfileID: profileID, + RuleTypeID: ruleTypeID, + }) +} diff --git a/pkg/querier/project.go b/pkg/querier/project.go new file mode 100644 index 0000000000..6652fe28d9 --- /dev/null +++ b/pkg/querier/project.go @@ -0,0 +1,80 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package querier provides tools to interact with the Minder database +package querier + +import ( + "context" + + "github.com/google/uuid" + "google.golang.org/protobuf/types/known/timestamppb" + + "github.com/mindersec/minder/internal/projects" + pb "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" +) + +// ProjectHandlers interface provides functions to interact with projects +type ProjectHandlers interface { + GetRootProjectByID(ctx context.Context, id uuid.UUID) (*pb.Project, error) + ListAllParentProjects(ctx context.Context) ([]*pb.Project, error) +} + +// GetRootProjectByID returns a root project by its ID +func (q *querierType) GetRootProjectByID(ctx context.Context, id uuid.UUID) (*pb.Project, error) { + if q.querier == nil { + return nil, ErrQuerierMissing + } + ret, err := q.querier.GetRootProjectByID(ctx, id) + if err != nil { + return nil, err + } + + // Try to parse the project metadata to complete the response fields + pDisplay := ret.Name + pDescription := "" + meta, err := projects.ParseMetadata(&ret) + if err == nil { + pDisplay = meta.Public.DisplayName + pDescription = meta.Public.Description + } + return &pb.Project{ + ProjectId: ret.ID.String(), + Name: ret.Name, + CreatedAt: timestamppb.New(ret.CreatedAt), + UpdatedAt: timestamppb.New(ret.UpdatedAt), + DisplayName: pDisplay, + Description: pDescription, + }, nil +} + +// ListAllParentProjects returns all parent projects +func (q *querierType) ListAllParentProjects(ctx context.Context) ([]*pb.Project, error) { + if q.querier == nil { + return nil, ErrQuerierMissing + } + ret, err := q.querier.ListAllRootProjects(ctx) + if err != nil { + return nil, err + } + result := make([]*pb.Project, len(ret)) + for i, p := range ret { + // Try to parse the project metadata to complete the response fields + pDisplay := p.Name + pDescription := "" + meta, err := projects.ParseMetadata(&p) + if err == nil { + pDisplay = meta.Public.DisplayName + pDescription = meta.Public.Description + } + result[i] = &pb.Project{ + ProjectId: p.ID.String(), + Name: p.Name, + CreatedAt: timestamppb.New(p.CreatedAt), + UpdatedAt: timestamppb.New(p.UpdatedAt), + DisplayName: pDisplay, + Description: pDescription, + } + } + return result, nil +} diff --git a/pkg/querier/querier.go b/pkg/querier/querier.go new file mode 100644 index 0000000000..792ad6ede5 --- /dev/null +++ b/pkg/querier/querier.go @@ -0,0 +1,144 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package querier provides tools to interact with the Minder database +package querier + +import ( + "context" + "database/sql" + "fmt" + + "github.com/rs/zerolog" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "github.com/mindersec/minder/internal/db" + "github.com/mindersec/minder/pkg/config/server" + "github.com/mindersec/minder/pkg/engine/selectors" + "github.com/mindersec/minder/pkg/eventer" + "github.com/mindersec/minder/pkg/profiles" + "github.com/mindersec/minder/pkg/ruletypes" +) + +var ( + // ErrQuerierMissing is returned when the querier is not initialized + ErrQuerierMissing = fmt.Errorf("querier is missing, possibly due to closed or committed transaction") + // ErrProfileSvcMissing is returned when the profile service is not initialized + ErrProfileSvcMissing = fmt.Errorf("profile service is missing") + // ErrRuleSvcMissing is returned when the rule service is not initialized + ErrRuleSvcMissing = fmt.Errorf("rule service is missing") +) + +// Store interface provides functions to execute db queries and transactions +type Store interface { + ProjectHandlers + RuleTypeHandlers + ProfileHandlers + BundleHandlers + BeginTx() (Querier, error) +} + +// Querier interface provides functions to interact with the Minder database using transactions +// Calling Commit() or Cancel() is necessary after using the querier. +// Note that they act as a destructor for the transaction +// so any further calls using the querier will result in an error. +type Querier interface { + ProjectHandlers + RuleTypeHandlers + ProfileHandlers + BundleHandlers + Commit() error + Cancel() error +} + +// querierType represents the database querier +type querierType struct { + store db.Store + tx *sql.Tx + querier db.ExtendQuerier + ruleSvc ruletypes.RuleTypeService + profileSvc profiles.ProfileService +} + +// Closer is a function that closes the database connection +type Closer func() + +// Ensure Type implements the Querier interface +var _ Querier = (*querierType)(nil) + +// New creates a new instance of the querier +func New(ctx context.Context, config *server.Config) (Store, Closer, error) { + // Initialize the database + store, dbCloser, err := initDatabase(ctx, config) + if err != nil { + return nil, nil, fmt.Errorf("unable to setup database: %w", err) + } + // Get a watermill event handler + evt, err := eventer.New(ctx, nil, &config.Events) + if err != nil { + return nil, nil, fmt.Errorf("unable to setup eventer: %w", err) + } + // Return the new Type + return &querierType{ + store: store, + querier: store, // use store by default + ruleSvc: ruletypes.NewRuleTypeService(), + profileSvc: profiles.NewProfileService(evt, selectors.NewEnv()), + }, dbCloser, nil +} + +// BeginTx begins a new transaction +func (q *querierType) BeginTx() (Querier, error) { + tx, err := q.store.BeginTransaction() + if err != nil { + return nil, status.Errorf(codes.Internal, "failed to begin transaction") + } + return &querierType{ + store: q.store, + querier: q.store.GetQuerierWithTransaction(tx), + ruleSvc: q.ruleSvc, + profileSvc: q.profileSvc, + tx: tx, + }, nil +} + +// Commit commits the transaction +func (q *querierType) Commit() error { + if q.tx == nil { + return fmt.Errorf("no transaction to commit") + } + err := q.store.Commit(q.tx) + // Clear the transaction and the querier + q.tx = nil + q.querier = nil + return err +} + +// Cancel cancels the transaction +func (q *querierType) Cancel() error { + if q.tx == nil { + return fmt.Errorf("no transaction to cancel") + } + err := q.store.Rollback(q.tx) + // Clear the transaction and the querier + q.tx = nil + q.querier = nil + return err +} + +// initDatabase function initializes the database connection +func initDatabase(ctx context.Context, cfg *server.Config) (db.Store, func(), error) { + // Get a database connection + dbConn, _, err := cfg.Database.GetDBConnection(ctx) + if err != nil { + return nil, nil, fmt.Errorf("unable to connect to database: %w", err) + } + closer := func() { + err := dbConn.Close() + if err != nil { + zerolog.Ctx(ctx).Error().Err(err).Msg("error closing database connection") + } + } + return db.NewStore(dbConn), closer, nil +} diff --git a/pkg/querier/ruletype.go b/pkg/querier/ruletype.go new file mode 100644 index 0000000000..d247790018 --- /dev/null +++ b/pkg/querier/ruletype.go @@ -0,0 +1,100 @@ +// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package querier provides tools to interact with the Minder database +package querier + +import ( + "context" + "fmt" + + "github.com/google/uuid" + + "github.com/mindersec/minder/internal/db" + pb "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1" + "github.com/mindersec/minder/pkg/ruletypes" +) + +// RuleTypeHandlers interface provides functions to interact with ruletypes +type RuleTypeHandlers interface { + ListRuleTypesByProject(ctx context.Context, projectID uuid.UUID) ([]*pb.RuleType, error) + CreateRuleType(ctx context.Context, projectID uuid.UUID, subscriptionID uuid.UUID, ruleType *pb.RuleType) (*pb.RuleType, error) + UpdateRuleType(ctx context.Context, projectID uuid.UUID, subscriptionID uuid.UUID, ruleType *pb.RuleType) (*pb.RuleType, error) + DeleteRuleType(ctx context.Context, ruleTypeID uuid.UUID) error + GetRuleTypeByName(ctx context.Context, projectIDs []uuid.UUID, name string) (*pb.RuleType, error) +} + +// DeleteRuleType deletes a rule type by ID +func (q *querierType) DeleteRuleType(ctx context.Context, ruleTypeID uuid.UUID) error { + if q.querier == nil { + return ErrQuerierMissing + } + return q.querier.DeleteRuleType(ctx, ruleTypeID) +} + +// ListRuleTypesByProject returns a list of rule types by project ID +func (q *querierType) ListRuleTypesByProject(ctx context.Context, projectID uuid.UUID) ([]*pb.RuleType, error) { + if q.querier == nil { + return nil, ErrQuerierMissing + } + ret, err := q.querier.ListRuleTypesByProject(ctx, projectID) + if err != nil { + return nil, err + } + ruleTypes := make([]*pb.RuleType, len(ret)) + for i, r := range ret { + rt, err := ruletypes.RuleTypePBFromDB(&r) + if err != nil { + return nil, fmt.Errorf("cannot convert rule type %s to pb: %w", r.Name, err) + } + ruleTypes[i] = rt + } + return ruleTypes, nil +} + +// GetRuleTypeByName returns a rule type by name and project IDs +func (q *querierType) GetRuleTypeByName(ctx context.Context, projectIDs []uuid.UUID, name string) (*pb.RuleType, error) { + if q.querier == nil { + return nil, ErrQuerierMissing + } + ret, err := q.querier.GetRuleTypeByName(ctx, db.GetRuleTypeByNameParams{ + Name: name, + Projects: projectIDs, + }) + if err != nil { + return nil, err + } + return ruletypes.RuleTypePBFromDB(&ret) +} + +// UpdateRuleType updates a rule type +func (q *querierType) UpdateRuleType( + ctx context.Context, + projectID uuid.UUID, + subscriptionID uuid.UUID, + ruleType *pb.RuleType, +) (*pb.RuleType, error) { + if q.querier == nil { + return nil, ErrQuerierMissing + } + if q.ruleSvc == nil { + return nil, ErrRuleSvcMissing + } + return q.ruleSvc.UpdateRuleType(ctx, projectID, subscriptionID, ruleType, q.querier) +} + +// CreateRuleType creates a rule type +func (q *querierType) CreateRuleType( + ctx context.Context, + projectID uuid.UUID, + subscriptionID uuid.UUID, + ruleType *pb.RuleType, +) (*pb.RuleType, error) { + if q.querier == nil { + return nil, ErrQuerierMissing + } + if q.ruleSvc == nil { + return nil, ErrRuleSvcMissing + } + return q.ruleSvc.CreateRuleType(ctx, projectID, subscriptionID, ruleType, q.querier) +} diff --git a/pkg/ruletypes/service.go b/pkg/ruletypes/service.go index 93666e2ad9..98cafcd1fe 100644 --- a/pkg/ruletypes/service.go +++ b/pkg/ruletypes/service.go @@ -23,6 +23,11 @@ import ( //go:generate go run go.uber.org/mock/mockgen -package mock_$GOPACKAGE -destination=./mock/$GOFILE -source=./$GOFILE +var ( + // ErrDataSourceNotFound is returned when a data source is not found + ErrDataSourceNotFound = errors.New("data source not found") +) + // RuleTypeService encapsulates the creation and update of rule types // TODO: in future, other operations such as delete should be moved here type RuleTypeService interface { @@ -150,6 +155,14 @@ func (_ *ruleTypeService) CreateRuleType( return nil, fmt.Errorf("failed to create rule type: %w", err) } + // Data Sources reference update. Note that this step can be + // safely performed after updating the rule, as the only thing + // we need from the previous code is project id and rule id. + ds := ruleTypeDef.GetEval().GetDataSources() + if err := processDataSources(ctx, newDBRecord.ID, ds, projectID, projects, qtx); err != nil { + return nil, fmt.Errorf("failed adding references to data sources: %w", err) + } + logger.BusinessRecord(ctx).RuleType = logger.RuleType{Name: newDBRecord.Name, ID: newDBRecord.ID} rt, err := RuleTypePBFromDB(&newDBRecord) @@ -229,6 +242,19 @@ func (_ *ruleTypeService) UpdateRuleType( return nil, fmt.Errorf("failed to update rule type: %w", err) } + projects, err := qtx.GetParentProjects(ctx, projectID) + if err != nil { + return nil, fmt.Errorf("failed to get parent projects: %w", err) + } + + // Data Sources reference update. Note that this step can be + // safely performed after updating the rule, as the only thing + // we need from the previous code is project id and rule id. + ds := ruleTypeDef.GetEval().GetDataSources() + if err := processDataSources(ctx, oldRuleType.ID, ds, projectID, projects, qtx); err != nil { + return nil, fmt.Errorf("failed updating references to data sources: %w", err) + } + logger.BusinessRecord(ctx).RuleType = logger.RuleType{Name: oldRuleType.Name, ID: oldRuleType.ID} result, err := RuleTypePBFromDB(&updatedRuleType) @@ -300,3 +326,71 @@ func validateRuleUpdate(existingRecord *db.RuleType, newRuleType *pb.RuleType) e return nil } + +func processDataSources( + ctx context.Context, + ruleID uuid.UUID, + ds []*pb.DataSourceReference, + projectID uuid.UUID, + projectHierarchy []uuid.UUID, + qtx db.Querier, +) error { + // We first verify that the data sources required are + // available within the project hierarchy. + datasources, err := getAvailableDataSources(ctx, ds, projectHierarchy, qtx) + if err != nil { + // We already have enough context. Let's not over-wrap the error. + return err + } + + // Then, we proceed to delete any data source reference we + // have for the old definition of the rule type. + deleteArgs := db.DeleteRuleTypeDataSourceParams{ + Ruleid: ruleID, + Projectid: projectID, + } + if err := qtx.DeleteRuleTypeDataSource(ctx, deleteArgs); err != nil { + return fmt.Errorf("error deleting references to data source: %w", err) + } + + // Finally, we add references to the required data source. + for _, datasource := range datasources { + insertArgs := db.AddRuleTypeDataSourceReferenceParams{ + Ruletypeid: ruleID, + Datasourceid: datasource.ID, + Projectid: projectID, + } + if _, err := qtx.AddRuleTypeDataSourceReference(ctx, insertArgs); err != nil { + return fmt.Errorf("error adding references to data source: %w", err) + } + } + + return nil +} + +func getAvailableDataSources( + ctx context.Context, + requiredDataSources []*pb.DataSourceReference, + projects []uuid.UUID, + qtx db.Querier, +) ([]db.DataSource, error) { + datasources := make([]db.DataSource, 0) + + for _, datasource := range requiredDataSources { + qarg := db.GetDataSourceByNameParams{ + Name: datasource.Name, + Projects: projects, + } + dbDataSource, err := qtx.GetDataSourceByName(ctx, qarg) + if err != nil && errors.Is(err, sql.ErrNoRows) { + return nil, fmt.Errorf("%w: %s", ErrDataSourceNotFound, datasource.Name) + } + if err != nil { + return nil, fmt.Errorf("failed getting data sources: %w", err) + } + + datasources = append(datasources, dbDataSource) + } + + return datasources, nil +} diff --git a/pkg/ruletypes/service_test.go b/pkg/ruletypes/service_test.go index 9f190c5763..8d19518a83 100644 --- a/pkg/ruletypes/service_test.go +++ b/pkg/ruletypes/service_test.go @@ -105,13 +105,13 @@ func TestRuleTypeService(t *testing.T) { { Name: "CreateRuleType successfully creates a new rule type", RuleType: newRuleType(withBasicStructure), - DBSetup: dbf.NewDBMock(withHierarchyGet, withNotFoundGet, withSuccessfulCreate), + DBSetup: dbf.NewDBMock(withHierarchyGet, withNotFoundGet, withSuccessfulCreate, withSuccessfulDeleteRuleTypeDataSource), TestMethod: create, }, { Name: "CreateRuleType successfully creates a new namespaced rule type", RuleType: newRuleType(withBasicStructure, withRuleName(namespacedRuleName)), - DBSetup: dbf.NewDBMock(withHierarchyGet, withNotFoundGet, withSuccessfulNamespaceCreate), + DBSetup: dbf.NewDBMock(withHierarchyGet, withNotFoundGet, withSuccessfulNamespaceCreate, withSuccessfulDeleteRuleTypeDataSource), SubscriptionID: subscriptionID, TestMethod: create, }, @@ -182,40 +182,120 @@ func TestRuleTypeService(t *testing.T) { { Name: "UpdateRuleType successfully updates an existing rule", RuleType: newRuleType(withBasicStructure), - DBSetup: dbf.NewDBMock(withSuccessfulGet, withSuccessfulUpdate), + DBSetup: dbf.NewDBMock(withHierarchyGet, withSuccessfulGet, withSuccessfulUpdate, withSuccessfulDeleteRuleTypeDataSource), TestMethod: update, }, { - Name: "UpdateRuleType successfully updates an existing rule", + Name: "UpdateRuleType successfully updates an existing rule with subscription", RuleType: newRuleType(withBasicStructure), - DBSetup: dbf.NewDBMock(withSuccessfulNamespaceGet, withSuccessfulUpdate), + DBSetup: dbf.NewDBMock(withHierarchyGet, withSuccessfulNamespaceGet, withSuccessfulUpdate, withSuccessfulDeleteRuleTypeDataSource), TestMethod: update, SubscriptionID: subscriptionID, }, { Name: "UpsertRuleType successfully creates a new namespaced rule type", RuleType: newRuleType(withBasicStructure, withRuleName(namespacedRuleName)), - DBSetup: dbf.NewDBMock(withHierarchyGet, withNotFoundGet, withSuccessfulNamespaceCreate), + DBSetup: dbf.NewDBMock(withHierarchyGet, withNotFoundGet, withSuccessfulNamespaceCreate, withSuccessfulDeleteRuleTypeDataSource), SubscriptionID: subscriptionID, TestMethod: upsert, }, { Name: "UpsertRuleType successfully updates an existing rule", RuleType: newRuleType(withBasicStructure, withRuleName(namespacedRuleName)), - DBSetup: dbf.NewDBMock(withHierarchyGet, withSuccessfulNamespaceGet, withSuccessfulUpdate), + DBSetup: dbf.NewDBMock(withHierarchyGet, withHierarchyGet, withSuccessfulNamespaceGet, withSuccessfulUpdate, withSuccessfulDeleteRuleTypeDataSource), TestMethod: upsert, SubscriptionID: subscriptionID, }, { Name: "CreateRuleType with EvaluationFailureMessage", RuleType: newRuleType(withBasicStructure, withEvaluationFailureMessage(shortFailureMessage)), - DBSetup: dbf.NewDBMock(withHierarchyGet, withNotFoundGet, withSuccessfulCreateWithEvaluationFailureMessage), + DBSetup: dbf.NewDBMock(withHierarchyGet, withNotFoundGet, withSuccessfulCreateWithEvaluationFailureMessage, withSuccessfulDeleteRuleTypeDataSource), TestMethod: create, }, { Name: "UpdateRuleType with EvaluationFailureMessage", RuleType: newRuleType(withBasicStructure, withEvaluationFailureMessage(shortFailureMessage)), - DBSetup: dbf.NewDBMock(withSuccessfulGet, withSuccessfulUpdateWithEvaluationFailureMessage), + DBSetup: dbf.NewDBMock(withHierarchyGet, withSuccessfulGet, withSuccessfulUpdateWithEvaluationFailureMessage, withSuccessfulDeleteRuleTypeDataSource), + TestMethod: update, + }, + { + Name: "CreateRuleType with Data Sources", + RuleType: newRuleType(withBasicStructure, withDataSources), + DBSetup: dbf.NewDBMock(withHierarchyGet, withNotFoundGet, withSuccessfulCreate, withSuccessfulGetDataSourcesByName(1), withSuccessfulDeleteRuleTypeDataSource, withSuccessfulAddRuleTypeDataSourceReference), + TestMethod: create, + }, + { + Name: "UpdateRuleType with Data Sources", + RuleType: newRuleType(withBasicStructure, withDataSources), + DBSetup: dbf.NewDBMock(withHierarchyGet, withSuccessfulGet, withSuccessfulUpdate, withSuccessfulGetDataSourcesByName(1), withSuccessfulDeleteRuleTypeDataSource, withSuccessfulAddRuleTypeDataSourceReference), + TestMethod: update, + }, + { + Name: "CreateRuleType with Data Sources not found", + RuleType: newRuleType(withBasicStructure, withDataSources), + ExpectedError: "data source not found", + DBSetup: dbf.NewDBMock(withHierarchyGet, withNotFoundGet, withSuccessfulCreate, withNotFoundGetDataSourcesByName), + TestMethod: create, + }, + { + Name: "UpdateRuleType with Data Sources not found", + RuleType: newRuleType(withBasicStructure, withDataSources), + ExpectedError: "data source not found", + DBSetup: dbf.NewDBMock(withHierarchyGet, withSuccessfulGet, withSuccessfulUpdate, withNotFoundGetDataSourcesByName), + TestMethod: update, + }, + { + Name: "CreateRuleType with Data Sources failed get", + RuleType: newRuleType(withBasicStructure, withDataSources), + ExpectedError: "failed getting data sources", + DBSetup: dbf.NewDBMock(withHierarchyGet, withNotFoundGet, withSuccessfulCreate, withFailedGetDataSourcesByName), + TestMethod: create, + }, + { + Name: "UpdateRuleType with Data Sources failed get", + RuleType: newRuleType(withBasicStructure, withDataSources), + ExpectedError: "failed getting data sources", + DBSetup: dbf.NewDBMock(withHierarchyGet, withSuccessfulGet, withSuccessfulUpdate, withFailedGetDataSourcesByName), + TestMethod: update, + }, + { + Name: "CreateRuleType with Data Sources failed delete", + RuleType: newRuleType(withBasicStructure, withDataSources), + ExpectedError: "error deleting references to data source", + DBSetup: dbf.NewDBMock(withHierarchyGet, withNotFoundGet, withSuccessfulCreate, withSuccessfulGetDataSourcesByName(1), withFailedDeleteRuleTypeDataSource), + TestMethod: create, + }, + { + Name: "UpdateRuleType with Data Sources failed delete", + RuleType: newRuleType(withBasicStructure, withDataSources), + ExpectedError: "error adding references to data source", + DBSetup: dbf.NewDBMock(withHierarchyGet, withSuccessfulGet, withSuccessfulUpdate, withSuccessfulGetDataSourcesByName(1), withSuccessfulDeleteRuleTypeDataSource, withFailedAddRuleTypeDataSourceReference), + TestMethod: update, + }, + { + Name: "CreateRuleType with Data Sources failed add", + RuleType: newRuleType(withBasicStructure, withDataSources), + ExpectedError: "error adding references to data source", + DBSetup: dbf.NewDBMock(withHierarchyGet, withNotFoundGet, withSuccessfulCreate, withSuccessfulGetDataSourcesByName(1), withSuccessfulDeleteRuleTypeDataSource, withFailedAddRuleTypeDataSourceReference), + TestMethod: create, + }, + { + Name: "UpdateRuleType with Data Sources failed add", + RuleType: newRuleType(withBasicStructure, withDataSources), + ExpectedError: "error adding references to data source", + DBSetup: dbf.NewDBMock(withHierarchyGet, withSuccessfulGet, withSuccessfulUpdate, withSuccessfulGetDataSourcesByName(1), withSuccessfulDeleteRuleTypeDataSource, withFailedAddRuleTypeDataSourceReference), + TestMethod: update, + }, + { + Name: "CreateRuleType with Data Sources multiple adds", + RuleType: newRuleType(withBasicStructure, withDataSources, withDataSources), + DBSetup: dbf.NewDBMock(withHierarchyGet, withNotFoundGet, withSuccessfulCreate, withSuccessfulGetDataSourcesByName(2), withSuccessfulDeleteRuleTypeDataSource, withSuccessfulAddRuleTypeDataSourceReference), + TestMethod: create, + }, + { + Name: "UpdateRuleType with Data Sources multiple add", + RuleType: newRuleType(withBasicStructure, withDataSources, withDataSources), + DBSetup: dbf.NewDBMock(withHierarchyGet, withSuccessfulGet, withSuccessfulUpdate, withSuccessfulGetDataSourcesByName(2), withSuccessfulDeleteRuleTypeDataSource, withSuccessfulAddRuleTypeDataSourceReference), TestMethod: update, }, } @@ -338,6 +418,16 @@ func withBasicStructure(ruleType *pb.RuleType) { ruleType.Severity = &pb.Severity{Value: pb.Severity_VALUE_HIGH} } +func withDataSources(ruleType *pb.RuleType) { + datasources := []*pb.DataSourceReference{ + { + // We just need a random string + Name: fmt.Sprintf("foo-%s", uuid.New().String()), + }, + } + ruleType.Def.Eval.DataSources = datasources +} + func withEvaluationFailureMessage(message string) func(ruleType *pb.RuleType) { return func(ruleType *pb.RuleType) { ruleType.ShortFailureMessage = message @@ -431,6 +521,52 @@ func withFailedUpdate(mock dbf.DBMock) { Return(db.RuleType{}, errDefault) } +func withSuccessfulGetDataSourcesByName(times int) func(dbf.DBMock) { + return func(mock dbf.DBMock) { + call := mock.EXPECT(). + GetDataSourceByName(gomock.Any(), gomock.Any()) + for i := 0; i < times; i++ { + call = call.Return(db.DataSource{Name: fmt.Sprintf("foo-%d", i)}, nil) + } + } +} + +func withNotFoundGetDataSourcesByName(mock dbf.DBMock) { + mock.EXPECT(). + GetDataSourceByName(gomock.Any(), gomock.Any()). + Return(db.DataSource{}, sql.ErrNoRows) +} + +func withFailedGetDataSourcesByName(mock dbf.DBMock) { + mock.EXPECT(). + GetDataSourceByName(gomock.Any(), gomock.Any()). + Return(db.DataSource{}, errDefault) +} + +func withSuccessfulDeleteRuleTypeDataSource(mock dbf.DBMock) { + mock.EXPECT(). + DeleteRuleTypeDataSource(gomock.Any(), gomock.Any()). + Return(nil) +} + +func withFailedDeleteRuleTypeDataSource(mock dbf.DBMock) { + mock.EXPECT(). + DeleteRuleTypeDataSource(gomock.Any(), gomock.Any()). + Return(errDefault) +} + +func withSuccessfulAddRuleTypeDataSourceReference(mock dbf.DBMock) { + mock.EXPECT(). + AddRuleTypeDataSourceReference(gomock.Any(), gomock.Any()). + Return(db.RuleTypeDataSource{}, nil) +} + +func withFailedAddRuleTypeDataSourceReference(mock dbf.DBMock) { + mock.EXPECT(). + AddRuleTypeDataSourceReference(gomock.Any(), gomock.Any()). + Return(db.RuleTypeDataSource{}, errDefault) +} + func newDBRuleType(severity db.Severity, subscriptionID uuid.UUID, failureMessage string) db.RuleType { name := ruleName if subscriptionID != uuid.Nil { diff --git a/proto/buf.lock b/proto/buf.lock index 65d8f1f75c..8c40aedcb9 100644 --- a/proto/buf.lock +++ b/proto/buf.lock @@ -1,8 +1,13 @@ # Generated by buf. DO NOT EDIT. version: v1 deps: + - remote: buf.build + owner: bufbuild + repository: protovalidate + commit: 5a7b106cbb87462d9a8c9ffecdbd2e38 + digest: shake256:2f7efa5a904668219f039d4f6eeb51e871f8f7f5966055a10663cba335bd65f76cac84da3fa758ab7b5dcb489ec599521390ce3951d119fb56df1fc2def16bb0 - remote: buf.build owner: googleapis repository: googleapis - commit: cc916c31859748a68fd229a3c8d7a2e8 - digest: shake256:469b049d0eb04203d5272062636c078decefc96fec69739159c25d85349c50c34c7706918a8b216c5c27f76939df48452148cff8c5c3ae77fa6ba5c25c1b8bf8 + commit: f52d4f76a8434cc5966798b1d3b4f110 + digest: shake256:71566dd80e39b7d85fdaa9b7f82107385181d5b6d17ea56c0aacce61099b35f9f1bcf7333ad9838ca19d24d7f076b039de7c9c09c55d23bb4c2fddfceff4d2c2 diff --git a/proto/buf.yaml b/proto/buf.yaml index 095a0725c0..c3157ef9ee 100644 --- a/proto/buf.yaml +++ b/proto/buf.yaml @@ -5,6 +5,7 @@ version: v1 name: buf.build/mindersec/minder deps: - buf.build/googleapis/googleapis + - buf.build/bufbuild/protovalidate breaking: use: - WIRE_JSON diff --git a/proto/minder/v1/minder.proto b/proto/minder/v1/minder.proto index 953eb0c46e..32bd042e4e 100644 --- a/proto/minder/v1/minder.proto +++ b/proto/minder/v1/minder.proto @@ -5,10 +5,12 @@ syntax = "proto3"; package minder.v1; import "google/api/annotations.proto"; +import "google/api/field_behavior.proto"; import "google/protobuf/descriptor.proto"; import "google/protobuf/timestamp.proto"; import "google/protobuf/struct.proto"; import "google/protobuf/field_mask.proto"; +import "buf/validate/validate.proto"; option go_package = "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1"; @@ -58,6 +60,10 @@ enum Relation { RELATION_ENTITY_RECONCILIATION_TASK_CREATE = 35 [(name) = "entity_reconciliation_task_create"]; RELATION_ENTITY_RECONCILE = 36 [(name) = "entity_reconcile"]; RELATION_ROLE_ASSIGNMENT_UPDATE = 37 [(name) = "role_assignment_update"]; + RELATION_DATA_SOURCE_GET = 38 [(name) = "data_source_get"]; + RELATION_DATA_SOURCE_CREATE = 39 [(name) = "data_source_create"]; + RELATION_DATA_SOURCE_UPDATE = 40 [(name) = "data_source_update"]; + RELATION_DATA_SOURCE_DELETE = 41 [(name) = "data_source_delete"]; } extend google.protobuf.EnumValueOptions { @@ -89,10 +95,20 @@ extend google.protobuf.MethodOptions { message Cursor { // cursor is the index to start from within the collection being // retrieved. It's an opaque payload specified and interpreted on - // an per-rpc basis. - string cursor = 1; + // an per-rpc basis. An empty string is used to indicate the first + // item in the collection. + string cursor = 1 [ + (buf.validate.field).string = { + pattern: "^[[:word:]=]*$", + max_len: 200, + } + ]; // size is the number of items to retrieve from the collection. - uint32 size = 2; + // 0 uses a server-defined default. + uint32 size = 2 [ + (buf.validate.field).uint32 = { gte: 0, lte: 100 }, + (google.api.field_behavior) = REQUIRED + ]; } // CursorPage message used in response messages. Its purpose is to @@ -102,10 +118,10 @@ message CursorPage { // Total number of records matching the request. This is optional. uint32 total_records = 1; // Cursor pointing to retrieve results logically placed after the - // ones shipped with the message containing this struct. + // ones shipped with the message containing this struct. This is optional. Cursor next = 2; // Cursor pointing to retrieve results logically placed before the - // ones shipped with the message containing this struct. + // ones shipped with the message containing this struct. This is optional. Cursor prev = 3; } @@ -164,31 +180,60 @@ service ArtifactService { } message ListArtifactsRequest { - string provider = 1; + string provider = 1 [deprecated=true]; Context context = 3; - string from = 4; + // from is the filter to apply to the list of artifacts. + // An example is "repository=org1/repo1,org2/repo2" + // to filter by repository names. This is optional. + string from = 4 [ + (buf.validate.field).string = { + pattern: "^[[:word:]]+=[-,/[:word:]]+$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; reserved 2; // deprecated project_id } message ListArtifactsResponse { - repeated Artifact results = 1; + repeated Artifact results = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message Artifact { - string artifact_pk = 1; + string artifact_pk = 1 [ + (google.api.field_behavior) = REQUIRED + ]; + // owner is the artifact owner. This is optional. string owner = 2; - string name = 3; - string type = 4; - string visibility = 5; + string name = 3 [ + (google.api.field_behavior) = REQUIRED + ]; + string type = 4 [ + (google.api.field_behavior) = REQUIRED + ]; + string visibility = 5 [ + (google.api.field_behavior) = REQUIRED + ]; + // repository is the repository the artifact originated from. + // This is optional. string repository = 6; repeated ArtifactVersion versions = 7; - google.protobuf.Timestamp created_at = 8; + google.protobuf.Timestamp created_at = 8 [ + (google.api.field_behavior) = REQUIRED + ]; Context context = 9; } +// ArtifactVersion is a version of an artifact. +// This is currently not populated in any requests or responses. message ArtifactVersion { - int64 version_id = 1; + int64 version_id = 1 [ + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE, + (buf.validate.field).int64 = { gte: 1 } + ]; repeated string tags = 2; string sha = 3; google.protobuf.Timestamp created_at = 6; @@ -198,7 +243,11 @@ message ArtifactVersion { } message GetArtifactByIdRequest { - string id = 1; + string id = 1 [ + (buf.validate.field).string = {uuid: true}, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE, + (google.api.field_behavior) = REQUIRED + ]; Context context = 7; @@ -207,12 +256,22 @@ message GetArtifactByIdRequest { } message GetArtifactByIdResponse { - Artifact artifact = 1; + Artifact artifact = 1 [ + (google.api.field_behavior) = REQUIRED + ]; + // This is optional and currently always nil. repeated ArtifactVersion versions = 2; } message GetArtifactByNameRequest { - string name = 1; + string name = 1 [ + (buf.validate.field).string = { + pattern: "^[-./[:word:]]*$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE, + (google.api.field_behavior) = REQUIRED + ]; Context context = 4; reserved 2, 3; // deprecated latest_versions, tag @@ -220,33 +279,13 @@ message GetArtifactByNameRequest { } message GetArtifactByNameResponse { - Artifact artifact = 1; + Artifact artifact = 1 [ + (google.api.field_behavior) = REQUIRED + ]; + // This is optional and currently always nil. repeated ArtifactVersion versions = 2; } -message PullRequest { - string url = 1; // The full URL to the PR - string commit_sha = 2; // Commit SHA of the PR HEAD. Will be useful to submit a review - int64 number = 3; // The sequential PR number (not the DB PK!) - - string repo_owner = 4; // The owner of the repo, will be used to submit a review - string repo_name = 5; // The name of the repo, will be used to submit a review - - int64 author_id = 6; // The author of the PR, will be used to check if we can request changes - - string action = 7; // The action that triggered the webhook - - Context context = 8; - - // properties is a map of properties of the entity. - google.protobuf.Struct properties = 9; - - string base_clone_url = 10; // URL used to clone the base repository - string target_clone_url = 11; // URL used to clone the target repository - string base_ref = 12; // The base ref of the PR - string target_ref = 13; // The target ref of the PR -} - // Stubs for the SDLC entities message Release {} message PipelineRun {} @@ -579,6 +618,87 @@ service ProfileService { } } +service DataSourceService { + rpc CreateDataSource (CreateDataSourceRequest) returns (CreateDataSourceResponse) { + option (google.api.http) = { + post: "/api/v1/data_source" + body: "*" + }; + + option (rpc_options) = { + target_resource: TARGET_RESOURCE_PROJECT + relation: RELATION_DATA_SOURCE_CREATE + }; + } + + rpc GetDataSourceById (GetDataSourceByIdRequest) returns (GetDataSourceByIdResponse) { + option (google.api.http) = { + get: "/api/v1/data_source/{id}" + }; + + option (rpc_options) = { + target_resource: TARGET_RESOURCE_PROJECT + relation: RELATION_DATA_SOURCE_GET + }; + } + + rpc GetDataSourceByName(GetDataSourceByNameRequest) returns (GetDataSourceByNameResponse) { + option (google.api.http) = { + get: "/api/v1/data_source/name/{name=**}" + }; + + option (rpc_options) = { + target_resource: TARGET_RESOURCE_PROJECT + relation: RELATION_DATA_SOURCE_GET + }; + } + + rpc ListDataSources (ListDataSourcesRequest) returns (ListDataSourcesResponse) { + option (google.api.http) = { + get: "/api/v1/data_sources" + }; + + option (rpc_options) = { + target_resource: TARGET_RESOURCE_PROJECT + relation: RELATION_DATA_SOURCE_GET + }; + } + + rpc UpdateDataSource (UpdateDataSourceRequest) returns (UpdateDataSourceResponse) { + option (google.api.http) = { + put: "/api/v1/data_source" + body: "*" + }; + + option (rpc_options) = { + target_resource: TARGET_RESOURCE_PROJECT + relation: RELATION_DATA_SOURCE_UPDATE + }; + } + + rpc DeleteDataSourceById(DeleteDataSourceByIdRequest) returns (DeleteDataSourceByIdResponse) { + option (google.api.http) = { + delete: "/api/v1/data_source/{id}" + }; + + option (rpc_options) = { + target_resource: TARGET_RESOURCE_PROJECT + relation: RELATION_DATA_SOURCE_DELETE + }; + } + + rpc DeleteDataSourceByName(DeleteDataSourceByNameRequest) returns (DeleteDataSourceByNameResponse) { + option (google.api.http) = { + delete: "/api/v1/data_source/name/{name=**}" + }; + + option (rpc_options) = { + target_resource: TARGET_RESOURCE_PROJECT + relation: RELATION_DATA_SOURCE_DELETE + }; + } +} + service RuleTypeService { rpc ListRuleTypes (ListRuleTypesRequest) returns (ListRuleTypesResponse) { @@ -904,19 +1024,6 @@ service ProvidersService { }; } - // GetUnclaimedProviders returns a list of known provider configurations - // that this user could claim based on their identity. This is a read-only - // operation for use by clients which wish to present a menu of options. - rpc GetUnclaimedProviders (GetUnclaimedProvidersRequest) returns (GetUnclaimedProvidersResponse) { - option (google.api.http) = { - get: "/api/v1/my/providers" - }; - - option (rpc_options) = { - target_resource: TARGET_RESOURCE_USER - }; - } - rpc ListProviderClasses (ListProviderClassesRequest) returns (ListProviderClassesResponse) { option (google.api.http) = { get: "/api/v1/provider_classes" @@ -955,7 +1062,13 @@ service InviteService { message GetInviteDetailsRequest { // Invite nonce/code to retrieve details for - string code = 2; + string code = 2 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z0-9_-]+$", + len: 64, + }, + (google.api.field_behavior) = REQUIRED + ]; reserved 1; // deprecated Context context = 1; reserved "context"; @@ -963,46 +1076,102 @@ message GetInviteDetailsRequest { message GetInviteDetailsResponse { // Project associated with the invite - string project_display = 1; + string project_display = 1 [ + (google.api.field_behavior) = REQUIRED + ]; // Sponsor of the invite - string sponsor_display = 2; + string sponsor_display = 2 [ + (google.api.field_behavior) = REQUIRED + ]; // expires_at is the time at which the invitation expires. - google.protobuf.Timestamp expires_at = 3; + google.protobuf.Timestamp expires_at = 3 [ + (google.api.field_behavior) = REQUIRED + ]; // expired is true if the invitation has expired - bool expired = 4; + bool expired = 4 [ + (google.api.field_behavior) = REQUIRED + ]; } message CheckHealthRequest { } message CheckHealthResponse { - string status = 1; + string status = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message GetAuthorizationURLRequest { - bool cli = 3; - int32 port = 4; - optional string owner = 5; + // cli is true if the request is being made from a CLI. + bool cli = 3; + + // owner is the owner (e.g GitHub org) that the provider is associated with. + // This is optional. + optional string owner = 5 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-[:word:]]*$" + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; Context context = 6; - optional string redirect_url = 7; + + // redirect_url is the URL to redirect to after the authorization is complete. + optional string redirect_url = 7 [ + (buf.validate.field).string = { + uri: true, + max_len: 600, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // config is a JSON object that can be used to pass additional configuration google.protobuf.Struct config = 8; - string provider_class = 9; + string provider_class = 9 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-[:word:]]*$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; - reserved 1, 2; // deprecated provider and project_id + reserved 1, 2, 4; + reserved "provider", "project_id", "port"; } message GetAuthorizationURLResponse { - string url = 1; - string state = 2; + string url = 1 [ + (google.api.field_behavior) = REQUIRED + ]; + string state = 2 [ + (google.api.field_behavior) = REQUIRED + ]; } message StoreProviderTokenRequest { string provider = 1 [deprecated=true]; - string access_token = 3; - optional string owner = 4; + + // access_token is the token to store. + string access_token = 3 [ + (buf.validate.field).string = { + pattern: "^[a-zA-Z0-9-_]+$", + min_len: 10, + max_len: 200, + }, + (google.api.field_behavior) = REQUIRED + ]; + + // owner is the owner (e.g GitHub org) that the provider is associated with. + // This is optional. + optional string owner = 4 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-[:word:]]*$" + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; Context context = 5; reserved 2; // deprecated project_id @@ -1011,16 +1180,28 @@ message StoreProviderTokenRequest { message StoreProviderTokenResponse { } -// Project API Objects +// Project API Objects. This is only used in responses. message Project { - string project_id = 1; - string name = 3; + string project_id = 1 [ + (google.api.field_behavior) = REQUIRED + ]; + string name = 3 [ + (google.api.field_behavior) = REQUIRED + ]; + + // description is a human-readable description of the project. + // This is optional. string description = 4; - google.protobuf.Timestamp created_at = 6; - google.protobuf.Timestamp updated_at = 7; + google.protobuf.Timestamp created_at = 6 [ + (google.api.field_behavior) = REQUIRED + ]; + google.protobuf.Timestamp updated_at = 7 [ + (google.api.field_behavior) = REQUIRED + ]; // display_name allows for a human-readable name to be used. // display_names are short *non-unique* strings to provide // a user-friendly name for presentation in lists, etc. + // This is optional. string display_name = 5; } @@ -1034,39 +1215,73 @@ message ListRemoteRepositoriesFromProviderRequest { } message ListRemoteRepositoriesFromProviderResponse { - repeated UpstreamRepositoryRef results = 1; + repeated UpstreamRepositoryRef results = 1 [ + (google.api.field_behavior) = REQUIRED + ]; // entities is the same list as the repositories, but it // uses the new UpstreamEntityRef message. This is what // we'll migrate to eventually. - repeated RegistrableUpstreamEntityRef entities = 2; + repeated RegistrableUpstreamEntityRef entities = 2 [ + (google.api.field_behavior) = REQUIRED + ]; } message RegistrableUpstreamEntityRef { - UpstreamEntityRef entity = 1; + UpstreamEntityRef entity = 1 [ + (google.api.field_behavior) = REQUIRED + ]; // True if the entity is already registered in Minder. bool registered = 2; } message UpstreamRepositoryRef { - string owner = 1; - string name = 2; + // owner is the owner (e.g GitHub org) that the provider is associated with. + // This is optional. + string owner = 1 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-[:word:]]*$" + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; + string name = 2 [ + (buf.validate.field).string = { + pattern: "^[-.[:alnum:]_]+$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE, + (google.api.field_behavior) = REQUIRED + ]; // The upstream identity of the repository, as an integer. // This is only set on output, and is ignored on input. - int64 repo_id = 3; + int64 repo_id = 3 [ + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE, // Given it's ignored on input, we can ignore empty values + (buf.validate.field).int64 = { gte: 1 } + ]; Context context = 4; // True if the repository is already registered in Minder. // This is only set on output, and is ignored on input. bool registered = 5; } +// Repository API objects. This is only used in responses. message Repository { reserved 15; reserved "registered"; - optional string id = 1; // This is optional when returning remote repositories + // id is the unique identifier of the repository within Minder. + // It is always populated, but the optional keyword is used for + // backwards compatibility. + optional string id = 1 [ + (google.api.field_behavior) = REQUIRED + ]; optional Context context = 2; - string owner = 3; - string name = 4; + string owner = 3 [ + (google.api.field_behavior) = REQUIRED + ]; + string name = 4 [ + (google.api.field_behavior) = REQUIRED + ]; int64 repo_id = 5; int64 hook_id = 6; string hook_url = 7; @@ -1075,8 +1290,12 @@ message Repository { string hook_name = 10; string hook_type = 11; string hook_uuid = 12; - bool is_private = 13; - bool is_fork = 14; + bool is_private = 13 [ + (google.api.field_behavior) = REQUIRED + ]; + bool is_fork = 14 [ + (google.api.field_behavior) = REQUIRED + ]; google.protobuf.Timestamp created_at = 16; google.protobuf.Timestamp updated_at = 17; string default_branch = 18; @@ -1087,11 +1306,14 @@ message Repository { message RegisterRepositoryRequest { string provider = 1 [deprecated=true]; + + // repository is the repository to register. This is optional if entity + // is set. UpstreamRepositoryRef repository = 3; Context context = 4; // entity is the entity to register. This is the same as the repository // field, but uses the new UpstreamEntityRef message. This is what we'll - // migrate to eventually. + // migrate to eventually. This is optional if repository is set. UpstreamEntityRef entity = 5; reserved 2; // deprecated project_id @@ -1104,67 +1326,114 @@ message RegisterRepoResult { } Repository repository = 1; - Status status = 2; + Status status = 2 [ + (google.api.field_behavior) = REQUIRED + ]; } message RegisterRepositoryResponse { - RegisterRepoResult result = 1; + RegisterRepoResult result = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message GetRepositoryByIdRequest { - string repository_id = 1; + string repository_id = 1 [ + (buf.validate.field).string = {uuid: true}, + (google.api.field_behavior) = REQUIRED + ]; Context context = 2; } message GetRepositoryByIdResponse { - Repository repository = 1; + Repository repository = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message DeleteRepositoryByIdRequest { - string repository_id = 1; + string repository_id = 1 [ + (buf.validate.field).string = {uuid: true}, + (google.api.field_behavior) = REQUIRED + ]; Context context = 2; } message DeleteRepositoryByIdResponse { - string repository_id = 1; + string repository_id = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message GetRepositoryByNameRequest { string provider = 1 [deprecated=true]; - string name = 3; + string name = 3 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-[:word:]./]*$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE, + (google.api.field_behavior) = REQUIRED + ]; Context context = 4; reserved 2; // deprecated project_id } message GetRepositoryByNameResponse { - Repository repository = 1; + Repository repository = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message DeleteRepositoryByNameRequest { string provider = 1 [deprecated=true]; - string name = 3; + string name = 3 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-[:word:]./]*$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE, + (google.api.field_behavior) = REQUIRED + ]; Context context = 4; reserved 2; // deprecated project_id } message DeleteRepositoryByNameResponse { - string name = 1; + string name = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message ListRepositoriesRequest { string provider = 1 [deprecated=true]; - int64 limit = 3; + + // limit is the maximum number of results to return. + // This is optional. + int64 limit = 3 [ + (buf.validate.field).int64 = { gte: 0, lte: 100 } + ]; Context context = 5; - string cursor = 6; + + // cursor is the cursor to use for the next page of results. + // This is optional. + string cursor = 6 [ + (buf.validate.field).string = { + pattern: "^[[:word:]=]*$", + max_len: 200, + } + ]; reserved 2,4; // deprecated project_id, offset reserved "project_id", "offset"; } message ListRepositoriesResponse { - repeated Repository results = 1; + repeated Repository results = 1 [ + (google.api.field_behavior) = REQUIRED + ]; // cursor is the cursor to use for the next page of results, empty if at the end string cursor = 2; @@ -1172,7 +1441,15 @@ message ListRepositoriesResponse { message ReconcileEntityRegistrationRequest { Context context = 1; - string entity = 2; + // entity is the entity type + string entity = 2 [ + (buf.validate.field).string = { + pattern: "^[a-z]+(_[a-z]+)*$", + min_len: 1, + max_len: 200, + }, + (google.api.field_behavior) = REQUIRED + ]; } message ReconcileEntityRegistrationResponse { @@ -1187,7 +1464,9 @@ message VerifyProviderTokenFromRequest { } message VerifyProviderTokenFromResponse { - string status = 1; + string status = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } // VerifyProviderCredentialRequest contains the enrollment nonce (aka state) that was used when enrolling the provider @@ -1195,34 +1474,51 @@ message VerifyProviderCredentialRequest { Context context = 1; // enrollment_nonce is the state parameter returned when enrolling the provider - string enrollment_nonce = 2; + string enrollment_nonce = 2 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z0-9_-]+$", + len: 54, + }, + (google.api.field_behavior) = REQUIRED + ]; } // VerifyProviderCredentialRequest responds with a boolean indicating if the provider has been created and the provider // name, if it has been created message VerifyProviderCredentialResponse { - bool created = 1; - string provider_name = 2; -} -message BranchProtection { - string branch = 1; - bool is_protected = 2; - // Add other relevant fields + // created is true if the provider was created. + bool created = 1 [ + (google.api.field_behavior) = REQUIRED + ]; + + // provider_name is the name of the provider that was created. + // This is populated if creation was successful. + string provider_name = 2; } // User service message CreateUserRequest { } message CreateUserResponse { - int32 id = 1; + int32 id = 1 [ + (google.api.field_behavior) = REQUIRED + ]; string organization_id = 2 [deprecated=true]; string organizatio_name =3 [deprecated=true]; - string project_id = 4; - string project_name = 5; - string identity_subject = 6; - google.protobuf.Timestamp created_at = 7; - Context context = 8; + string project_id = 4 [ + (google.api.field_behavior) = REQUIRED + ]; + string project_name = 5 [ + (google.api.field_behavior) = REQUIRED + ]; + string identity_subject = 6 [ + (google.api.field_behavior) = REQUIRED + ]; + google.protobuf.Timestamp created_at = 7 [ + (google.api.field_behavior) = REQUIRED + ]; + Context context = 8 [deprecated=true]; } message DeleteUserRequest { @@ -1234,10 +1530,18 @@ message DeleteUserResponse { // user record to be returned message UserRecord { - int32 id = 1; - string identity_subject = 3; - google.protobuf.Timestamp created_at = 4; - google.protobuf.Timestamp updated_at = 5; + int32 id = 1 [ + (google.api.field_behavior) = REQUIRED + ]; + string identity_subject = 3 [ + (google.api.field_behavior) = REQUIRED + ]; + google.protobuf.Timestamp created_at = 4 [ + (google.api.field_behavior) = REQUIRED + ]; + google.protobuf.Timestamp updated_at = 5 [ + (google.api.field_behavior) = REQUIRED + ]; reserved 2; // deprecated organization_id reserved "organization_id"; @@ -1245,8 +1549,12 @@ message UserRecord { // ProjectRole has the project along with the role the user has in the project message ProjectRole { - Role role = 1; - Project project = 2; + Role role = 1 [ + (google.api.field_behavior) = REQUIRED + ]; + Project project = 2 [ + (google.api.field_behavior) = REQUIRED + ]; } // get user @@ -1255,29 +1563,120 @@ message GetUserRequest { } message GetUserResponse { - optional UserRecord user = 1; + optional UserRecord user = 1 [ + (google.api.field_behavior) = REQUIRED + ]; // This will be deprecated in favor of the project_roles field repeated Project projects = 2 [deprecated=true]; - repeated ProjectRole project_roles = 3; + repeated ProjectRole project_roles = 3 [ + (google.api.field_behavior) = REQUIRED + ]; +} + +// DataSource service +message CreateDataSourceRequest { + DataSource data_source = 1; +} + +message CreateDataSourceResponse { + DataSource data_source = 1; +} + +message GetDataSourceByIdRequest { + ContextV2 context = 1; + string id = 2 [ + (buf.validate.field).string = {uuid: true} + ]; +} + +message GetDataSourceByIdResponse { + DataSource data_source = 1; +} + +// GetDataSourceByNameRequest is the request message for the GetDataSourceByName RPC. +message GetDataSourceByNameRequest { + ContextV2 context = 1; + + string name = 2 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-[:word:]]*$", + max_len: 200, + }, + (google.api.field_behavior) = REQUIRED + ]; +} + +message GetDataSourceByNameResponse { + DataSource data_source = 1; +} + +message ListDataSourcesRequest { + ContextV2 context = 1; +} + +message ListDataSourcesResponse { + repeated DataSource data_sources = 1; +} + +message UpdateDataSourceRequest { + DataSource data_source = 1; +} + +message UpdateDataSourceResponse { + DataSource data_source = 1; +} + +message DeleteDataSourceByIdRequest { + ContextV2 context = 1; + string id = 2 [ + (buf.validate.field).string = {uuid: true} + ]; +} + +message DeleteDataSourceByIdResponse { + string id = 1; +} + +message DeleteDataSourceByNameRequest { + ContextV2 context = 1; + string name = 2 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-[:word:]]*$", + max_len: 200, + }, + (google.api.field_behavior) = REQUIRED + ]; +} + +message DeleteDataSourceByNameResponse { + string name = 1; } // Profile service message CreateProfileRequest { - Profile profile = 1; + Profile profile = 1 [ + (google.api.field_behavior) = REQUIRED + ]; reserved 2; // deprecated context } message CreateProfileResponse { - Profile profile = 1; + Profile profile = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message UpdateProfileRequest { - Profile profile = 1; + Profile profile = 1 [ + (google.api.field_behavior) = REQUIRED + ]; reserved 2; // deprecated context } message UpdateProfileResponse { - Profile profile = 1; + Profile profile = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message PatchProfileRequest { @@ -1287,7 +1686,10 @@ message PatchProfileRequest { Context context = 1; // The id of the profile to patch. Same explanation about explicitness // as for the context - string id = 2; + string id = 2 [ + (buf.validate.field).string = {uuid: true}, + (google.api.field_behavior) = REQUIRED + ]; // The patch to apply to the profile Profile patch = 3; // needed to enable PATCH, see https://grpc-ecosystem.github.io/grpc-gateway/docs/mapping/patch_feature/ @@ -1296,14 +1698,19 @@ message PatchProfileRequest { } message PatchProfileResponse { - Profile profile = 1; + Profile profile = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message DeleteProfileRequest { // context is the context in which the rule type is evaluated. Context context = 1; // id is the id of the profile to delete - string id = 2; + string id = 2 [ + (buf.validate.field).string = {uuid: true}, + (google.api.field_behavior) = REQUIRED + ]; } message DeleteProfileResponse { @@ -1318,11 +1725,19 @@ message ListProfilesRequest { // The default is to return all user-created profiles; the string "*" can // be used to select all profiles, including system profiles. This syntax // may be expanded in the future. - string label_filter = 2; + string label_filter = 2 [ + (buf.validate.field).string = { + pattern: "^(\\*|[a-z][a-z0-9_]*)$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; } message ListProfilesResponse { - repeated Profile profiles = 1; + repeated Profile profiles = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } // get profile by id @@ -1330,11 +1745,16 @@ message GetProfileByIdRequest { // context is the context which contains the profiles Context context = 1; // id is the id of the profile to get - string id = 2; + string id = 2 [ + (buf.validate.field).string = {uuid: true}, + (google.api.field_behavior) = REQUIRED + ]; } message GetProfileByIdResponse { - Profile profile = 1; + Profile profile = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } // get profile by name @@ -1342,21 +1762,31 @@ message GetProfileByNameRequest { // context is the context in which the rule type is evaluated. Context context = 1; // name is the name of the profile to get - string name = 2; + string name = 2 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-/[:word:]]*$", + max_len: 200, + }, + (google.api.field_behavior) = REQUIRED + ]; } message GetProfileByNameResponse { - Profile profile = 1; + Profile profile = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } -// get the overall profile status +// get the overall profile status as output message ProfileStatus { - // profile_id is the id of the profile + // profile_id is the id of the profile. One of profile_id or profile_name must be set. string profile_id = 1; - // profile_name is the name of the profile + // profile_name is the name of the profile. One of profile_id or profile_name must be set. string profile_name = 2; // profile_status is the status of the profile - string profile_status = 3; + string profile_status = 3 [ + (google.api.field_behavior) = REQUIRED + ]; // last_updated is the last time the profile was updated google.protobuf.Timestamp last_updated = 4; @@ -1381,13 +1811,19 @@ message RuleEvaluationStatus { // profile_id is the id of the profile string profile_id = 1; // rule_id is the id of the rule - string rule_id = 2; + string rule_id = 2 [ + (google.api.field_behavior) = REQUIRED + ]; // rule_name is the type of the rule. Deprecated in favor of rule_type_name string rule_name = 3 [deprecated=true]; // entity is the entity that was evaluated - string entity = 4; + string entity = 4 [ + (google.api.field_behavior) = REQUIRED + ]; // status is the status of the evaluation - string status = 5; + string status = 5 [ + (google.api.field_behavior) = REQUIRED + ]; // last_updated is the last time the profile was updated google.protobuf.Timestamp last_updated = 6; // entity_info is the information about the entity @@ -1403,12 +1839,14 @@ message RuleEvaluationStatus { // remediation_details is the description of the remediation attempt if any string remediation_details = 12; // rule_type_name is the name of the rule - string rule_type_name = 13; + string rule_type_name = 13 [ + (google.api.field_behavior) = REQUIRED + ]; // rule_description_name is the name to describe the rule string rule_description_name = 14; // alert holds the alert details if the rule generated an alert in an external system EvalResultAlert alert = 15; - // severity is the severity of the rule + // severity is the severity of the rule. This may be empty. Severity severity = 16; // rule_evaluation_id is the id of the rule evaluation string rule_evaluation_id = 17; @@ -1417,36 +1855,74 @@ message RuleEvaluationStatus { // rule_display_name captures the display name of the rule string rule_display_name = 19; // release_phase is the phase of the release - RuleTypeReleasePhase release_phase = 20; + RuleTypeReleasePhase release_phase = 20 [ + (google.api.field_behavior) = REQUIRED + ]; } // EntiryTypeId is a message that carries an ID together with a type to uniquely identify an entity // such as (repo, 1), (artifact, 2), ... message EntityTypedId { // entity is the entity to get status for. Incompatible with `all` - Entity type = 1; + Entity type = 1 [ + (google.api.field_behavior) = REQUIRED + ]; // id is the ID of the entity to get status for. Incompatible with `all` - string id = 2; + string id = 2 [ + (buf.validate.field).string = {uuid: true}, + (google.api.field_behavior) = REQUIRED + ]; } message GetProfileStatusByNameRequest { // context is the context in which the rule type is evaluated. Context context = 1; // name is the name of the profile to get - string name = 2; - + string name = 2 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-/[:word:]]*$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; + + // entity is the entity to get status for. Incompatible with `all`. + // This is optional. EntityTypedId entity = 3; + + // all is true if the status of all entities should be returned. + // Incompatible with `entity`. This is optional. bool all = 4; // rule is the type of the rule. Deprecated in favor of rule_type string rule = 5 [deprecated=true]; - string rule_type = 6; - string rule_name = 7; + + // rule_type is the type of the rule to filter on. + // This is optional. + string rule_type = 6 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-/[:word:]]*$" + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; + + // rule_name is the name of the rule to filter on. + // This is optional. + string rule_name = 7 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-/'()[:word:] :]*$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; } message GetProfileStatusByNameResponse { // profile_status is the status of the profile - ProfileStatus profile_status = 1; + ProfileStatus profile_status = 1 [ + (google.api.field_behavior) = REQUIRED + ]; // rule_evaluation_status is the status of the rules repeated RuleEvaluationStatus rule_evaluation_status = 2; @@ -1459,7 +1935,9 @@ message GetProfileStatusByProjectRequest { message GetProfileStatusByProjectResponse { // profile_status is the status of the profile - repeated ProfileStatus profile_status = 1; + repeated ProfileStatus profile_status = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } // Entity defines the entity that is supported by the provider. @@ -1484,7 +1962,9 @@ message EntityAutoRegistrationConfig { // and undefined so for the "let's not auto-register anything" case we'd just let the repeated string empty message AutoRegistration { // enabled is the list of entities that are enabled for auto-registration. - map entities = 1; + map entities = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } // ProviderConfig contains the generic configuration for a provider. @@ -1557,20 +2037,40 @@ message Context { // buf compatibility checks. // name of the provider - optional string provider = 1; - // ID of the project - optional string project = 3; + optional string provider = 1 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-[:word:]]*$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; + // ID of the project. If empty or unset, will select the user's default project + // if they only have one project. + optional string project = 3 [ + (buf.validate.field).string = {uuid: true}, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; optional string retired_organization = 2; } // ContextV2 defines the context in which a rule is evaluated. message ContextV2 { - // project is the project ID - string project_id = 1; + // project is the project ID. If empty or unset, will select the user's default project + // if they only have one project. + string project_id = 1 [ + (buf.validate.field).string = {uuid: true}, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // name of the provider. Set to empty string when not applicable. - string provider = 2; + string provider = 2 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-[:word:]]*$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; } // --- START RuleType CRUD definitions @@ -1584,7 +2084,9 @@ message ListRuleTypesRequest { // ListRuleTypesResponse is the response to list rule types. message ListRuleTypesResponse { // rule_types is the list of rule types. - repeated RuleType rule_types = 1; + repeated RuleType rule_types = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } // GetRuleTypeByNameRequest is the request to get a rule type by name. @@ -1592,13 +2094,21 @@ message GetRuleTypeByNameRequest { // context is the context in which the rule type is evaluated. Context context = 1; // name is the name of the rule type. - string name = 2; + string name = 2 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-/[:word:]]*$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; } // GetRuleTypeByNameResponse is the response to get a rule type by name. message GetRuleTypeByNameResponse { // rule_type is the rule type. - RuleType rule_type = 1; + RuleType rule_type = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } // GetRuleTypeByIdRequest is the request to get a rule type by id. @@ -1606,39 +2116,52 @@ message GetRuleTypeByIdRequest { // context is the context in which the rule type is evaluated. Context context = 1; // id is the id of the rule type. - string id = 2; + string id = 2 [ + (buf.validate.field).string = {uuid: true}, + (google.api.field_behavior) = REQUIRED + ]; } // GetRuleTypeByIdResponse is the response to get a rule type by id. message GetRuleTypeByIdResponse { // rule_type is the rule type. - RuleType rule_type = 1; + RuleType rule_type = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } // CreateRuleTypeRequest is the request to create a rule type. message CreateRuleTypeRequest { // rule_type is the rule type to be created. - RuleType rule_type = 1; + RuleType rule_type = 1 [ + (google.api.field_behavior) = REQUIRED + ]; reserved 2; // deprecated context } // CreateRuleTypeResponse is the response to create a rule type. message CreateRuleTypeResponse { // rule_type is the rule type that was created. - RuleType rule_type = 1; + RuleType rule_type = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } // UpdateRuleTypeRequest is the request to update a rule type. message UpdateRuleTypeRequest { // rule_type is the rule type to be updated. - RuleType rule_type = 2; + RuleType rule_type = 2 [ + (google.api.field_behavior) = REQUIRED + ]; reserved 3; // deprecated context } // UpdateRuleTypeResponse is the response to update a rule type. message UpdateRuleTypeResponse { // rule_type is the rule type that was updated. - RuleType rule_type = 1; + RuleType rule_type = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } // DeleteRuleTypeRequest is the request to delete a rule type. @@ -1646,7 +2169,10 @@ message DeleteRuleTypeRequest { // context is the context in which the rule type is evaluated. Context context = 1; // id is the id of the rule type to be deleted. - string id = 2; + string id = 2 [ + (buf.validate.field).string = {uuid: true}, + (google.api.field_behavior) = REQUIRED + ]; } // DeleteRuleTypeResponse is the response to delete a rule type. @@ -1666,13 +2192,25 @@ message ListEvaluationResultsRequest { // an empty label_filter. oneof profile_selector { // ID can contain either a profile name or an ID - string profile = 2; + string profile = 2 [ + (buf.validate.field).string = { + pattern: "^([[:alnum:]][-[:word:]]*)?$" + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // Filter profiles to only those matching the specified labels. // // The default is to return all user-created profiles; the string "*" can // be used to select all profiles, including system profiles. This syntax // may be expanded in the future. - string label_filter = 3; + string label_filter = 3 [ + (buf.validate.field).string = { + pattern: "^(\\*|[a-zA-Z][a-zA-Z0-9_]*)$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; } // If set, only return evaluation results for the named entities. @@ -1681,7 +2219,17 @@ message ListEvaluationResultsRequest { // If set, only return evaluation results for the named rules. // If empty, return evaluation results for all rules - repeated string rule_name = 5; + repeated string rule_name = 5 [ + (buf.validate.field).repeated = { + items: { + string: { + pattern: "^[A-Za-z][-/[:word:]]*$", + max_len: 200, + } + } + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; } message ListEvaluationResultsResponse { @@ -1703,7 +2251,9 @@ message ListEvaluationResultsResponse { } // Each entity selected by the list request will have _single_ entry in entities which contains results of all evaluations for each profile. - repeated EntityEvaluationResults entities = 2; + repeated EntityEvaluationResults entities = 2 [ + (google.api.field_behavior) = REQUIRED + ]; } // --- END EvaluationResults definitions @@ -1714,28 +2264,66 @@ message ListEvaluationResultsResponse { // This is used to fetch data from a REST endpoint. message RestType { message Fallback { - int32 http_code = 1; - string body = 2; + int32 http_code = 1 [(buf.validate.field).int32 = { gte: 100, lte: 599 }]; + // This is expected to be a valid JSON string. + string body = 2 [ + (buf.validate.field).string = { + max_len: 1000, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; } // endpoint is the endpoint to fetch data from. - // This can be a URL or the path on the API.bool + // This can be a URL or path on the API. // This is a required field and must be set. // This is also evaluated via a template which allows // us dynamically fill in the values. - string endpoint = 1; + string endpoint = 1 [ + (buf.validate.field).string = { + max_len: 400, + }, + (google.api.field_behavior) = REQUIRED + ]; // method is the method to use to fetch data. - string method = 2; + string method = 2 [ + (buf.validate.field).string = { + pattern: '^(?i)(GET|POST|PUT|PATCH|DELETE)$' + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // headers are the headers to be sent to the endpoint. - repeated string headers = 3; + repeated string headers = 3 [ + (buf.validate.field).repeated = { + items: { + string: { + pattern: "^[a-zA-Z0-9-]+:[[:graph:][:blank:]]+$", + max_len: 400, + } + } + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // body is the body to be sent to the endpoint. - optional string body = 4; + // This is expected to be a valid JSON string. + optional string body = 4 [ + (buf.validate.field).string = { + max_len: 1000, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // parse is the parsing mechanism to be used to parse the data. - string parse = 5; + string parse = 5 [ + (buf.validate.field).string = { + pattern: "^[a-z_]+$", + max_len: 50, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // fallback provides a body that the ingester would return in case // the REST call returns a non-200 status code. @@ -1754,19 +2342,43 @@ message ArtifactType { // GitType defines the git data ingester. message GitType { // clone_url is the url of the git repository. - string clone_url = 1; + string clone_url = 1 [ + (buf.validate.field).string = { + uri: true, + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // branch is the branch of the git repository. - string branch = 2; + string branch = 2 [ + (buf.validate.field).string = { + pattern: "^[[:word:]./-]+$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; } // DiffType defines the diff data ingester. message DiffType { message Ecosystem { // name is the name of the ecosystem. - string name = 1; + string name = 1 [ + (buf.validate.field).string = { + pattern: "^[a-z]+(_[a-z]+)*$", + min_len: 1, + max_len: 200, + } + ]; // depfile is the file that contains the dependencies for this ecosystem - string depfile = 2; + string depfile = 2 [ + (buf.validate.field).string = { + pattern: "^(\\./)?([a-zA-Z0-9_\\-]+/)*[a-zA-Z0-9_\\-]+(\\.[a-zA-Z0-9]+)?$", + min_len: 1, + max_len: 200, + } + ]; } // ecosystems is the list of ecosystems to be used @@ -1776,7 +2388,44 @@ message DiffType { // type is the type of diff ingestor to use. // The default is "dep" which will leverage // the ecosystems array. - string type = 2; + string type = 2 [ + (buf.validate.field).string = { + pattern: "^[a-z]+(_[a-z]+)*$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; +} + +// DepsType defines the "deps" ingester which can extract depndencies in protobom +// format for rule evaluation. +message DepsType { + // branch is the branch of the git repository, when applied to repository entities. + // Has no meaning or effect on other entity types. + message RepoConfigs { + string branch = 1 [ + (buf.validate.field).string = { + pattern: "^[[:word:]./-]+$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; + } + + message PullRequestConfigs { + // filter is the filter to apply to the PRs. The default value is "NEW_AND_UPDATED". + string filter = 1 [ + (buf.validate.field).string = { + in: ["NEW_AND_UPDATED", "NEW_ONLY"], + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; + } + + oneof entity_type { + RepoConfigs repo = 1; + PullRequestConfigs pr = 2; + } } // Severity defines the severity of the rule. @@ -1821,23 +2470,51 @@ enum RuleTypeReleasePhase { // The version is assumed from the folder's version. message RuleType { // version is the version of the rule type API. - string version = 11; + string version = 11 [ + (buf.validate.field).string = { + pattern: "^v\\d$", + } + ]; // type is the type of the rule. - string type = 12; + string type = 12 [ + (buf.validate.field).string = { + pattern: "rule-type", + } + ]; // id is the id of the rule type. // This is mostly optional and is set by the server. - optional string id = 1; + optional string id = 1 [ + (buf.validate.field).string = {uuid: true}, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // name is the name of the rule type. - string name = 2; + string name = 2 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-/[:word:]]*$", + max_len: 200, + }, + (google.api.field_behavior) = REQUIRED + ]; // display_name is the display name of the rule type. - string display_name = 8; + string display_name = 8 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-/'()[:word:] :]*$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // short_failure_message is the message to display when the evaluation fails. - string short_failure_message = 10; + string short_failure_message = 10 [ + (buf.validate.field).string = { + max_len: 400, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // context is the context in which the rule is evaluated. Context context = 3; @@ -1846,7 +2523,13 @@ message RuleType { message Definition { // in_entity is the entity in which the rule is evaluated. // This can be repository, build_environment or artifact. - string in_entity = 1; + string in_entity = 1 [ + (buf.validate.field).string = { + pattern: "^[a-z]+(_[a-z]+)*$", + min_len: 1, + max_len: 200, + } + ]; // rule_schema is the schema of the rule. This is expressed in JSON Schema. google.protobuf.Struct rule_schema = 2; @@ -1859,7 +2542,17 @@ message RuleType { message Ingest { // type is the type of the data ingestion. // we currently support rest, artifact and builtin. - string type = 1; + string type = 1 [ + (buf.validate.field).string = { + in: ["rest", "artifact", "builtin", "git", "diff", "deps"], + }, + (google.api.field_behavior) = REQUIRED + ]; + + // NOTE: we should have used the "oneof" feature here rather than + // having both a string "type" and a series of optional messages. + // We can consider fixing this in a V2 API, but it's probably too + // to do in V1. // rest is the rest data ingestion. // this is only used if the type is rest. @@ -1869,36 +2562,60 @@ message RuleType { optional BuiltinType builtin = 4; // artifact is the artifact data ingestion. + // artifact currently only applies to artifacts. optional ArtifactType artifact = 5; // git is the git data ingestion. + // git currently only applies to repositories. optional GitType git = 6; // diff is the diff data ingestion. + // diff currently only applies to pull_requests. optional DiffType diff = 7; + + // deps is the deps data ingestion. + // deps currently only applies to repositories. + optional DepsType deps = 8; } - Ingest ingest = 4; + Ingest ingest = 4 [ + (google.api.field_behavior) = REQUIRED + ]; // Eval defines the data evaluation definition. // This pertains to the way we traverse data from the upstream // endpoint and how we compare it to the rule. message Eval { // type is the type of the data evaluation. - // Right now only `jq` is supported as a driver - string type = 1; + string type = 1 [ + (buf.validate.field).string = { + in: ["jq", "rego", "vulncheck", "trusty", "homoglyphs"], + }, + (google.api.field_behavior) = REQUIRED + ]; message JQComparison { message Operator { - string def = 1; + string def = 1 [ + (buf.validate.field).string = { + pattern: "^\\.[a-zA-Z_]+(\\.[a-zA-Z_]+|\\[\\d+]|\\[\"[a-zA-Z_]+\"\\])*$", + min_len: 1, + max_len: 200, + }, + (google.api.field_behavior) = REQUIRED + ]; } // Ingested points to the data retrieved in the `ingest` section - Operator ingested = 1; + Operator ingested = 1 [ + (google.api.field_behavior) = REQUIRED + ]; // Profile points to the profile itself. + // This is mutually exclusive with the `constant` field. Operator profile = 2; - // Constant points to a constant value + // Constant points to a constant value. + // This is mutually exclusive with the `profile` field. google.protobuf.Value constant = 3; } @@ -1913,14 +2630,28 @@ message RuleType { // allow access by default and deny access only if a // violation is found. It expects the profile to set a // `violations` variable with a "msg" field. - string type = 1; + string type = 1 [ + (buf.validate.field).string = { + pattern: "^[a-z]+([_-][a-z]+)*$", + min_len: 1, + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // def is the definition of the rego profile. - string def = 2; + string def = 2 [ + (google.api.field_behavior) = REQUIRED + ]; // how are violations reported. This is only used if the // `constraints` type is selected. The default is `text` // which returns human-readable text. The other option is // `json` which returns a JSON array containing the violations. - optional string violation_format = 3; + optional string violation_format = 3 [ + (buf.validate.field).string = { + in: ["text", "json"], + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; } message Vulncheck { @@ -1930,11 +2661,20 @@ message RuleType { message Trusty { // This is no longer used, but is still here for backwards // compatibility with existing stored rules - string endpoint = 1; + string endpoint = 1 [ + (buf.validate.field).string = { + uri: true, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; } message Homoglyphs { - string type = 1; + string type = 1 [ + (buf.validate.field).string = { + in: ["invisible_characters", "mixed_scripts"] + } + ]; } // jq is only used if the `jq` type is selected. @@ -1954,48 +2694,117 @@ message RuleType { // homoglyphs is only used if the `homoglyphs` type is selected. optional Homoglyphs homoglyphs = 6; + + // Data sources that the rule refers to. These are used to + // instantiate the relevant data sources for the rule and keep + // track of them as dependencies. + // + // Note that the data source must exist in the project hierarchy + // in order to be used in the rule. + repeated DataSourceReference data_sources = 7; } - Eval eval = 5; + Eval eval = 5 [ + (google.api.field_behavior) = REQUIRED + ]; message Remediate { - string type = 1; + string type = 1 [ + (buf.validate.field).string = { + in: ["rest", "gh_branch_protection", "pull_request"], + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; message GhBranchProtectionType { - string patch = 1; + string patch = 1 [ + (buf.validate.field).string = { + max_len: 1000, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; } // the name stutters a bit but we already use a PullRequest message for handling PR entities message PullRequestRemediation { message Content { // the file to patch - string path = 1; + string path = 1 [ + (buf.validate.field).string = { + min_len: 1, + max_len: 200, + } + ]; // how to patch the file. For now, only replace is supported - string action = 2; + string action = 2 [ + (buf.validate.field).string = { + in: ["replace"], + min_len: 1, + max_len: 50, + } + ]; // the content of the file string content = 4; // the GIT mode of the file. Not UNIX mode! String because the GH API also uses strings // the usual modes are: 100644 for regular files, 100755 for executable files and // 040000 for submodules (which we don't use but now you know the meaning of the 1 in 100644) // see e.g. https://github.com/go-git/go-git/blob/32e0172851c35ae2fac495069c923330040903d2/plumbing/filemode/filemode.go#L16 - optional string mode = 3; + optional string mode = 3 [ + (buf.validate.field).string = { + pattern: "^\\d+$", + max_len: 6, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; } message ActionsReplaceTagsWithSha { // List of actions to exclude from the replacement - repeated string exclude = 1; + repeated string exclude = 1 [ + (buf.validate.field).repeated = { + items: { + string: { + pattern: "^\\.?([[:word:].-]+\\/)*[[:word:].-]+(?:\\.[[:alnum:]]+)?$", + max_len: 200, + } + } + } + ]; } // the title of the PR - string title = 1; + // This is not validated here as it will be validated by the repository provider, i.e. GitHub upon + // creation of the PR. + string title = 1 [ + (buf.validate.field).string = { + min_len: 1, + max_len: 75, + } + ]; // the body of the PR - string body = 2; + // This is not validated here as it will be validated by the repository provider, i.e. GitHub upon + // creation of the PR. + string body = 2 [ + (buf.validate.field).string = { + min_len: 1, + max_len: 65536, + } + ]; repeated Content contents = 3; // the method to use to create the PR. For now, these are supported: // -- minder.content - ensures that the content of the file is exactly as specified // refer to the Content message for more details // -- minder.actions.replace_tags_with_sha - finds any github actions within a workflow // file and replaces the tag with the SHA - string method = 4; + // -- minder.yq.evaluate - evaluates a yq expression on a file + string method = 4 [ + (buf.validate.field).string = { + in: ["minder.content", "minder.actions.replace_tags_with_sha", "minder.yq.evaluate"], + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; + // params are unstructured parameters passed to the method. These are optional + // and evaluated by the method. + google.protobuf.Struct params = 6; // If the method is minder.actions.replace_tags_with_sha, this is the configuration // for that method @@ -2009,24 +2818,60 @@ message RuleType { Remediate remediate = 6; message Alert { - string type = 1; + string type = 1 [ + (buf.validate.field).string = { + in: ["security_advisory", "pull_request_comment"], + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; message AlertTypeSA { - string severity = 1; + string severity = 1 [ + (buf.validate.field).string = { + in: ["unknown", "info", "low", "medium", "high", "critical"], + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; } optional AlertTypeSA security_advisory = 2; + + message AlertTypePRComment { + string review_message = 1 [ + (buf.validate.field).string = { + max_len: 65536, + }, + (google.api.field_behavior) = REQUIRED + ]; + } + optional AlertTypePRComment pull_request_comment = 3; } Alert alert = 7; } // def is the definition of the rule type. - Definition def = 4; + Definition def = 4 [ + (google.api.field_behavior) = REQUIRED + ]; // description is the description of the rule type. - string description = 5; + // This is expected to be a valid markdown formatted string. + string description = 5 [ + (buf.validate.field).string = { + min_len: 1, + max_len: 1000, + }, + (google.api.field_behavior) = REQUIRED + ]; // guidance are instructions we give the user in case a rule fails. - string guidance = 6; + // This is expected to be a valid markdown formatted string. + string guidance = 6 [ + (buf.validate.field).string = { + min_len: 1, + max_len: 1000, + }, + (google.api.field_behavior) = REQUIRED + ]; // severity is the severity of the rule type. Severity severity = 7; @@ -2036,16 +2881,26 @@ message RuleType { } // Profile defines a profile that is user defined. +// All fields are optional because we want to allow partial updates. message Profile { // context is the context in which the profile is evaluated. Context context = 1; // id is the id of the profile. // This is optional and is set by the system. - optional string id = 2; + optional string id = 2 [ + (buf.validate.field).string = {uuid: true}, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // name is the name of the profile instance. - string name = 3; + string name = 3 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-/[:word:]]*$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // labels are a set of system-provided attributes which can be used to // filter profiles and status results. Labels cannot be set by the user, @@ -2059,12 +2914,31 @@ message Profile { // // DNS_STR = "[a-zA-Z0-9](?[-a-zA-Z0-9]{0,61}[a-zA-Z0-9])?" // ($DNS_STR:)?$DNS_STR - repeated string labels = 12; + repeated string labels = 12 [ + (buf.validate.field) = { + repeated: { + items: { + string: { + // DNS label constraints extended to allow for underscores + pattern: "^([a-zA-Z0-9_]([-a-zA-Z0-9_]{0,61}[a-zA-Z0-9_])?:)?[a-zA-Z0-9_]([-a-zA-Z0-9_]{0,61}[a-zA-Z0-9_])?$" + } + }, + unique: true + } + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // Rule defines the individual call of a certain rule type. message Rule { // type is the type of the rule to be instantiated. - string type = 1; + string type = 1 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-/[:word:]]*$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // params are the parameters that are passed to the rule. // This is optional and depends on the rule type. google.protobuf.Struct params = 2; @@ -2073,7 +2947,13 @@ message Profile { google.protobuf.Struct def = 3; // name is the descriptive name of the rule, not to be confused with type - string name = 4; + string name = 4 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-/'()[:word:] :]*$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; } // These are the entities that one could set in the profile. @@ -2090,33 +2970,75 @@ message Profile { // id is optional and use for updates to match upserts as well as read operations. It is ignored for creates. string id = 1; // entity is the entity to select. - string entity = 2; + string entity = 2 [ + (buf.validate.field).string = { + pattern: "^[a-z]+(_[a-z]+)*$", + min_len: 1, + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // expr is the expression to select the entity. - string selector = 4; + string selector = 4 [ + (buf.validate.field).string = { + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; reserved 5; reserved "comment"; // description is the human-readable description of the selector. - string description = 6; + string description = 6 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-/.!?,:;'[:word:] ]*$", + max_len: 1000, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; } repeated Selector selection = 14; // whether and how to remediate (on,off,dry_run) // this is optional and defaults to "off" - optional string remediate = 8; + optional string remediate = 8 [ + (buf.validate.field).string = { + in: ["on", "off", "dry_run"] + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // whether and how to alert (on,off,dry_run) // this is optional and defaults to "on" - optional string alert = 9; + optional string alert = 9 [ + (buf.validate.field).string = { + in: ["on", "off", "dry_run"] + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // type is a placeholder for the object type. It should always be set to "profile". - string type = 10; + string type = 10 [ + (buf.validate.field).string = { + pattern: "profile", + } + ]; // version is the version of the profile type. In this case, it is "v1" - string version = 11; + string version = 11 [ + (buf.validate.field).string = { + pattern: "^v\\d$", + } + ]; // display_name is the display name of the profile. - string display_name = 13; + string display_name = 13 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-/'()[:word:] :]*$", + max_len: 1000, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; } message ListProjectsRequest { @@ -2124,7 +3046,9 @@ message ListProjectsRequest { } message ListProjectsResponse { - repeated Project projects = 1; + repeated Project projects = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message CreateProjectRequest { @@ -2132,12 +3056,20 @@ message CreateProjectRequest { Context context = 1; // name is the name of the project to create. - string name = 2; + string name = 2 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-/[:word:]]*$", + max_len: 200, + }, + (google.api.field_behavior) = REQUIRED + ]; } message CreateProjectResponse { // project is the project that was created. - Project project = 1; + Project project = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message DeleteProjectRequest { @@ -2147,7 +3079,9 @@ message DeleteProjectRequest { message DeleteProjectResponse { // project_id is the id of the project that was deleted. - string project_id = 1; + string project_id = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message UpdateProjectRequest { @@ -2155,23 +3089,53 @@ message UpdateProjectRequest { Context context = 1; // display_name is the display name of the project to update. - string display_name = 2; + // This is optional. + string display_name = 2 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-/'()[:word:] :]*$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // description is the description of the project to update. - string description = 3; + // This is optional. + string description = 3 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-/.!?,:;'[:word:] ]*$", + min_len: 0, + max_len: 1000, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; } message UpdateProjectResponse { // project is the project that was updated. - Project project = 1; + Project project = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message ProjectPatch { // display_name is the display name of the project to update. - optional string display_name = 1; + optional string display_name = 1 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-/'()[:word:] :]*$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // description is the description of the project to update. - optional string description = 2; + optional string description = 2 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-/.!?,:;'[:word:] ]*$", + min_len: 0, + max_len: 1000, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; } message PatchProjectRequest { @@ -2188,7 +3152,9 @@ message PatchProjectRequest { message PatchProjectResponse { // project is the project that was updated. - Project project = 1; + Project project = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message ListChildProjectsRequest { @@ -2200,12 +3166,16 @@ message ListChildProjectsRequest { } message ListChildProjectsResponse { - repeated Project projects = 1; + repeated Project projects = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message CreateEntityReconciliationTaskRequest { // entity is the entity to be reconciled. - EntityTypedId entity = 1; + EntityTypedId entity = 1 [ + (google.api.field_behavior) = REQUIRED + ]; // context is the context in which the entity reconciliation task is created. Context context = 2; @@ -2220,7 +3190,9 @@ message ListRolesRequest { } message ListRolesResponse { - repeated Role roles = 1; + repeated Role roles = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message ListRoleAssignmentsRequest { @@ -2231,27 +3203,34 @@ message ListRoleAssignmentsRequest { message ListRoleAssignmentsResponse { // role_assignments contains permission grants which have been accepted // by a user. - repeated RoleAssignment role_assignments = 1; + repeated RoleAssignment role_assignments = 1 [ + (google.api.field_behavior) = REQUIRED + ]; // invitations contains outstanding role invitations which have not yet // been accepted by a user. - repeated Invitation invitations = 2; + repeated Invitation invitations = 2 [ + (google.api.field_behavior) = REQUIRED + ]; } message AssignRoleRequest { // context is the context in which the role assignment is evaluated. Context context = 1; // role_assignment is the role assignment to be created. - RoleAssignment role_assignment = 2; + RoleAssignment role_assignment = 2 [ + (google.api.field_behavior) = REQUIRED + ]; } message AssignRoleResponse { // role_assignment is the role assignment that was created. + // This is optional. RoleAssignment role_assignment = 1; // invitation contains the details of the invitation for the // assigned user to join the project if the user is not already - // a member. + // a member. This is optional. Invitation invitation = 2; } @@ -2260,12 +3239,29 @@ message UpdateRoleRequest { Context context = 1; // subject is the account to change permissions for. // The account must already have permissions on the project - string subject = 2; + string subject = 2 [ + (buf.validate.field).string = {uuid: true}, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // All subject roles are _replaced_ with the following role assignments. Must be non-empty, // use RemoveRole to remove permissions entirely from the project. - repeated string roles = 4; + repeated string roles = 4 [ + (buf.validate.field).repeated = { + items: { + string: { + pattern: "^[a-z]+(_[a-z]+)*$", + min_len: 1, + max_len: 200, + } + } + }, + (google.api.field_behavior) = REQUIRED + ]; // email is the email address of the subject used for updating invitations - string email = 5; + string email = 5 [ + (buf.validate.field) = {string: {email: true}}, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; reserved 3; // deprecated repeated string role = 3; reserved "role"; @@ -2283,7 +3279,9 @@ message RemoveRoleRequest { // context is the context in which the role assignment is evaluated. Context context = 1; // role_assignment is the role assignment to be removed. - RoleAssignment role_assignment = 2; + RoleAssignment role_assignment = 2 [ + (google.api.field_behavior) = REQUIRED + ]; } message RemoveRoleResponse { @@ -2295,28 +3293,68 @@ message RemoveRoleResponse { message Role { // name is the name of the role. - string name = 1; + string name = 1 [ + (google.api.field_behavior) = REQUIRED + ]; // display name of the role - string display_name = 3; + string display_name = 3 [ + (google.api.field_behavior) = REQUIRED + ]; // description is the description of the role. - string description = 2; + string description = 2 [ + (google.api.field_behavior) = REQUIRED + ]; } message RoleAssignment { // role is the role that is assigned. - string role = 1; + string role = 1 [ + (buf.validate.field).string = { + pattern: "^[a-z]+(_[a-z]+)*$", + min_len: 1, + max_len: 200, + }, + (google.api.field_behavior) = REQUIRED + ]; // subject is the subject to which the role is assigned. - string subject = 2; + string subject = 2 [ + (buf.validate.field).string = {uuid: true}, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // display_name is the display name of the subject. - string display_name = 5; + string display_name = 5 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-/'()[:word:] :]*$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // project is the project in which the role is assigned. - optional string project = 4; + optional string project = 4 [ + (buf.validate.field).string = {uuid: true}, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // email is the email address of the subject used for invitations. - string email = 6; + string email = 6 [ + (buf.validate.field) = {string: {email: true}}, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // first_name is the first name of the subject. - string first_name = 7; + string first_name = 7 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][- [:word:]\\[\\]\\(\\)]*$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // last_name is the last name of the subject. - string last_name = 8; + string last_name = 8 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][- [:word:]\\[\\]\\(\\)]*$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; reserved 3; // deprecated context } @@ -2325,12 +3363,20 @@ message ListInvitationsRequest { } message ListInvitationsResponse { - repeated Invitation invitations = 1; + repeated Invitation invitations = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message ResolveInvitationRequest { // code is the code of the invitation to resolve. - string code = 1; + string code = 1 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z0-9_-]+$", + len: 64, + }, + (google.api.field_behavior) = REQUIRED + ]; // accept is true if the invitation is accepted, false if it is rejected. bool accept = 2; } @@ -2338,28 +3384,39 @@ message ResolveInvitationRequest { message ResolveInvitationResponse { // role is the role that would be assigned if the user // accepts the invitation. - string role = 1; + string role = 1 [ + (google.api.field_behavior) = REQUIRED + ]; // email is the email address of the invited user. string email = 2; // project is the project to which the user is invited. - string project = 3; + string project = 3 [ + (google.api.field_behavior) = REQUIRED + ]; // is_accepted is the status of the invitation. - bool is_accepted = 4; + bool is_accepted = 4 [ + (google.api.field_behavior) = REQUIRED + ]; // project_display is the display name of the project to which the user // is invited. string project_display = 5; } +// Invitation is an invitation to join a project. This is only used in responses. message Invitation { // role is the role that would be assigned if the user // accepts the invitation. - string role = 1; + string role = 1 [ + (google.api.field_behavior) = REQUIRED + ]; // email is the email address of the invited user. This is // presented as a convenience for display purposes, and does // not affect who can accept the invitation using the code. string email = 2; // project is the project to which the user is invited. - string project = 3; + string project = 3 [ + (google.api.field_behavior) = REQUIRED + ]; // code is a unique identifier for the invitation, which can // be used by the recipient to accept or reject the invitation. @@ -2393,12 +3450,20 @@ message GetProviderRequest { // context is the context in which the provider is evaluated. Context context = 1; // name is the name of the provider to get. - string name = 2; + string name = 2 [ + (buf.validate.field).string = { + pattern: "^[-[:word:]]*$", + max_len: 200, + }, + (google.api.field_behavior) = REQUIRED + ]; } message GetProviderResponse { // provider is the provider that was retrieved. - Provider provider = 1; + Provider provider = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message ListProvidersRequest { @@ -2406,14 +3471,25 @@ message ListProvidersRequest { Context context = 1; // limit is the maximum number of providers to return. - int32 limit = 2; + // 0 uses a server-defined default. + int32 limit = 2 [ + (buf.validate.field).int32 = {gte: 0, lte: 100}, + (google.api.field_behavior) = REQUIRED + ]; // cursor is the cursor to use for the page of results, empty if at the beginning - string cursor = 3; + string cursor = 3 [ + (buf.validate.field).string = { + pattern: "^[[:word:]=]*$", + max_len: 200, + } + ]; } message ListProvidersResponse { - repeated Provider providers = 1; + repeated Provider providers = 1 [ + (google.api.field_behavior) = REQUIRED + ]; // cursor is the cursor to use for the next page of results, empty if at the end string cursor = 2; @@ -2423,12 +3499,16 @@ message CreateProviderRequest { // context is the context in which the provider is created. Context context = 1; // provider is the provider to be created. - Provider provider = 2; + Provider provider = 2 [ + (google.api.field_behavior) = REQUIRED + ]; } message CreateProviderResponse { // provider is the provider that was created. - Provider provider = 1; + Provider provider = 1 [ + (google.api.field_behavior) = REQUIRED + ]; // authorization provides additional authorization information needed // to complete the initialization of the provider. @@ -2438,36 +3518,33 @@ message CreateProviderResponse { message DeleteProviderRequest { // context is the context in which the provider is deleted. Both // project and provider are required in this context. - Context context = 1; + Context context = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message DeleteProviderResponse { // name is the name of the provider that was deleted - string name = 1; + string name = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message DeleteProviderByIDRequest { // context is the context in which the provider is deleted. Only the project is required in this context. Context context = 1; // id is the id of the provider to delete - string id = 2; + string id = 2 [ + (buf.validate.field).string = {uuid: true}, + (google.api.field_behavior) = REQUIRED + ]; } message DeleteProviderByIDResponse { // id is the id of the provider that was deleted - string id = 1; -} - -message GetUnclaimedProvidersRequest { - // context is the context in which the set of providers are evaluated. - Context context = 1; -} - -message GetUnclaimedProvidersResponse { - // providers is a set of parameters which can be supplied to allow the user - // to assign existing unclaimed credentials to a new provider in the project - // via CreateProvider(). - repeated ProviderParameter providers = 1; + string id = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message ListProviderClassesRequest { @@ -2477,18 +3554,26 @@ message ListProviderClassesRequest { message ListProviderClassesResponse { // provider_classes is the list of provider classes. - repeated string provider_classes = 1; + repeated string provider_classes = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message PatchProviderRequest { - Context context = 1; + // context is the context in which the provider is updated. + // The provider name is required in this context. + Context context = 1 [ + (google.api.field_behavior) = REQUIRED + ]; Provider patch = 2; google.protobuf.FieldMask update_mask = 3; } message PatchProviderResponse { - Provider provider = 1; + Provider provider = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } message AuthorizationParams { @@ -2507,7 +3592,10 @@ message ProviderParameter { message GitHubAppParams { // The GitHub installation ID for the app. On create, this is the only // parameter used; the organization parameters are ignored. - int64 installation_id = 1; + int64 installation_id = 1 [ + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE, + (buf.validate.field).int64 = {gt: 0} + ]; // The GitHub organization slug where the app is installed. This is an // output-only parameter, and is validated on input if set (i.e. the value @@ -2516,7 +3604,10 @@ message GitHubAppParams { // The GitHub organization ID where the app is installed. This is an // output-only parameter, and is validated on input if set (i.e. the value // must be either empty or match the org of the installation_id). - int64 organization_id = 3; + int64 organization_id = 3 [ + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE, + (buf.validate.field).int64 = {gt: 0} + ]; } // ProviderTrait is the type of the provider. @@ -2553,16 +3644,36 @@ enum CredentialsState { CREDENTIALS_STATE_NOT_APPLICABLE = 3 [(name) = "not_applicable"]; } +// Provider represents a provider that is used to interact with external systems. +// All fields are optional because we want to allow partial updates. message Provider { // name is the name of the provider. - string name = 1; + string name = 1 [ + (buf.validate.field).string = { + pattern: "^[A-Za-z][-[:word:]]*$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // class is the name of the provider implementation, eg. 'github' or 'gh-app'. - string class = 7; + string class = 7 [ + (buf.validate.field).string = { + pattern: "^[a-z][a-z0-9_-]*$", + max_len: 200, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // project is the project where the provider is. This is ignored on input // in favor of the context field in CreateProviderRequest. string project = 2; // version is the version of the provider. - string version = 3; + // if unset, "v1" is assumed. + string version = 3 [ + (buf.validate.field).string = { + pattern: "v1", + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // implements is the list of interfaces that the provider implements. repeated ProviderType implements = 4; @@ -2579,11 +3690,20 @@ message Provider { // credentials_state is the state of the credentials for the provider. // This is an output-only field. It may be: "set", "unset", "not_applicable". string credentials_state = 9; + + // id is the unique identifier of the provider. + string id = 10 [ + (buf.validate.field).string = {uuid: true}, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; } // GetEvaluationHistoryRequest represents a request for the GetEvaluationHistory endpoint message GetEvaluationHistoryRequest { - string id = 1; + string id = 1 [ + (buf.validate.field).string = {uuid: true}, + (google.api.field_behavior) = REQUIRED + ]; Context context = 2; } @@ -2597,23 +3717,100 @@ message ListEvaluationHistoryRequest { Context context = 1; // List of entity types to retrieve. - repeated string entity_type = 2; + repeated string entity_type = 2 [ + (buf.validate.field).repeated = { + items: { + string: { + pattern: "^[,[:word:]]*$", + max_len: 200, + } + } + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // List of entity names to retrieve. - repeated string entity_name = 3; + repeated string entity_name = 3 [ + (buf.validate.field).repeated = { + items: { + string: { + pattern: "^[,-./[:word:]]*$", + max_len: 200, + } + } + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // List of profile names to retrieve. - repeated string profile_name = 4; + repeated string profile_name = 4 [ + (buf.validate.field).repeated = { + items: { + string: { + pattern: "^[A-Za-z][-/[:word:]]*$", + max_len: 200, + } + } + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // List of evaluation statuses to retrieve. - repeated string status = 5; + repeated string status = 5 [ + (buf.validate.field).repeated = { + items: { + string: { + pattern: "^[,[:word:]]*$", + max_len: 200, + } + } + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // List of remediation statuses to retrieve. - repeated string remediation = 6; + repeated string remediation = 6 [ + (buf.validate.field).repeated = { + items: { + string: { + pattern: "^[,[:word:]]*$", + max_len: 200, + } + } + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // List of alert statuses to retrieve. - repeated string alert = 7; + repeated string alert = 7 [ + (buf.validate.field).repeated = { + items: { + string: { + pattern: "^[,[:word:]]*$", + max_len: 200, + } + } + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; // Timestamp representing the start time of the selection window. google.protobuf.Timestamp from = 8; // Timestamp representing the end time of the selection window. google.protobuf.Timestamp to = 9; - // Cursor object to select the "page" of data to retrieve. + // Filter evaluation history to only those matching the specified labels. + // + // The default is to return all user-created profiles; the string "*" can + // be used to select all profiles, including system profiles. This syntax + // may be expanded in the future. + repeated string label_filter = 11 [ + (buf.validate.field).repeated = { + items: { + string: { + pattern: "^(\\*|[a-z][a-z0-9_]*)$", + max_len: 200, + }, + }, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; + + // Cursor object to select the "page" of data to retrieve. This is optional. Cursor cursor = 10; } @@ -2621,7 +3818,9 @@ message ListEvaluationHistoryRequest { // GetEvaluationHistory RPC. message GetEvaluationHistoryResponse { // The requested record - EvaluationHistory evaluation = 1; + EvaluationHistory evaluation = 1 [ + (google.api.field_behavior) = REQUIRED + ]; } // ListEvaluationHistoryResponse represents a response message for the @@ -2631,74 +3830,110 @@ message GetEvaluationHistoryResponse { // the next and/or previous pages of data. message ListEvaluationHistoryResponse { // List of records retrieved. - repeated EvaluationHistory data = 1; + repeated EvaluationHistory data = 1 [ + (google.api.field_behavior) = REQUIRED + ]; // Metadata of the current page and pointers to next and/or // previous pages. CursorPage page = 2; } +// EvaluationHistory represents the history of an entity evaluation. +// This is only used in responses. message EvaluationHistory { // entity contains details of the entity which was evaluated. - EvaluationHistoryEntity entity = 1; + EvaluationHistoryEntity entity = 1 [ + (google.api.field_behavior) = REQUIRED + ]; // rule contains details of the rule which the entity was evaluated against. - EvaluationHistoryRule rule = 2; + EvaluationHistoryRule rule = 2 [ + (google.api.field_behavior) = REQUIRED + ]; // status contains the evaluation status. - EvaluationHistoryStatus status = 3; + EvaluationHistoryStatus status = 3 [ + (google.api.field_behavior) = REQUIRED + ]; // alert contains details of the alerts for this evaluation. + // This is optional. EvaluationHistoryAlert alert = 4; // remediation contains details of the remediation for this evaluation. + // This is optional. EvaluationHistoryRemediation remediation = 5; // created_at is the timestamp of creation of this evaluation - google.protobuf.Timestamp evaluated_at = 6; + google.protobuf.Timestamp evaluated_at = 6 [ + (google.api.field_behavior) = REQUIRED + ]; // id is the unique identifier of the evaluation. - string id = 7; + string id = 7 [ + (google.api.field_behavior) = REQUIRED + ]; } message EvaluationHistoryEntity { // id is the unique identifier of the entity. - string id = 1; + string id = 1 [ + (google.api.field_behavior) = REQUIRED + ]; // type is the entity type. - Entity type = 2; + Entity type = 2 [ + (google.api.field_behavior) = REQUIRED + ]; // name is the entity name. - string name = 3; + string name = 3 [ + (google.api.field_behavior) = REQUIRED + ]; } message EvaluationHistoryRule { // name is the name of the rule instance. - string name = 1; + string name = 1 [ + (google.api.field_behavior) = REQUIRED + ]; // type is the name of the rule type. - string rule_type = 2; + string rule_type = 2 [ + (google.api.field_behavior) = REQUIRED + ]; // profile is the name of the profile which contains the rule. - string profile = 3; + string profile = 3 [ + (google.api.field_behavior) = REQUIRED + ]; // severity is the severity of the rule type. - Severity severity = 4; + Severity severity = 4 [ + (google.api.field_behavior) = REQUIRED + ]; } message EvaluationHistoryStatus { // status is one of (success, error, failure, skipped) // not using enums to mirror the behaviour of the existing API contracts. - string status = 1; + string status = 1 [ + (google.api.field_behavior) = REQUIRED + ]; // details contains optional details about the evaluation. // the structure and contents are rule type specific, and are subject to change. - string details = 2; + string details = 2 [ + (google.api.field_behavior) = REQUIRED + ]; } message EvaluationHistoryRemediation { // status is one of (success, error, failure, skipped, not available) // not using enums to mirror the behaviour of the existing API contracts. - string status = 1; + string status = 1 [ + (google.api.field_behavior) = REQUIRED + ]; // details contains optional details about the remediation. // the structure and contents are remediation specific, and are subject to change. @@ -2708,13 +3943,16 @@ message EvaluationHistoryRemediation { message EvaluationHistoryAlert { // status is one of (on, off, error, skipped, not available) // not using enums to mirror the behaviour of the existing API contracts. - string status = 1; + string status = 1 [ + (google.api.field_behavior) = REQUIRED + ]; // details contains optional details about the alert. // the structure and contents are alert specific, and are subject to change. string details = 2; } +// used for parsing resources in ruletypes message EntityInstance { // id is the unique identifier of the entity. string id = 1; @@ -2752,3 +3990,190 @@ message UpstreamEntityRef { // be stored in Minder. google.protobuf.Struct properties = 3; } + +// DataSource is a Data source instance. Data sources represent +// external integrations that enrich the data in Minder, but do not +// have explicit lifecycle objects (entities). Integrations which +// create entities are called Providers. +message DataSource { + // version is the version of the data source API. + string version = 1 [ + (buf.validate.field).string = { + pattern: "^v\\d$", + }, + (google.api.field_behavior) = REQUIRED + ]; + + // type is the data source type + string type = 2 [ + (buf.validate.field).string = { + in: ["data-source"], + max_len: 12, + } + ]; + + // context is the context in which the data source is evaluated. + // Note that in this case we only need the project in the + // context, since data sources are not provider-specific. + ContextV2 context = 3; + + // name is the name of the data source. + // Note that this is unique within a project hierarchy. + // Names must be lowercase and can only contain letters, numbers, + // hyphens, and underscores. + string name = 4 [ + (buf.validate.field).string = { + pattern: "^[a-z][-_[:word:]]*$", + max_len: 200, + }, + (google.api.field_behavior) = REQUIRED + ]; + + // id is the unique identifier of the data source. + string id = 5 [ + (buf.validate.field).string = {uuid: true}, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE, + (google.api.field_behavior) = OUTPUT_ONLY + ]; + + oneof driver { + // structured is the structired data - data source. + StructDataSource structured = 8; + // rest is the REST data source driver. + RestDataSource rest = 6; + } +} + +// StructDataSource is the structured data source driver. +message StructDataSource { + message Def { + // Path is the path specification for the structured data source. + Path path = 1 [ + (google.api.field_behavior) = REQUIRED + ]; + + message Path { + string file_name = 1; + repeated string alternatives = 2 [ + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; + } + } + + // defs is the list of definitions for the structured data API. + map def = 1; +} + +// RestDataSource is the REST data source driver. +message RestDataSource { + message Def { + // endpoint is the URL of the REST API. Note that endpoints are + // templates that can be parameterized with variables. Parametrization + // is done using RFC 6570. + string endpoint = 1 [ + (buf.validate.field).string = { + pattern: "^https?://.*$", + max_len: 800, + }, + (google.api.field_behavior) = REQUIRED + ]; + + // method is the HTTP method to use for the request. + // If left unset, it will default to "GET". + string method = 2 [ + (buf.validate.field).string = { + in: ["GET", "POST", "PUT", "PATCH", "DELETE"] + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; + + // headers is a map of headers to send with the request. + map headers = 3; + + oneof body { + // body is the body of the request. + google.protobuf.Struct bodyobj = 4; + // bodystr is the body of the request as a string. + string bodystr = 5 [ + (buf.validate.field).string = { + max_len: 1000, + } + ]; + + // body_from_field is the field in the input to use as the body. + // If the value is an string, it will be used as the body, as is. + // If the value is an object, it will be serialized as JSON. + // If the value is not found in the input, the request will fail. + string body_from_field = 10 [ + (buf.validate.field).string = { + // We're assuming fairly short field names here. + max_len: 50, + } + ]; + } + + // parse is the parse configuration for the response. + // This allows us to serialize the response into a structured format, + // or not. + // If left unset, the response will be treated as a string. + // If set to "json", the response will be parsed as JSON. + string parse = 6 [ + (buf.validate.field).string = { + in: ["json"] + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; + + message Fallback { + int32 http_status = 1 [ + (buf.validate.field).int32 = {gte: 100, lte: 599}, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; + + string body = 2 [ + (buf.validate.field).string = { + max_len: 1000, + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; + } + + // fallback is the fallback configuration for the response in case + // of an unexpected status code. + repeated Fallback fallback = 7; + + // expected_status is the expected status code for the response. + // This may be repeated to allow for multiple expected status codes. + // If left unset, it will default to 200. + repeated int32 expected_status = 8 [ + (buf.validate.field).repeated = { + items: { + int32: { + gte: 100, + lte: 599, + } + } + }, + (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE + ]; + + // input_schema is the schema for the input to the REST API. + google.protobuf.Struct input_schema = 9; + } + + // defs is the list of definitions for the REST API. + map def = 1; +} + +// DataSourceReference is a reference to a data source. +// Note that for a resource to refer to a data source the data source must +// be available in the same project hierarchy. +message DataSourceReference { + // refer to a data source by name. + string name = 1 [ + (buf.validate.field).string = { + pattern: "^[a-z][-_[:word:]]*$", + max_len: 200, + } + ]; +} diff --git a/tools/go.mod b/tools/go.mod index 56da047426..b51dbf83ff 100644 --- a/tools/go.mod +++ b/tools/go.mod @@ -1,50 +1,51 @@ module github.com/mindersec/minder/tools -go 1.23.1 +go 1.23.4 require ( - github.com/bufbuild/buf v1.45.0 + github.com/bufbuild/buf v1.48.0 github.com/daixiang0/gci v0.13.5 - github.com/deepmap/oapi-codegen/v2 v2.2.0 github.com/go-critic/go-critic v0.11.5 - github.com/golangci/golangci-lint v1.61.0 + github.com/golangci/golangci-lint v1.63.1 github.com/gotesttools/gotestfmt/v2 v2.5.0 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 - github.com/mikefarah/yq/v4 v4.44.3 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 + github.com/mikefarah/yq/v4 v4.44.6 github.com/norwoodj/helm-docs v1.14.2 - github.com/openfga/cli v0.6.1 + github.com/oapi-codegen/oapi-codegen/v2 v2.4.1 + github.com/openfga/cli v0.6.2 github.com/pseudomuto/protoc-gen-doc v1.5.1 github.com/sqlc-dev/sqlc v1.27.0 go.uber.org/mock v0.5.0 golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 - golang.org/x/tools v0.26.0 + golang.org/x/tools v0.28.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 - google.golang.org/protobuf v1.35.1 + google.golang.org/protobuf v1.36.1 mvdan.cc/gofumpt v0.7.0 ) require ( 4d63.com/gocheckcompilerdirectives v1.2.1 // indirect 4d63.com/gochecknoglobals v0.2.1 // indirect - buf.build/gen/go/bufbuild/bufplugin/protocolbuffers/go v1.34.2-20240928190436-5e8abcfd7a7e.2 // indirect - buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.34.2-20240920164238-5a7b106cbb87.2 // indirect - buf.build/gen/go/bufbuild/registry/connectrpc/go v1.17.0-20240925012807-1610ffa05635.1 // indirect - buf.build/gen/go/bufbuild/registry/protocolbuffers/go v1.34.2-20240925012807-1610ffa05635.2 // indirect - buf.build/gen/go/pluginrpc/pluginrpc/protocolbuffers/go v1.34.2-20240828222655-5345c0a56177.2 // indirect - buf.build/go/bufplugin v0.5.0 // indirect - buf.build/go/protoyaml v0.2.0 // indirect + buf.build/gen/go/bufbuild/bufplugin/protocolbuffers/go v1.36.0-20241031151143-70f632351282.1 // indirect + buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.0-20241127180247-a33202765966.1 // indirect + buf.build/gen/go/bufbuild/registry/connectrpc/go v1.17.0-20241210175624-28487aef65cd.1 // indirect + buf.build/gen/go/bufbuild/registry/protocolbuffers/go v1.36.0-20241210175624-28487aef65cd.1 // indirect + buf.build/gen/go/pluginrpc/pluginrpc/protocolbuffers/go v1.36.0-20241007202033-cf42259fcbfc.1 // indirect + buf.build/go/bufplugin v0.6.0 // indirect + buf.build/go/protoyaml v0.3.1 // indirect buf.build/go/spdx v0.2.0 // indirect + cel.dev/expr v0.19.1 // indirect connectrpc.com/connect v1.17.0 // indirect connectrpc.com/otelconnect v0.7.1 // indirect filippo.io/edwards25519 v1.1.0 // indirect - github.com/4meepo/tagalign v1.3.4 // indirect - github.com/Abirdcfly/dupword v0.1.1 // indirect - github.com/Antonboom/errname v0.1.13 // indirect - github.com/Antonboom/nilnil v0.1.9 // indirect - github.com/Antonboom/testifylint v1.4.3 // indirect + github.com/4meepo/tagalign v1.4.1 // indirect + github.com/Abirdcfly/dupword v0.1.3 // indirect + github.com/Antonboom/errname v1.0.0 // indirect + github.com/Antonboom/nilnil v1.0.1 // indirect + github.com/Antonboom/testifylint v1.5.2 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c // indirect - github.com/Crocmagnon/fatcontext v0.5.2 // indirect + github.com/Crocmagnon/fatcontext v0.5.3 // indirect github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect @@ -53,79 +54,82 @@ require ( github.com/Masterminds/sprig v2.15.0+incompatible // indirect github.com/Masterminds/sprig/v3 v3.2.3 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/Microsoft/hcsshim v0.12.7 // indirect + github.com/Microsoft/hcsshim v0.12.9 // indirect github.com/OpenPeeDeeP/depguard/v2 v2.2.0 // indirect github.com/a8m/envsubst v1.4.2 // indirect - github.com/alecthomas/go-check-sumtype v0.1.4 // indirect + github.com/alecthomas/go-check-sumtype v0.3.1 // indirect github.com/alecthomas/participle/v2 v2.1.1 // indirect - github.com/alexkohler/nakedret/v2 v2.0.4 // indirect + github.com/alexkohler/nakedret/v2 v2.0.5 // indirect github.com/alexkohler/prealloc v1.0.0 // indirect github.com/alingse/asasalint v0.0.11 // indirect + github.com/alingse/nilnesserr v0.1.1 // indirect github.com/antlr4-go/antlr/v4 v4.13.1 // indirect github.com/aokoli/goutils v1.0.1 // indirect github.com/ashanbrown/forbidigo v1.6.0 // indirect - github.com/ashanbrown/makezero v1.1.1 // indirect + github.com/ashanbrown/makezero v1.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bkielbasa/cyclop v1.2.1 // indirect + github.com/bkielbasa/cyclop v1.2.3 // indirect github.com/blizzy78/varnamelen v0.8.0 // indirect - github.com/bombsimon/wsl/v4 v4.4.1 // indirect - github.com/breml/bidichk v0.2.7 // indirect - github.com/breml/errchkjson v0.3.6 // indirect + github.com/bombsimon/wsl/v4 v4.5.0 // indirect + github.com/breml/bidichk v0.3.2 // indirect + github.com/breml/errchkjson v0.4.0 // indirect github.com/bufbuild/protocompile v0.14.1 // indirect github.com/bufbuild/protoplugin v0.0.0-20240911180120-7bb73e41a54a // indirect - github.com/bufbuild/protovalidate-go v0.7.2 // indirect - github.com/butuzov/ireturn v0.3.0 // indirect - github.com/butuzov/mirror v1.2.0 // indirect + github.com/bufbuild/protovalidate-go v0.8.0 // indirect + github.com/butuzov/ireturn v0.3.1 // indirect + github.com/butuzov/mirror v1.3.0 // indirect github.com/catenacyber/perfsprint v0.7.1 // indirect github.com/ccojocar/zxcvbn-go v1.0.2 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/charithe/durationcheck v0.0.10 // indirect github.com/chavacava/garif v0.1.0 // indirect - github.com/ckaznocha/intrange v0.2.0 // indirect - github.com/containerd/cgroups/v3 v3.0.3 // indirect - github.com/containerd/containerd v1.7.22 // indirect - github.com/containerd/continuity v0.4.3 // indirect - github.com/containerd/errdefs v0.2.0 // indirect + github.com/ckaznocha/intrange v0.3.0 // indirect + github.com/containerd/cgroups/v3 v3.0.5 // indirect + github.com/containerd/containerd v1.7.24 // indirect + github.com/containerd/continuity v0.4.5 // indirect + github.com/containerd/errdefs v1.0.0 // indirect + github.com/containerd/errdefs/pkg v0.3.0 // indirect github.com/containerd/log v0.1.0 // indirect github.com/containerd/platforms v0.2.1 // indirect - github.com/containerd/stargz-snapshotter/estargz v0.15.1 // indirect - github.com/containerd/ttrpc v1.2.5 // indirect - github.com/containerd/typeurl/v2 v2.2.0 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect + github.com/containerd/stargz-snapshotter/estargz v0.16.3 // indirect + github.com/containerd/ttrpc v1.2.6 // indirect + github.com/containerd/typeurl/v2 v2.2.3 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect github.com/cristalhq/acmd v0.12.0 // indirect github.com/cubicdaiya/gonp v1.0.4 // indirect - github.com/curioswitch/go-reassign v0.2.0 // indirect + github.com/curioswitch/go-reassign v0.3.0 // indirect github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/denis-tingaikin/go-header v0.5.0 // indirect github.com/dimchansky/utfbom v1.1.1 // indirect github.com/distribution/reference v0.6.0 // indirect - github.com/docker/cli v27.3.1+incompatible // indirect + github.com/docker/cli v27.4.1+incompatible // indirect github.com/docker/distribution v2.8.3+incompatible // indirect - github.com/docker/docker v27.3.1+incompatible // indirect + github.com/docker/docker v27.4.1+incompatible // indirect github.com/docker/docker-credential-helpers v0.8.2 // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect + github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/elliotchance/orderedmap v1.6.0 // indirect + github.com/elliotchance/orderedmap v1.7.0 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/envoyproxy/protoc-gen-validate v1.1.0 // indirect github.com/ettle/strcase v0.2.0 // indirect - github.com/fatih/color v1.17.0 // indirect + github.com/fatih/color v1.18.0 // indirect github.com/fatih/structtag v1.2.0 // indirect github.com/felixge/fgprof v0.9.5 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/firefart/nonamedreturns v1.0.5 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/fzipp/gocyclo v0.6.0 // indirect - github.com/getkin/kin-openapi v0.124.0 // indirect - github.com/ghostiam/protogetter v0.3.6 // indirect - github.com/go-chi/chi/v5 v5.1.0 // indirect + github.com/getkin/kin-openapi v0.127.0 // indirect + github.com/ghostiam/protogetter v0.3.8 // indirect + github.com/go-chi/chi/v5 v5.2.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-openapi/jsonpointer v0.20.2 // indirect - github.com/go-openapi/swag v0.22.8 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect github.com/go-sql-driver/mysql v1.8.1 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/go-toolsmith/astcast v1.1.0 // indirect @@ -136,27 +140,27 @@ require ( github.com/go-toolsmith/pkgload v1.2.2 // indirect github.com/go-toolsmith/strparse v1.1.0 // indirect github.com/go-toolsmith/typep v1.1.0 // indirect - github.com/go-viper/mapstructure/v2 v2.1.0 // indirect - github.com/go-xmlfmt/xmlfmt v1.1.2 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/go-xmlfmt/xmlfmt v1.1.3 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1 // indirect github.com/goccy/go-json v0.10.3 // indirect - github.com/goccy/go-yaml v1.12.0 // indirect + github.com/goccy/go-yaml v1.13.0 // indirect github.com/gofrs/flock v0.12.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect - github.com/golangci/gofmt v0.0.0-20240816233607-d8596aa466a9 // indirect + github.com/golangci/go-printf-func-name v0.1.0 // indirect + github.com/golangci/gofmt v0.0.0-20241223200906-057b0627d9b9 // indirect github.com/golangci/misspell v0.6.0 // indirect - github.com/golangci/modinfo v0.3.4 // indirect github.com/golangci/plugin-module-register v0.1.1 // indirect github.com/golangci/revgrep v0.5.3 // indirect github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed // indirect - github.com/google/cel-go v0.21.0 // indirect + github.com/google/cel-go v0.22.1 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-containerregistry v0.20.2 // indirect - github.com/google/pprof v0.0.0-20241001023024-f4c0cfd0cf1d // indirect + github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect github.com/google/uuid v1.6.0 // indirect github.com/gordonklaus/ineffassign v0.1.0 // indirect github.com/gostaticanalysis/analysisutil v0.7.1 // indirect @@ -166,6 +170,7 @@ require ( github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-immutable-radix/v2 v2.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect @@ -174,34 +179,35 @@ require ( github.com/huandu/xstrings v1.4.0 // indirect github.com/imdario/mergo v0.3.13 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/invopop/yaml v0.2.0 // indirect + github.com/invopop/yaml v0.3.1 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 // indirect - github.com/jackc/pgx/v5 v5.6.0 // indirect - github.com/jackc/puddle/v2 v2.2.1 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgx/v5 v5.7.1 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/jdx/go-netrc v1.0.0 // indirect github.com/jgautheron/goconst v1.7.1 // indirect github.com/jingyugao/rowserrcheck v1.1.1 // indirect github.com/jinzhu/copier v0.4.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af // indirect - github.com/jjti/go-spancheck v0.6.2 // indirect + github.com/jjti/go-spancheck v0.6.4 // indirect github.com/josharian/intern v1.0.0 // indirect - github.com/julz/importas v0.1.0 // indirect + github.com/julz/importas v0.2.0 // indirect github.com/karamaru-alpha/copyloopvar v1.1.0 // indirect - github.com/karlseguin/ccache/v3 v3.0.5 // indirect - github.com/kisielk/errcheck v1.7.0 // indirect + github.com/karlseguin/ccache/v3 v3.0.6 // indirect + github.com/kisielk/errcheck v1.8.0 // indirect github.com/kkHAIKE/contextcheck v1.1.5 // indirect - github.com/klauspost/compress v1.17.10 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/klauspost/pgzip v1.2.6 // indirect github.com/kulti/thelper v0.6.3 // indirect github.com/kunwardeep/paralleltest v1.0.10 // indirect github.com/kyoh86/exportloopref v0.1.11 // indirect - github.com/lasiar/canonicalheader v1.1.1 // indirect - github.com/ldez/gomoddirectives v0.2.4 // indirect - github.com/ldez/tagliatelle v0.5.0 // indirect + github.com/lasiar/canonicalheader v1.1.2 // indirect + github.com/ldez/exptostd v0.3.0 // indirect + github.com/ldez/gomoddirectives v0.6.0 // indirect + github.com/ldez/grignotin v0.7.0 // indirect + github.com/ldez/tagliatelle v0.7.1 // indirect + github.com/ldez/usetesting v0.4.1 // indirect github.com/leonklingele/grouper v1.1.2 // indirect - github.com/lufeee/execinquery v1.2.1 // indirect github.com/macabu/inamedparam v0.1.3 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect @@ -210,8 +216,8 @@ require ( github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.9 // indirect - github.com/mgechev/revive v1.3.9 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mgechev/revive v1.5.1 // indirect github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect @@ -240,18 +246,18 @@ require ( github.com/ncruces/go-strftime v0.1.9 // indirect github.com/nishanths/exhaustive v0.12.0 // indirect github.com/nishanths/predeclared v0.2.2 // indirect - github.com/nunnatsa/ginkgolinter v0.16.2 // indirect + github.com/nunnatsa/ginkgolinter v0.18.4 // indirect github.com/nwidger/jsoncolor v0.3.2 // indirect github.com/oklog/ulid/v2 v2.1.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/onsi/ginkgo/v2 v2.20.2 // indirect + github.com/onsi/ginkgo/v2 v2.22.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/opencontainers/runtime-spec v1.2.0 // indirect - github.com/openfga/api/proto v0.0.0-20240807201305-c96ec773cae9 // indirect - github.com/openfga/go-sdk v0.6.0 // indirect - github.com/openfga/language/pkg/go v0.2.0-beta.0 // indirect - github.com/openfga/openfga v1.6.0 // indirect + github.com/openfga/api/proto v0.0.0-20241107182745-c14fb4b3d4b4 // indirect + github.com/openfga/go-sdk v0.6.3 // indirect + github.com/openfga/language/pkg/go v0.2.0-beta.2.0.20241021130006-9791fa1db4ec // indirect + github.com/openfga/openfga v1.8.0 // indirect github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect github.com/pganalyze/pg_query_go/v5 v5.1.0 // indirect @@ -263,10 +269,10 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/pkg/profile v1.7.0 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/polyfloyd/go-errorlint v1.6.0 // indirect - github.com/prometheus/client_golang v1.20.2 // indirect + github.com/polyfloyd/go-errorlint v1.7.0 // indirect + github.com/prometheus/client_golang v1.20.5 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.55.0 // indirect + github.com/prometheus/common v0.60.1 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/pseudomuto/protokit v0.2.0 // indirect github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1 // indirect @@ -275,54 +281,59 @@ require ( github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect github.com/quic-go/qpack v0.5.1 // indirect - github.com/quic-go/quic-go v0.47.0 // indirect + github.com/quic-go/quic-go v0.48.2 // indirect + github.com/raeperd/recvcheck v0.2.0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/riza-io/grpc-go v0.2.0 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/rs/cors v1.11.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/ryancurrah/gomodguard v1.3.5 // indirect github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect github.com/sagikazarmark/locafero v0.6.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect - github.com/sanposhiho/wastedassign/v2 v2.0.7 // indirect - github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect + github.com/sanposhiho/wastedassign/v2 v2.1.0 // indirect + github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 // indirect github.com/sashamelentyev/interfacebloat v1.1.0 // indirect - github.com/sashamelentyev/usestdlibvars v1.27.0 // indirect - github.com/schollz/progressbar/v3 v3.14.6 // indirect - github.com/securego/gosec/v2 v2.21.2 // indirect + github.com/sashamelentyev/usestdlibvars v1.28.0 // indirect + github.com/schollz/progressbar/v3 v3.17.1 // indirect + github.com/securego/gosec/v2 v2.21.4 // indirect github.com/segmentio/asm v1.2.0 // indirect - github.com/segmentio/encoding v0.4.0 // indirect + github.com/segmentio/encoding v0.4.1 // indirect github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect github.com/shopspring/decimal v1.3.1 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/sivchari/containedctx v1.0.3 // indirect - github.com/sivchari/tenv v1.10.0 // indirect - github.com/sonatard/noctx v0.0.2 // indirect + github.com/sivchari/tenv v1.12.1 // indirect + github.com/sonatard/noctx v0.1.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/sourcegraph/go-diff v0.7.0 // indirect + github.com/speakeasy-api/openapi-overlay v0.9.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.7.0 // indirect github.com/spf13/cobra v1.8.1 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/viper v1.19.0 // indirect github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect - github.com/stbenjam/no-sprintf-host-port v0.1.1 // indirect + github.com/stbenjam/no-sprintf-host-port v0.2.0 // indirect github.com/stoewer/go-strcase v1.3.0 // indirect github.com/stretchr/objx v0.5.2 // indirect - github.com/stretchr/testify v1.9.0 // indirect + github.com/stretchr/testify v1.10.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect - github.com/tdakkota/asciicheck v0.2.0 // indirect - github.com/tetafro/godot v1.4.17 // indirect - github.com/tetratelabs/wazero v1.8.1 // indirect - github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 // indirect - github.com/timonwong/loggercheck v0.9.4 // indirect - github.com/tomarrell/wrapcheck/v2 v2.9.0 // indirect + github.com/tdakkota/asciicheck v0.3.0 // indirect + github.com/tetafro/godot v1.4.20 // indirect + github.com/tetratelabs/wazero v1.8.2 // indirect + github.com/timakin/bodyclose v0.0.0-20241017074812-ed6a65f985e3 // indirect + github.com/timonwong/loggercheck v0.10.1 // indirect + github.com/tomarrell/wrapcheck/v2 v2.10.0 // indirect github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect - github.com/ultraware/funlen v0.1.0 // indirect - github.com/ultraware/whitespace v0.1.1 // indirect - github.com/uudashr/gocognit v1.1.3 // indirect + github.com/ultraware/funlen v0.2.0 // indirect + github.com/ultraware/whitespace v0.2.0 // indirect + github.com/uudashr/gocognit v1.2.0 // indirect + github.com/uudashr/iface v1.3.0 // indirect github.com/vbatts/tar-split v0.11.6 // indirect + github.com/vmware-labs/yaml-jsonpath v0.3.2 // indirect github.com/wasilibs/go-pgquery v0.0.0-20240606042535-c0843d6592cc // indirect github.com/wasilibs/wazero-helpers v0.0.0-20240604052452-61d7981e9a38 // indirect github.com/xen0n/gosmopolitan v1.2.2 // indirect @@ -331,40 +342,40 @@ require ( github.com/ykadowak/zerologlint v0.1.5 // indirect github.com/yuin/gopher-lua v1.1.1 // indirect gitlab.com/bosi/decorder v0.4.2 // indirect - go-simpler.org/musttag v0.12.2 // indirect + go-simpler.org/musttag v0.13.0 // indirect go-simpler.org/sloglint v0.7.2 // indirect go.lsp.dev/jsonrpc2 v0.10.0 // indirect go.lsp.dev/pkg v0.0.0-20210717090340-384b27a52fb2 // indirect go.lsp.dev/protocol v0.12.0 // indirect go.lsp.dev/uri v0.3.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 // indirect - go.opentelemetry.io/otel v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 // indirect - go.opentelemetry.io/otel/metric v1.30.0 // indirect - go.opentelemetry.io/otel/sdk v1.30.0 // indirect - go.opentelemetry.io/otel/trace v1.30.0 // indirect - go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 // indirect + go.opentelemetry.io/otel v1.33.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.33.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.33.0 // indirect + go.opentelemetry.io/proto/otlp v1.4.0 // indirect go.uber.org/atomic v1.11.0 // indirect - go.uber.org/automaxprocs v1.5.3 // indirect + go.uber.org/automaxprocs v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - go.uber.org/zap/exp v0.1.1-0.20240913022758-ede8e1888f83 // indirect - golang.org/x/crypto v0.28.0 // indirect - golang.org/x/exp v0.0.0-20241004190924-225e2abe05e6 // indirect - golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f // indirect - golang.org/x/mod v0.21.0 // indirect - golang.org/x/net v0.30.0 // indirect - golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.26.0 // indirect - golang.org/x/term v0.25.0 // indirect - golang.org/x/text v0.19.0 // indirect - golang.org/x/time v0.6.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240930140551-af27646dc61f // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240930140551-af27646dc61f // indirect - google.golang.org/grpc v1.67.1 // indirect + go.uber.org/zap/exp v0.3.0 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 // indirect + golang.org/x/exp/typeparams v0.0.0-20241108190413-2d47ceb2692f // indirect + golang.org/x/mod v0.22.0 // indirect + golang.org/x/net v0.33.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect + gonum.org/v1/gonum v0.15.1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241219192143-6b3ec007d9bb // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241219192143-6b3ec007d9bb // indirect + google.golang.org/grpc v1.69.2 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 // indirect @@ -376,7 +387,7 @@ require ( modernc.org/libc v1.55.3 // indirect modernc.org/mathutil v1.6.0 // indirect modernc.org/memory v1.8.0 // indirect - modernc.org/sqlite v1.31.1 // indirect + modernc.org/sqlite v1.33.1 // indirect modernc.org/strutil v1.2.0 // indirect modernc.org/token v1.1.0 // indirect mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f // indirect diff --git a/tools/go.sum b/tools/go.sum index f18e69f154..16128ca959 100644 --- a/tools/go.sum +++ b/tools/go.sum @@ -2,22 +2,24 @@ 4d63.com/gocheckcompilerdirectives v1.2.1/go.mod h1:yjDJSxmDTtIHHCqX0ufRYZDL6vQtMG7tJdKVeWwsqvs= 4d63.com/gochecknoglobals v0.2.1 h1:1eiorGsgHOFOuoOiJDy2psSrQbRdIHrlge0IJIkUgDc= 4d63.com/gochecknoglobals v0.2.1/go.mod h1:KRE8wtJB3CXCsb1xy421JfTHIIbmT3U5ruxw2Qu8fSU= -buf.build/gen/go/bufbuild/bufplugin/protocolbuffers/go v1.34.2-20240928190436-5e8abcfd7a7e.2 h1:BQVQ0fcYgqpe6F/2ZPJUR1rTN+nwdrj2z7IAbAu9XAQ= -buf.build/gen/go/bufbuild/bufplugin/protocolbuffers/go v1.34.2-20240928190436-5e8abcfd7a7e.2/go.mod h1:B+9TKHRYqoAUW57pLjhkLOnBCu0DQYMV+f7imQ9nXwI= -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.34.2-20240920164238-5a7b106cbb87.2 h1:hl0FrmGlNpQZIGvU1/jDz0lsPDd0BhCE0QDRwPfLZcA= -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.34.2-20240920164238-5a7b106cbb87.2/go.mod h1:ylS4c28ACSI59oJrOdW4pHS4n0Hw4TgSPHn8rpHl4Yw= -buf.build/gen/go/bufbuild/registry/connectrpc/go v1.17.0-20240925012807-1610ffa05635.1 h1:p4A9QnhBrKjCquBt1mKqfO37QseLwgWqQp+Wb9ZjasE= -buf.build/gen/go/bufbuild/registry/connectrpc/go v1.17.0-20240925012807-1610ffa05635.1/go.mod h1:7WtU+waNF+dyxDsuNaqmG3d0w3y2poNju8cvun1/jLs= -buf.build/gen/go/bufbuild/registry/protocolbuffers/go v1.34.2-20240925012807-1610ffa05635.2 h1:3sSS9z8k6zVe7rNNt9R6DN2fOFBVClEflmICIjbXwms= -buf.build/gen/go/bufbuild/registry/protocolbuffers/go v1.34.2-20240925012807-1610ffa05635.2/go.mod h1:psseUmlKRo9v5LZJtR/aTpdTLuyp9o3X7rnLT87SZEo= -buf.build/gen/go/pluginrpc/pluginrpc/protocolbuffers/go v1.34.2-20240828222655-5345c0a56177.2 h1:oSi+Adw4xvIjXrW8eY8QGR3sBdfWeY5HN/RefnRt52M= -buf.build/gen/go/pluginrpc/pluginrpc/protocolbuffers/go v1.34.2-20240828222655-5345c0a56177.2/go.mod h1:GjH0gjlY/ns16X8d6eaXV2W+6IFwsO5Ly9WVnzyd1E0= -buf.build/go/bufplugin v0.5.0 h1:pmK1AloAMp+4woH5hEisK9qVmDdLySzIKexUUVZLJ2Q= -buf.build/go/bufplugin v0.5.0/go.mod h1:r7Y8tpqpErLtUXUecEgwAHnjihY03YbN0IaBFNJF/x0= -buf.build/go/protoyaml v0.2.0 h1:2g3OHjtLDqXBREIOjpZGHmQ+U/4mkN1YiQjxNB68Ip8= -buf.build/go/protoyaml v0.2.0/go.mod h1:L/9QvTDkTWcDTzAL6HMfN+mYC6CmZRm2KnsUA054iL0= +buf.build/gen/go/bufbuild/bufplugin/protocolbuffers/go v1.36.0-20241031151143-70f632351282.1 h1:FXEFgDFrBYuXjn3twNRo/t80qSbdKmkfZSgR2JGTuyk= +buf.build/gen/go/bufbuild/bufplugin/protocolbuffers/go v1.36.0-20241031151143-70f632351282.1/go.mod h1:/bPD5uslGsdRKBeVavIK7D7yr+3ISI0OoyUOkokSJTA= +buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.0-20241127180247-a33202765966.1 h1:ntAj16eF7AtUyzOOAFk5gvbAO52QmUKPKk7GmsIEORo= +buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.0-20241127180247-a33202765966.1/go.mod h1:AxRT+qTj5PJCz2nyQzsR/qxAcveW5USRhJTt/edTO5w= +buf.build/gen/go/bufbuild/registry/connectrpc/go v1.17.0-20241210175624-28487aef65cd.1 h1:x8cCitPNXODGzWbfApZMFc4ALtRe5LZJmTdAkNqk62A= +buf.build/gen/go/bufbuild/registry/connectrpc/go v1.17.0-20241210175624-28487aef65cd.1/go.mod h1:kDOQd1sZ0wRp33hvCTQeaz9KprnHNfJ+a8dcIQ/6+0k= +buf.build/gen/go/bufbuild/registry/protocolbuffers/go v1.36.0-20241210175624-28487aef65cd.1 h1:NOuNS+nCp3xc4CALIC7sNz7irT63UMcYAfofrxurUfE= +buf.build/gen/go/bufbuild/registry/protocolbuffers/go v1.36.0-20241210175624-28487aef65cd.1/go.mod h1:NeX3YCZgM9E/wNp9e3g/9u5bu8/OPntr7K0ygUlgrDE= +buf.build/gen/go/pluginrpc/pluginrpc/protocolbuffers/go v1.36.0-20241007202033-cf42259fcbfc.1 h1:HuK77NuzllXrJNgB+lAtnG2dKrB7WAjd9QQ+n0zTQHc= +buf.build/gen/go/pluginrpc/pluginrpc/protocolbuffers/go v1.36.0-20241007202033-cf42259fcbfc.1/go.mod h1:BLQCnWbu3tZcKQfbU1f5ysbRk55FDFwOvjlyzN+uLXg= +buf.build/go/bufplugin v0.6.0 h1:3lhoh+0z+IUPS3ZajTPn/27LaLIkero2BDVnV7yXD1s= +buf.build/go/bufplugin v0.6.0/go.mod h1:hWCjxxv24xdR6F5pNlQavZV2oo0J3uF4Ff1XEoyV6vU= +buf.build/go/protoyaml v0.3.1 h1:ucyzE7DRnjX+mQ6AH4JzN0Kg50ByHHu+yrSKbgQn2D4= +buf.build/go/protoyaml v0.3.1/go.mod h1:0TzNpFQDXhwbkXb/ajLvxIijqbve+vMQvWY/b3/Dzxg= buf.build/go/spdx v0.2.0 h1:IItqM0/cMxvFJJumcBuP8NrsIzMs/UYjp/6WSpq8LTw= buf.build/go/spdx v0.2.0/go.mod h1:bXdwQFem9Si3nsbNy8aJKGPoaPi5DKwdeEp5/ArZ6w8= +cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4= +cel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= connectrpc.com/connect v1.17.0 h1:W0ZqMhtVzn9Zhn2yATuUokDLO5N+gIuBWMOnsQrfmZk= connectrpc.com/connect v1.17.0/go.mod h1:0292hj1rnx8oFrStN7cB4jjVBeqs+Yx5yDIC2prWDO8= @@ -25,25 +27,25 @@ connectrpc.com/otelconnect v0.7.1 h1:scO5pOb0i4yUE66CnNrHeK1x51yq0bE0ehPg6WvzXJY connectrpc.com/otelconnect v0.7.1/go.mod h1:dh3bFgHBTb2bkqGCeVVOtHJreSns7uu9wwL2Tbz17ms= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/4meepo/tagalign v1.3.4 h1:P51VcvBnf04YkHzjfclN6BbsopfJR5rxs1n+5zHt+w8= -github.com/4meepo/tagalign v1.3.4/go.mod h1:M+pnkHH2vG8+qhE5bVc/zeP7HS/j910Fwa9TUSyZVI0= -github.com/Abirdcfly/dupword v0.1.1 h1:Bsxe0fIw6OwBtXMIncaTxCLHYO5BB+3mcsR5E8VXloY= -github.com/Abirdcfly/dupword v0.1.1/go.mod h1:B49AcJdTYYkpd4HjgAcutNGG9HZ2JWwKunH9Y2BA6sM= +github.com/4meepo/tagalign v1.4.1 h1:GYTu2FaPGOGb/xJalcqHeD4il5BiCywyEYZOA55P6J4= +github.com/4meepo/tagalign v1.4.1/go.mod h1:2H9Yu6sZ67hmuraFgfZkNcg5Py9Ch/Om9l2K/2W1qS4= +github.com/Abirdcfly/dupword v0.1.3 h1:9Pa1NuAsZvpFPi9Pqkd93I7LIYRURj+A//dFd5tgBeE= +github.com/Abirdcfly/dupword v0.1.3/go.mod h1:8VbB2t7e10KRNdwTVoxdBaxla6avbhGzb8sCTygUMhw= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= -github.com/Antonboom/errname v0.1.13 h1:JHICqsewj/fNckzrfVSe+T33svwQxmjC+1ntDsHOVvM= -github.com/Antonboom/errname v0.1.13/go.mod h1:uWyefRYRN54lBg6HseYCFhs6Qjcy41Y3Jl/dVhA87Ns= -github.com/Antonboom/nilnil v0.1.9 h1:eKFMejSxPSA9eLSensFmjW2XTgTwJMjZ8hUHtV4s/SQ= -github.com/Antonboom/nilnil v0.1.9/go.mod h1:iGe2rYwCq5/Me1khrysB4nwI7swQvjclR8/YRPl5ihQ= -github.com/Antonboom/testifylint v1.4.3 h1:ohMt6AHuHgttaQ1xb6SSnxCeK4/rnK7KKzbvs7DmEck= -github.com/Antonboom/testifylint v1.4.3/go.mod h1:+8Q9+AOLsz5ZiQiiYujJKs9mNz398+M6UgslP4qgJLA= +github.com/Antonboom/errname v1.0.0 h1:oJOOWR07vS1kRusl6YRSlat7HFnb3mSfMl6sDMRoTBA= +github.com/Antonboom/errname v1.0.0/go.mod h1:gMOBFzK/vrTiXN9Oh+HFs+e6Ndl0eTFbtsRTSRdXyGI= +github.com/Antonboom/nilnil v1.0.1 h1:C3Tkm0KUxgfO4Duk3PM+ztPncTFlOf0b2qadmS0s4xs= +github.com/Antonboom/nilnil v1.0.1/go.mod h1:CH7pW2JsRNFgEh8B2UaPZTEPhCMuFowP/e8Udp9Nnb0= +github.com/Antonboom/testifylint v1.5.2 h1:4s3Xhuv5AvdIgbd8wOOEeo0uZG7PbDKQyKY5lGoQazk= +github.com/Antonboom/testifylint v1.5.2/go.mod h1:vxy8VJ0bc6NavlYqjZfmp6EfqXMtBgQ4+mhCojwC1P8= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c h1:pxW6RcqyfI9/kWtOwnv/G+AzdKuy2ZrqINhenH4HyNs= github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= -github.com/Crocmagnon/fatcontext v0.5.2 h1:vhSEg8Gqng8awhPju2w7MKHqMlg4/NI+gSDHtR3xgwA= -github.com/Crocmagnon/fatcontext v0.5.2/go.mod h1:87XhRMaInHP44Q7Tlc7jkgKKB7kZAOPiDkFMdKCC+74= +github.com/Crocmagnon/fatcontext v0.5.3 h1:zCh/wjc9oyeF+Gmp+V60wetm8ph2tlsxocgg/J0hOps= +github.com/Crocmagnon/fatcontext v0.5.3/go.mod h1:XoCQYY1J+XTfyv74qLXvNw4xFunr3L1wkopIIKG7wGM= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.0 h1:/fTUt5vmbkAcMBt4YQiuC23cV0kEsN1MVMNqeOW43cU= @@ -63,59 +65,61 @@ github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8 github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/Microsoft/hcsshim v0.12.7 h1:MP6R1spmjxTE4EU4J3YsrTxn8CjvN9qwjTKJXldFaRg= -github.com/Microsoft/hcsshim v0.12.7/go.mod h1:HPbAuJ9BvQYYZbB4yEQcyGIsTP5L4yHKeO9XO149AEM= +github.com/Microsoft/hcsshim v0.12.9 h1:2zJy5KA+l0loz1HzEGqyNnjd3fyZA31ZBCGKacp6lLg= +github.com/Microsoft/hcsshim v0.12.9/go.mod h1:fJ0gkFAna6ukt0bLdKB8djt4XIJhF/vEPuoIWYVvZ8Y= github.com/OpenPeeDeeP/depguard/v2 v2.2.0 h1:vDfG60vDtIuf0MEOhmLlLLSzqaRM8EMcgJPdp74zmpA= github.com/OpenPeeDeeP/depguard/v2 v2.2.0/go.mod h1:CIzddKRvLBC4Au5aYP/i3nyaWQ+ClszLIuVocRiCYFQ= github.com/a8m/envsubst v1.4.2 h1:4yWIHXOLEJHQEFd4UjrWDrYeYlV7ncFWJOCBRLOZHQg= github.com/a8m/envsubst v1.4.2/go.mod h1:MVUTQNGQ3tsjOOtKCNd+fl8RzhsXcDvvAEzkhGtlsbY= -github.com/alecthomas/assert/v2 v2.3.0 h1:mAsH2wmvjsuvyBvAmCtm7zFsBlb8mIHx5ySLVdDZXL0= -github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= -github.com/alecthomas/go-check-sumtype v0.1.4 h1:WCvlB3l5Vq5dZQTFmodqL2g68uHiSwwlWcT5a2FGK0c= -github.com/alecthomas/go-check-sumtype v0.1.4/go.mod h1:WyYPfhfkdhyrdaligV6svFopZV8Lqdzn5pyVBaV6jhQ= +github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= +github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= +github.com/alecthomas/go-check-sumtype v0.3.1 h1:u9aUvbGINJxLVXiFvHUlPEaD7VDULsrxJb4Aq31NLkU= +github.com/alecthomas/go-check-sumtype v0.3.1/go.mod h1:A8TSiN3UPRw3laIgWEUOHHLPa6/r9MtoigdlP5h3K/E= github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6icjJvbsmV8= github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -github.com/alexkohler/nakedret/v2 v2.0.4 h1:yZuKmjqGi0pSmjGpOC016LtPJysIL0WEUiaXW5SUnNg= -github.com/alexkohler/nakedret/v2 v2.0.4/go.mod h1:bF5i0zF2Wo2o4X4USt9ntUWve6JbFv02Ff4vlkmS/VU= +github.com/alexkohler/nakedret/v2 v2.0.5 h1:fP5qLgtwbx9EJE8dGEERT02YwS8En4r9nnZ71RK+EVU= +github.com/alexkohler/nakedret/v2 v2.0.5/go.mod h1:bF5i0zF2Wo2o4X4USt9ntUWve6JbFv02Ff4vlkmS/VU= github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= +github.com/alingse/nilnesserr v0.1.1 h1:7cYuJewpy9jFNMEA72Q1+3Nm3zKHzg+Q28D5f2bBFUA= +github.com/alingse/nilnesserr v0.1.1/go.mod h1:1xJPrXonEtX7wyTq8Dytns5P2hNzoWymVUIaKm4HNFg= github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ= github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw= github.com/aokoli/goutils v1.0.1 h1:7fpzNGoJ3VA8qcrm++XEE1QUe0mIwNeLa02Nwq7RDkg= github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= github.com/ashanbrown/forbidigo v1.6.0 h1:D3aewfM37Yb3pxHujIPSpTf6oQk9sc9WZi8gerOIVIY= github.com/ashanbrown/forbidigo v1.6.0/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= -github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s= -github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= +github.com/ashanbrown/makezero v1.2.0 h1:/2Lp1bypdmK9wDIq7uWBlDF1iMUpIIS4A+pF6C9IEUU= +github.com/ashanbrown/makezero v1.2.0/go.mod h1:dxlPhHbDMC6N6xICzFBSK+4njQDdK8euNO0qjQMtGY4= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bkielbasa/cyclop v1.2.1 h1:AeF71HZDob1P2/pRm1so9cd1alZnrpyc4q2uP2l0gJY= -github.com/bkielbasa/cyclop v1.2.1/go.mod h1:K/dT/M0FPAiYjBgQGau7tz+3TMh4FWAEqlMhzFWCrgM= +github.com/bkielbasa/cyclop v1.2.3 h1:faIVMIGDIANuGPWH031CZJTi2ymOQBULs9H21HSMa5w= +github.com/bkielbasa/cyclop v1.2.3/go.mod h1:kHTwA9Q0uZqOADdupvcFJQtp/ksSnytRMe8ztxG8Fuo= github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= -github.com/bombsimon/wsl/v4 v4.4.1 h1:jfUaCkN+aUpobrMO24zwyAMwMAV5eSziCkOKEauOLdw= -github.com/bombsimon/wsl/v4 v4.4.1/go.mod h1:Xu/kDxGZTofQcDGCtQe9KCzhHphIe0fDuyWTxER9Feo= -github.com/breml/bidichk v0.2.7 h1:dAkKQPLl/Qrk7hnP6P+E0xOodrq8Us7+U0o4UBOAlQY= -github.com/breml/bidichk v0.2.7/go.mod h1:YodjipAGI9fGcYM7II6wFvGhdMYsC5pHDlGzqvEW3tQ= -github.com/breml/errchkjson v0.3.6 h1:VLhVkqSBH96AvXEyclMR37rZslRrY2kcyq+31HCsVrA= -github.com/breml/errchkjson v0.3.6/go.mod h1:jhSDoFheAF2RSDOlCfhHO9KqhZgAYLyvHe7bRCX8f/U= -github.com/bufbuild/buf v1.45.0 h1:WdaM5OCjqEURmzOiz3h9gVilFXqWpt6X+zbOVqKti1A= -github.com/bufbuild/buf v1.45.0/go.mod h1:j+GjGIKS+CvubKtPiC0KpEiHAd3wS9/5sn2/U5WlA20= +github.com/bombsimon/wsl/v4 v4.5.0 h1:iZRsEvDdyhd2La0FVi5k6tYehpOR/R7qIUjmKk7N74A= +github.com/bombsimon/wsl/v4 v4.5.0/go.mod h1:NOQ3aLF4nD7N5YPXMruR6ZXDOAqLoM0GEpLwTdvmOSc= +github.com/breml/bidichk v0.3.2 h1:xV4flJ9V5xWTqxL+/PMFF6dtJPvZLPsyixAoPe8BGJs= +github.com/breml/bidichk v0.3.2/go.mod h1:VzFLBxuYtT23z5+iVkamXO386OB+/sVwZOpIj6zXGos= +github.com/breml/errchkjson v0.4.0 h1:gftf6uWZMtIa/Is3XJgibewBm2ksAQSY/kABDNFTAdk= +github.com/breml/errchkjson v0.4.0/go.mod h1:AuBOSTHyLSaaAFlWsRSuRBIroCh3eh7ZHh5YeelDIk8= +github.com/bufbuild/buf v1.48.0 h1:JiA1Ynz6DE/MBDcEsFvWNoaPhnjaSdLzKH00/5SWomg= +github.com/bufbuild/buf v1.48.0/go.mod h1:lHjK93s3FLn6GOec0f2uqFeREhfL0Qw5dvZ3eipclD8= github.com/bufbuild/protocompile v0.14.1 h1:iA73zAf/fyljNjQKwYzUHD6AD4R8KMasmwa/FBatYVw= github.com/bufbuild/protocompile v0.14.1/go.mod h1:ppVdAIhbr2H8asPk6k4pY7t9zB1OU5DoEw9xY/FUi1c= github.com/bufbuild/protoplugin v0.0.0-20240911180120-7bb73e41a54a h1:l3RhVoG0RtC61h6TVWnkniGj4TgBebuyPQRdleFAmTg= github.com/bufbuild/protoplugin v0.0.0-20240911180120-7bb73e41a54a/go.mod h1:c5D8gWRIZ2HLWO3gXYTtUfw/hbJyD8xikv2ooPxnklQ= -github.com/bufbuild/protovalidate-go v0.7.2 h1:UuvKyZHl5p7u3ztEjtRtqtDxOjRKX5VUOgKFq6p6ETk= -github.com/bufbuild/protovalidate-go v0.7.2/go.mod h1:PHV5pFuWlRzdDW02/cmVyNzdiQ+RNNwo7idGxdzS7o4= -github.com/butuzov/ireturn v0.3.0 h1:hTjMqWw3y5JC3kpnC5vXmFJAWI/m31jaCYQqzkS6PL0= -github.com/butuzov/ireturn v0.3.0/go.mod h1:A09nIiwiqzN/IoVo9ogpa0Hzi9fex1kd9PSD6edP5ZA= -github.com/butuzov/mirror v1.2.0 h1:9YVK1qIjNspaqWutSv8gsge2e/Xpq1eqEkslEUHy5cs= -github.com/butuzov/mirror v1.2.0/go.mod h1:DqZZDtzm42wIAIyHXeN8W/qb1EPlb9Qn/if9icBOpdQ= +github.com/bufbuild/protovalidate-go v0.8.0 h1:Xs3kCLCJ4tQiogJ0iOXm+ClKw/KviW3nLAryCGW2I3Y= +github.com/bufbuild/protovalidate-go v0.8.0/go.mod h1:JPWZInGm2y2NBg3vKDKdDIkvDjyLv31J3hLH5GIFc/Q= +github.com/butuzov/ireturn v0.3.1 h1:mFgbEI6m+9W8oP/oDdfA34dLisRFCj2G6o/yiI1yZrY= +github.com/butuzov/ireturn v0.3.1/go.mod h1:ZfRp+E7eJLC0NQmk1Nrm1LOrn/gQlOykv+cVPdiXH5M= +github.com/butuzov/mirror v1.3.0 h1:HdWCXzmwlQHdVhwvsfBb2Au0r3HyINry3bDWLYXiKoc= +github.com/butuzov/mirror v1.3.0/go.mod h1:AEij0Z8YMALaq4yQj9CPPVYOyJQyiexpQEQgihajRfI= github.com/catenacyber/perfsprint v0.7.1 h1:PGW5G/Kxn+YrN04cRAZKC+ZuvlVwolYMrIyyTJ/rMmc= github.com/catenacyber/perfsprint v0.7.1/go.mod h1:/wclWYompEyjUD2FuIIDVKNkqz7IgBIWXIH3V0Zol50= github.com/ccojocar/zxcvbn-go v1.0.2 h1:na/czXU8RrhXO4EZme6eQJLR4PzcGsahsBOAwU6I3Vg= @@ -129,6 +133,8 @@ github.com/charithe/durationcheck v0.0.10 h1:wgw73BiocdBDQPik+zcEoBG/ob8uyBHf2iy github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoGOY1C1L6uouGNreQ= github.com/chavacava/garif v0.1.0 h1:2JHa3hbYf5D9dsgseMKAmc/MZ109otzgNFk5s87H9Pc= github.com/chavacava/garif v0.1.0/go.mod h1:XMyYCkEL58DF0oyW4qDjjnPWONs2HBqYKI+UIPD+Gww= +github.com/chengxilo/virtualterm v1.0.4 h1:Z6IpERbRVlfB8WkOmtbHiDbBANU7cimRIof7mk9/PwM= +github.com/chengxilo/virtualterm v1.0.4/go.mod h1:DyxxBZz/x1iqJjFxTFcr6/x+jSpqN0iwWCOK1q10rlY= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs= github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= @@ -138,39 +144,41 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= -github.com/ckaznocha/intrange v0.2.0 h1:FykcZuJ8BD7oX93YbO1UY9oZtkRbp+1/kJcDjkefYLs= -github.com/ckaznocha/intrange v0.2.0/go.mod h1:r5I7nUlAAG56xmkOpw4XVr16BXhwYTUdcuRFeevn1oE= +github.com/ckaznocha/intrange v0.3.0 h1:VqnxtK32pxgkhJgYQEeOArVidIPg+ahLP7WBOXZd5ZY= +github.com/ckaznocha/intrange v0.3.0/go.mod h1:+I/o2d2A1FBHgGELbGxzIcyd3/9l9DuwjM8FsbSS3Lo= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/containerd/cgroups/v3 v3.0.3 h1:S5ByHZ/h9PMe5IOQoN7E+nMc2UcLEM/V48DGDJ9kip0= -github.com/containerd/cgroups/v3 v3.0.3/go.mod h1:8HBe7V3aWGLFPd/k03swSIsGjZhHI2WzJmticMgVuz0= -github.com/containerd/containerd v1.7.22 h1:nZuNnNRA6T6jB975rx2RRNqqH2k6ELYKDZfqTHqwyy0= -github.com/containerd/containerd v1.7.22/go.mod h1:e3Jz1rYRUZ2Lt51YrH9Rz0zPyJBOlSvB3ghr2jbVD8g= -github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8= -github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= -github.com/containerd/errdefs v0.2.0 h1:XllDESRfJtVrMwMmR2mCabxyvBK4UlbyyiWI3MvRw0o= -github.com/containerd/errdefs v0.2.0/go.mod h1:C28ixlj3dKhQS9hsQ13b+HIb4X7+s2G4FYhbSPcRDLM= +github.com/containerd/cgroups/v3 v3.0.5 h1:44na7Ud+VwyE7LIoJ8JTNQOa549a8543BmzaJHo6Bzo= +github.com/containerd/cgroups/v3 v3.0.5/go.mod h1:SA5DLYnXO8pTGYiAHXz94qvLQTKfVM5GEVisn4jpins= +github.com/containerd/containerd v1.7.24 h1:zxszGrGjrra1yYJW/6rhm9cJ1ZQ8rkKBR48brqsa7nA= +github.com/containerd/containerd v1.7.24/go.mod h1:7QUzfURqZWCZV7RLNEn1XjUCQLEf0bkaK4GjUaZehxw= +github.com/containerd/continuity v0.4.5 h1:ZRoN1sXq9u7V6QoHMcVWGhOwDFqZ4B9i5H6un1Wh0x4= +github.com/containerd/continuity v0.4.5/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= +github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= +github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= +github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= +github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= -github.com/containerd/stargz-snapshotter/estargz v0.15.1 h1:eXJjw9RbkLFgioVaTG+G/ZW/0kEe2oEKCdS/ZxIyoCU= -github.com/containerd/stargz-snapshotter/estargz v0.15.1/go.mod h1:gr2RNwukQ/S9Nv33Lt6UC7xEx58C+LHRdoqbEKjz1Kk= -github.com/containerd/ttrpc v1.2.5 h1:IFckT1EFQoFBMG4c3sMdT8EP3/aKfumK1msY+Ze4oLU= -github.com/containerd/ttrpc v1.2.5/go.mod h1:YCXHsb32f+Sq5/72xHubdiJRQY9inL4a4ZQrAbN1q9o= -github.com/containerd/typeurl/v2 v2.2.0 h1:6NBDbQzr7I5LHgp34xAXYF5DOTQDn05X58lsPEmzLso= -github.com/containerd/typeurl/v2 v2.2.0/go.mod h1:8XOOxnyatxSWuG8OfsZXVnAF4iZfedjS/8UHSPJnX4g= +github.com/containerd/stargz-snapshotter/estargz v0.16.3 h1:7evrXtoh1mSbGj/pfRccTampEyKpjpOnS3CyiV1Ebr8= +github.com/containerd/stargz-snapshotter/estargz v0.16.3/go.mod h1:uyr4BfYfOj3G9WBVE8cOlQmXAbPN9VEQpBBeJIuOipU= +github.com/containerd/ttrpc v1.2.6 h1:zG+Kn5EZ6MUYCS1t2Hmt2J4tMVaLSFEJVOraDQwNPC4= +github.com/containerd/ttrpc v1.2.6/go.mod h1:YCXHsb32f+Sq5/72xHubdiJRQY9inL4a4ZQrAbN1q9o= +github.com/containerd/typeurl/v2 v2.2.3 h1:yNA/94zxWdvYACdYO8zofhrTVuQY73fFU1y++dYSw40= +github.com/containerd/typeurl/v2 v2.2.3/go.mod h1:95ljDnPfD3bAbDJRugOiShd/DlAAsxGtUBhJxIn7SCk= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc= -github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/cristalhq/acmd v0.12.0 h1:RdlKnxjN+txbQosg8p/TRNZ+J1Rdne43MVQZ1zDhGWk= github.com/cristalhq/acmd v0.12.0/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= github.com/cubicdaiya/gonp v1.0.4 h1:ky2uIAJh81WiLcGKBVD5R7KsM/36W6IqqTy6Bo6rGws= github.com/cubicdaiya/gonp v1.0.4/go.mod h1:iWGuP/7+JVTn02OWhRemVbMmG1DOUnmrGTYYACpOI0I= -github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo= -github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc= +github.com/curioswitch/go-reassign v0.3.0 h1:dh3kpQHuADL3cobV/sSGETA8DOv457dwl+fbBAhrQPs= +github.com/curioswitch/go-reassign v0.3.0/go.mod h1:nApPCCTtqLJN/s8HfItCcKV0jIPwluBOvZP+dsJGA88= github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 h1:iwZdTE0PVqJCos1vaoKsclOGD3ADKpshg3SRtYBbwso= github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= github.com/daixiang0/gci v0.13.5 h1:kThgmH1yBmZSBCh1EJVxQ7JsHpm5Oms0AMed/0LaH4c= @@ -179,30 +187,33 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deepmap/oapi-codegen/v2 v2.2.0 h1:FW4f7C0Xb6EaezBSB3GYw2QGwHD5ChDflG+3xSZBdvY= -github.com/deepmap/oapi-codegen/v2 v2.2.0/go.mod h1:L4zUv7ULYDtYSb/aYk/xO3OYcQU6BoU/0viULkbi2DE= github.com/denis-tingaikin/go-header v0.5.0 h1:SRdnP5ZKvcO9KKRP1KJrhFR3RrlGuD+42t4429eC9k8= github.com/denis-tingaikin/go-header v0.5.0/go.mod h1:mMenU5bWrok6Wl2UsZjy+1okegmwQ3UgWl4V1D8gjlY= github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/cli v27.3.1+incompatible h1:qEGdFBF3Xu6SCvCYhc7CzaQTlBmqDuzxPDpigSyeKQQ= -github.com/docker/cli v27.3.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= +github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/docker/cli v27.4.1+incompatible h1:VzPiUlRJ/xh+otB75gva3r05isHMo5wXDfPRi5/b4hI= +github.com/docker/cli v27.4.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v27.3.1+incompatible h1:KttF0XoteNTicmUtBO0L2tP+J7FGRFTjaEF4k6WdhfI= -github.com/docker/docker v27.3.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v27.4.1+incompatible h1:ZJvcY7gfwHn1JF48PfbyXg7Jyt9ZCWDW+GGXOIxEwp4= +github.com/docker/docker v27.4.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.8.2 h1:bX3YxiGzFP5sOXWc3bTPEXdEaZSeVMrFgOr3T+zrFAo= github.com/docker/docker-credential-helpers v0.8.2/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960/go.mod h1:9HQzr9D/0PGwMEbC3d5AB7oi67+h4TsQqItC1GVYG58= +github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936 h1:PRxIJD8XjimM5aTknUK9w6DHLDox2r2M3DI4i2pnd3w= +github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936/go.mod h1:ttYvX5qlB+mlV1okblJqcSMtR4c52UKxDiX9GRBS8+Q= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/elliotchance/orderedmap v1.6.0 h1:xjn+kbbKXeDq6v9RVE+WYwRbYfAZKvlWfcJNxM8pvEw= -github.com/elliotchance/orderedmap v1.6.0/go.mod h1:wsDwEaX5jEoyhbs7x93zk2H/qv0zwuhg4inXhDkYqys= +github.com/elliotchance/orderedmap v1.7.0 h1:FirjcM/NbcyudJhaIF9MG/RjIh5XHm2xb1SFquZ8k0g= +github.com/elliotchance/orderedmap v1.7.0/go.mod h1:wsDwEaX5jEoyhbs7x93zk2H/qv0zwuhg4inXhDkYqys= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -214,8 +225,8 @@ github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9 github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q= github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= -github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= @@ -227,16 +238,20 @@ github.com/firefart/nonamedreturns v1.0.5 h1:tM+Me2ZaXs8tfdDw3X6DOX++wMCOqzYUho6 github.com/firefart/nonamedreturns v1.0.5/go.mod h1:gHJjDqhGM4WyPt639SOZs+G89Ko7QKH5R5BhnO6xJhw= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= -github.com/getkin/kin-openapi v0.124.0 h1:VSFNMB9C9rTKBnQ/fpyDU8ytMTr4dWI9QovSKj9kz/M= -github.com/getkin/kin-openapi v0.124.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM= -github.com/ghostiam/protogetter v0.3.6 h1:R7qEWaSgFCsy20yYHNIJsU9ZOb8TziSRRxuAOTVKeOk= -github.com/ghostiam/protogetter v0.3.6/go.mod h1:7lpeDnEJ1ZjL/YtyoN99ljO4z0pd3H0d18/t2dPBxHw= -github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= -github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/getkin/kin-openapi v0.127.0 h1:Mghqi3Dhryf3F8vR370nN67pAERW+3a95vomb3MAREY= +github.com/getkin/kin-openapi v0.127.0/go.mod h1:OZrfXzUfGrNbsKj+xmFBx6E5c6yH3At/tAKSc2UszXM= +github.com/ghostiam/protogetter v0.3.8 h1:LYcXbYvybUyTIxN2Mj9h6rHrDZBDwZloPoKctWrFyJY= +github.com/ghostiam/protogetter v0.3.8/go.mod h1:WZ0nw9pfzsgxuRsPOFQomgDVSWtDLJRfQJEhsGbmQMA= +github.com/go-chi/chi/v5 v5.2.0 h1:Aj1EtB0qR2Rdo2dG4O94RIU35w2lvQSj6BRA4+qwFL0= +github.com/go-chi/chi/v5 v5.2.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-critic/go-critic v0.11.5 h1:TkDTOn5v7EEngMxu8KbuFqFR43USaaH8XRJLz1jhVYA= github.com/go-critic/go-critic v0.11.5/go.mod h1:wu6U7ny9PiaHaZHcvMDmdysMqvDem162Rh3zWTrqk8M= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= @@ -246,21 +261,22 @@ github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= -github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= -github.com/go-openapi/swag v0.22.8 h1:/9RjDSQ0vbFR+NyjGMkFTsA1IA0fmhKSThmfGZjicbw= -github.com/go-openapi/swag v0.22.8/go.mod h1:6QT22icPLEqAM/z/TChgb4WAveCHF92+2gF0CNjHpPI= -github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.22.1 h1:40JcKH+bBNGFczGuoBYgX4I6m/i27HYW8P9FDk5PbgA= +github.com/go-playground/validator/v10 v10.22.1/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI= github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= @@ -284,10 +300,10 @@ github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQi github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus= github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig= -github.com/go-viper/mapstructure/v2 v2.1.0 h1:gHnMa2Y/pIxElCH2GlZZ1lZSsn6XMtufpGyP1XxdC/w= -github.com/go-viper/mapstructure/v2 v2.1.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/go-xmlfmt/xmlfmt v1.1.2 h1:Nea7b4icn8s57fTx1M5AI4qQT5HEM3rVUO8MuE6g80U= -github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-xmlfmt/xmlfmt v1.1.3 h1:t8Ey3Uy7jDSEisW2K3somuMKIpzktkWptA0iFCnRUWY= +github.com/go-xmlfmt/xmlfmt v1.1.3/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= @@ -297,8 +313,8 @@ github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1 h1:FWNFq4fM1wPfcK40 github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1/go.mod h1:5YoVOkjYAQumqlV356Hj3xeYh4BdZuLE0/nRkf2NKkI= github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/goccy/go-yaml v1.12.0 h1:/1WHjnMsI1dlIBQutrvSMGZRQufVO3asrHfTwfACoPM= -github.com/goccy/go-yaml v1.12.0/go.mod h1:wKnAMd44+9JAAnGQpWVEgBzGt3YuTaQ4uXoHvE4m7WU= +github.com/goccy/go-yaml v1.13.0 h1:0Wtp0FZLd7Sm8gERmR9S6Iczzb3vItJj7NaHmFg8pTs= +github.com/goccy/go-yaml v1.13.0/go.mod h1:IjYwxUiJDoqpx2RmbdjMUceGHZwYLon3sfOGl5Hi9lc= github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -307,8 +323,8 @@ github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17w github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -319,28 +335,30 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/gofmt v0.0.0-20240816233607-d8596aa466a9 h1:/1322Qns6BtQxUZDTAT4SdcoxknUki7IAoK4SAXr8ME= -github.com/golangci/gofmt v0.0.0-20240816233607-d8596aa466a9/go.mod h1:Oesb/0uFAyWoaw1U1qS5zyjCg5NP9C9iwjnI4tIsXEE= -github.com/golangci/golangci-lint v1.61.0 h1:VvbOLaRVWmyxCnUIMTbf1kDsaJbTzH20FAMXTAlQGu8= -github.com/golangci/golangci-lint v1.61.0/go.mod h1:e4lztIrJJgLPhWvFPDkhiMwEFRrWlmFbrZea3FsJyN8= +github.com/golangci/go-printf-func-name v0.1.0 h1:dVokQP+NMTO7jwO4bwsRwLWeudOVUPPyAKJuzv8pEJU= +github.com/golangci/go-printf-func-name v0.1.0/go.mod h1:wqhWFH5mUdJQhweRnldEywnR5021wTdZSNgwYceV14s= +github.com/golangci/gofmt v0.0.0-20241223200906-057b0627d9b9 h1:t5wybL6RtO83VwoMOb7U/Peqe3gGKQlPIC66wXmnkvM= +github.com/golangci/gofmt v0.0.0-20241223200906-057b0627d9b9/go.mod h1:Ag3L7sh7E28qAp/5xnpMMTuGYqxLZoSaEHZDkZB1RgU= +github.com/golangci/golangci-lint v1.63.1 h1:fr7zu2W0qexDkTvYwtdrsYJwYIx+tS09ujM1CIjIpCQ= +github.com/golangci/golangci-lint v1.63.1/go.mod h1:O2+mo4qsJuG4cSXBzLbEV+5NAtntoNIbAv428zaEY/s= github.com/golangci/misspell v0.6.0 h1:JCle2HUTNWirNlDIAUO44hUsKhOFqGPoC4LZxlaSXDs= github.com/golangci/misspell v0.6.0/go.mod h1:keMNyY6R9isGaSAu+4Q8NMBwMPkh15Gtc8UCVoDtAWo= -github.com/golangci/modinfo v0.3.4 h1:oU5huX3fbxqQXdfspamej74DFX0kyGLkw1ppvXoJ8GA= -github.com/golangci/modinfo v0.3.4/go.mod h1:wytF1M5xl9u0ij8YSvhkEVPP3M5Mc7XLl1pxH3B2aUM= github.com/golangci/plugin-module-register v0.1.1 h1:TCmesur25LnyJkpsVrupv1Cdzo+2f7zX0H6Jkw1Ol6c= github.com/golangci/plugin-module-register v0.1.1/go.mod h1:TTpqoB6KkwOJMV8u7+NyXMrkwwESJLOkfl9TxR1DGFc= github.com/golangci/revgrep v0.5.3 h1:3tL7c1XBMtWHHqVpS5ChmiAAoe4PF/d5+ULzV9sLAzs= github.com/golangci/revgrep v0.5.3/go.mod h1:U4R/s9dlXZsg8uJmaR1GrloUr14D7qDl8gi2iPXJH8k= github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed h1:IURFTjxeTfNFP0hTEi1YKjB/ub8zkpaOqFFMApi2EAs= github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed/go.mod h1:XLXN8bNw4CGRPaqgl3bv/lhz7bsGPh4/xSaMTbo2vkQ= -github.com/google/cel-go v0.21.0 h1:cl6uW/gxN+Hy50tNYvI691+sXxioCnstFzLp2WO4GCI= -github.com/google/cel-go v0.21.0/go.mod h1:rHUlWCcBKgyEk+eV03RPdZUekPp6YcJwV0FxuUksYxc= +github.com/google/cel-go v0.22.1 h1:AfVXx3chM2qwoSbM7Da8g8hX8OVSkBFwX+rz2+PcK40= +github.com/google/cel-go v0.22.1/go.mod h1:BuznPXXfQDpXKWQ9sPW3TzlAJN5zzFe+i9tIs0yC4s8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -357,10 +375,11 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-containerregistry v0.20.2 h1:B1wPJ1SN/S7pB+ZAimcciVD+r+yV/l/DSArMxlbwseo= github.com/google/go-containerregistry v0.20.2/go.mod h1:z38EKdKh4h7IP2gSfUUqEvalZBqs6AoLeWfUy34nQC8= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= -github.com/google/pprof v0.0.0-20241001023024-f4c0cfd0cf1d h1:Jaz2JzpQaQXyET0AjLBXShrthbpqMkhGiEfkcQAiAUs= -github.com/google/pprof v0.0.0-20241001023024-f4c0cfd0cf1d/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -377,25 +396,29 @@ github.com/gostaticanalysis/forcetypeassert v0.1.0/go.mod h1:qZEedyP/sY1lTGV1uJ3 github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk= github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= -github.com/gostaticanalysis/testutil v0.4.0 h1:nhdCmubdmDF6VEatUNjgUZBJKWRqugoISdUv3PPQgHY= -github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= +github.com/gostaticanalysis/testutil v0.5.0 h1:Dq4wT1DdTwTGCQQv3rl3IvD5Ld0E6HiY+3Zh0sUGqw8= +github.com/gostaticanalysis/testutil v0.5.0/go.mod h1:OLQSbuM6zw2EvCcXTz1lVq5unyoNft372msDY0nY5Hs= github.com/gotesttools/gotestfmt/v2 v2.5.0 h1:fSU3MnR+E+fvuXdw1l8xbufKhDxY3Tfjsjx/I1WerB4= github.com/gotesttools/gotestfmt/v2 v2.5.0/go.mod h1:oQJg2KZ2aGoqEbMC2PDaAeBYm0tOkocgixK9FzsCdp4= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 h1:VNqngBF40hVlDloBruUehVYC3ArSgIyScOAyMRqBxRg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1/go.mod h1:RBRO7fro65R6tjKzYgLAFo0t1QEXY1Dp+i/bvpRiqiQ= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-immutable-radix/v2 v2.1.0 h1:CUW5RYIcysz+D3B+l1mDeXrQ7fUvGGCwJfdASSzbrfo= +github.com/hashicorp/go-immutable-radix/v2 v2.1.0/go.mod h1:hgdqLXA4f6NIjRVisM1TJ9aOJVNRqKZj+xDGF6m7PBw= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= @@ -405,9 +428,11 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= @@ -415,16 +440,16 @@ github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/invopop/yaml v0.2.0 h1:7zky/qH+O0DwAyoobXUqvVBwgBFRxKoQ/3FjcVpjTMY= -github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= +github.com/invopop/yaml v0.3.1 h1:f0+ZpmhfBSS4MhG+4HYseMdJhoeeopbSKbq5Rpeelso= +github.com/invopop/yaml v0.3.1/go.mod h1:PMOp3nn4/12yEZUFfmOuNHJsZToEEOwoWsT+D81KkeA= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 h1:L0QtFUgDarD7Fpv9jeVMgy/+Ec0mtnmYuImjTz6dtDA= -github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY= -github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw= -github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= -github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.7.1 h1:x7SYsPBYDkHDksogeSmZZ5xzThcTgRz++I5E+ePFUcs= +github.com/jackc/pgx/v5 v5.7.1/go.mod h1:e7O26IywZZ+naJtWWos6i6fvWK+29etgITqrqHLfoZA= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww= github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= github.com/jdx/go-netrc v1.0.0 h1:QbLMLyCZGj0NA8glAhxUpf1zDg6cxnWgMBbjq40W0gQ= @@ -439,27 +464,24 @@ github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af h1:KA9BjwUk7KlCh6S9EAGWBt1oExIUv9WyNCiRz5amv48= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= -github.com/jjti/go-spancheck v0.6.2 h1:iYtoxqPMzHUPp7St+5yA8+cONdyXD3ug6KK15n7Pklk= -github.com/jjti/go-spancheck v0.6.2/go.mod h1:+X7lvIrR5ZdUTkxFYqzJ0abr8Sb5LOo80uOhWNqIrYA= +github.com/jjti/go-spancheck v0.6.4 h1:Tl7gQpYf4/TMU7AT84MN83/6PutY21Nb9fuQjFTpRRc= +github.com/jjti/go-spancheck v0.6.4/go.mod h1:yAEYdKJ2lRkDA8g7X+oKUHXOWVAXSBJRv04OhF+QUjk= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= -github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= -github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= +github.com/julz/importas v0.2.0 h1:y+MJN/UdL63QbFJHws9BVC5RpA2iq0kpjrFajTGivjQ= +github.com/julz/importas v0.2.0/go.mod h1:pThlt589EnCYtMnmhmRYY/qn9lCf/frPOK+WMx3xiJY= github.com/karamaru-alpha/copyloopvar v1.1.0 h1:x7gNyKcC2vRBO1H2Mks5u1VxQtYvFiym7fCjIP8RPos= github.com/karamaru-alpha/copyloopvar v1.1.0/go.mod h1:u7CIfztblY0jZLOQZgH3oYsJzpC2A7S6u/lfgSXHy0k= -github.com/karlseguin/ccache/v3 v3.0.5 h1:hFX25+fxzNjsRlREYsoGNa2LoVEw5mPF8wkWq/UnevQ= -github.com/karlseguin/ccache/v3 v3.0.5/go.mod h1:qxC372+Qn+IBj8Pe3KvGjHPj0sWwEF7AeZVhsNPZ6uY= +github.com/karlseguin/ccache/v3 v3.0.6 h1:6wC04CXSdptebuSUBgsQixNrrRMUdimtwmjlJUpCf/4= +github.com/karlseguin/ccache/v3 v3.0.6/go.mod h1:b0qfdUOHl4vJgKFQN41paXIdBb3acAtyX2uWrBAZs1w= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/errcheck v1.7.0 h1:+SbscKmWJ5mOK/bO1zS60F5I9WwZDWOfRsC4RwfwRV0= -github.com/kisielk/errcheck v1.7.0/go.mod h1:1kLL+jV4e+CFfueBmI1dSK2ADDyQnlrnrY/FqKluHJQ= +github.com/kisielk/errcheck v1.8.0 h1:ZX/URYa7ilESY19ik/vBmCn6zdGQLxACwjAcWbHlYlg= +github.com/kisielk/errcheck v1.8.0/go.mod h1:1kLL+jV4e+CFfueBmI1dSK2ADDyQnlrnrY/FqKluHJQ= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkHAIKE/contextcheck v1.1.5 h1:CdnJh63tcDe53vG+RebdpdXJTc9atMgGqdx8LXxiilg= github.com/kkHAIKE/contextcheck v1.1.5/go.mod h1:O930cpht4xb1YQpK+1+AgoM3mFsvxr7uyFptcnWTYUA= -github.com/klauspost/compress v1.17.10 h1:oXAz+Vh0PMUvJczoi+flxpnBEPxoER1IaAnU/NMPtT0= -github.com/klauspost/compress v1.17.10/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -480,19 +502,23 @@ github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= -github.com/lasiar/canonicalheader v1.1.1 h1:wC+dY9ZfiqiPwAexUApFush/csSPXeIi4QqyxXmng8I= -github.com/lasiar/canonicalheader v1.1.1/go.mod h1:cXkb3Dlk6XXy+8MVQnF23CYKWlyA7kfQhSw2CcZtZb0= -github.com/ldez/gomoddirectives v0.2.4 h1:j3YjBIjEBbqZ0NKtBNzr8rtMHTOrLPeiwTkfUJZ3alg= -github.com/ldez/gomoddirectives v0.2.4/go.mod h1:oWu9i62VcQDYp9EQ0ONTfqLNh+mDLWWDO+SO0qSQw5g= -github.com/ldez/tagliatelle v0.5.0 h1:epgfuYt9v0CG3fms0pEgIMNPuFf/LpPIfjk4kyqSioo= -github.com/ldez/tagliatelle v0.5.0/go.mod h1:rj1HmWiL1MiKQuOONhd09iySTEkUuE/8+5jtPYz9xa4= +github.com/lasiar/canonicalheader v1.1.2 h1:vZ5uqwvDbyJCnMhmFYimgMZnJMjwljN5VGY0VKbMXb4= +github.com/lasiar/canonicalheader v1.1.2/go.mod h1:qJCeLFS0G/QlLQ506T+Fk/fWMa2VmBUiEI2cuMK4djI= +github.com/ldez/exptostd v0.3.0 h1:iKdMtUedzov89jDvuwmo0qpo+ARpZJg9hMp3428WwNg= +github.com/ldez/exptostd v0.3.0/go.mod h1:iZBRYaUmcW5jwCR3KROEZ1KivQQp6PHXbDPk9hqJKCQ= +github.com/ldez/gomoddirectives v0.6.0 h1:Jyf1ZdTeiIB4dd+2n4qw+g4aI9IJ6JyfOZ8BityWvnA= +github.com/ldez/gomoddirectives v0.6.0/go.mod h1:TuwOGYoPAoENDWQpe8DMqEm5nIfjrxZXmxX/CExWyZ4= +github.com/ldez/grignotin v0.7.0 h1:vh0dI32WhHaq6LLPZ38g7WxXuZ1+RzyrJ7iPG9JMa8c= +github.com/ldez/grignotin v0.7.0/go.mod h1:uaVTr0SoZ1KBii33c47O1M8Jp3OP3YDwhZCmzT9GHEk= +github.com/ldez/tagliatelle v0.7.1 h1:bTgKjjc2sQcsgPiT902+aadvMjCeMHrY7ly2XKFORIk= +github.com/ldez/tagliatelle v0.7.1/go.mod h1:3zjxUpsNB2aEZScWiZTHrAXOl1x25t3cRmzfK1mlo2I= +github.com/ldez/usetesting v0.4.1 h1:T/4Bk3YDX6XUBtdNDDFymlr5GBekKA4j7HUtrv1YaaI= +github.com/ldez/usetesting v0.4.1/go.mod h1:eEs46T3PpQ+9RgN9VjpY6qWdiw2/QmfiDeWmdZdrjIQ= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= -github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY= github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA= -github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM= -github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= github.com/macabu/inamedparam v0.1.3 h1:2tk/phHkMlEL/1GNe/Yf6kkR/hkcUdAEY3L0hjYV1Mk= github.com/macabu/inamedparam v0.1.3/go.mod h1:93FLICAIk/quk7eaPPQvbzihUdn/QkGDwIZEoLtpH6I= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= @@ -515,14 +541,15 @@ github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOA github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY= github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= -github.com/mgechev/revive v1.3.9 h1:18Y3R4a2USSBF+QZKFQwVkBROUda7uoBlkEuBD+YD1A= -github.com/mgechev/revive v1.3.9/go.mod h1:+uxEIr5UH0TjXWHTno3xh4u7eg6jDpXKzQccA9UGhHU= -github.com/mikefarah/yq/v4 v4.44.3 h1:3zxHntH67maSHr6ynCjM44htw7LZNINmTzYn3tM2t+I= -github.com/mikefarah/yq/v4 v4.44.3/go.mod h1:1pm9sJoyZLDql3OqgklvRCkD0XIIHMZV38jKZgAuxwY= +github.com/mgechev/revive v1.5.1 h1:hE+QPeq0/wIzJwOphdVyUJ82njdd8Khp4fUIHGZHW3M= +github.com/mgechev/revive v1.5.1/go.mod h1:lC9AhkJIBs5zwx8wkudyHrU+IJkrEKmpCmGMnIJPk4o= +github.com/mikefarah/yq/v4 v4.44.6 h1:yuu+sH3KX1R3pQCP/vsDao8uNcuiXcjvC7XtoekCV0g= +github.com/mikefarah/yq/v4 v4.44.6/go.mod h1:sva/xvSlW4mKRtRm9nwIS40A+LqNbl46ezjBHYyFtLo= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= @@ -583,16 +610,32 @@ github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= github.com/norwoodj/helm-docs v1.14.2 h1:Ew3bCq1hZqMnnTopkk66Uy2mGwu/jAclAx+3JAVp1To= github.com/norwoodj/helm-docs v1.14.2/go.mod h1:qdo76rorOkPDme8nsV5e0JBAYrs56kzvZMYW83k1kgc= -github.com/nunnatsa/ginkgolinter v0.16.2 h1:8iLqHIZvN4fTLDC0Ke9tbSZVcyVHoBs0HIbnVSxfHJk= -github.com/nunnatsa/ginkgolinter v0.16.2/go.mod h1:4tWRinDN1FeJgU+iJANW/kz7xKN5nYRAOfJDQUS9dOQ= +github.com/nunnatsa/ginkgolinter v0.18.4 h1:zmX4KUR+6fk/vhUFt8DOP6KwznekhkmVSzzVJve2vyM= +github.com/nunnatsa/ginkgolinter v0.18.4/go.mod h1:AMEane4QQ6JwFz5GgjI5xLUM9S/CylO+UyM97fN2iBI= github.com/nwidger/jsoncolor v0.3.2 h1:rVJJlwAWDJShnbTYOQ5RM7yTA20INyKXlJ/fg4JMhHQ= github.com/nwidger/jsoncolor v0.3.2/go.mod h1:Cs34umxLbJvgBMnVNVqhji9BhoT/N/KinHqZptQ7cf4= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oapi-codegen/oapi-codegen/v2 v2.4.1 h1:ykgG34472DWey7TSjd8vIfNykXgjOgYJZoQbKfEeY/Q= +github.com/oapi-codegen/oapi-codegen/v2 v2.4.1/go.mod h1:N5+lY1tiTDV3V1BeHtOxeWXHoPVeApvsvjJqegfoaz8= github.com/oklog/ulid/v2 v2.1.0 h1:+9lhoxAP56we25tyYETBBY1YLA2SaoLvUFgrP2miPJU= github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo/v2 v2.20.2 h1:7NVCeyIWROIAheY21RLS+3j2bb52W0W82tkberYytp4= -github.com/onsi/ginkgo/v2 v2.20.2/go.mod h1:K9gyxPIlb+aIvnZ8bd9Ak+YP18w3APlR+5coaZoE2ag= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg= +github.com/onsi/ginkgo/v2 v2.22.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/onsi/gomega v1.34.2 h1:pNCwDkzrsv7MS9kpaQvVb1aVLahQXyJ/Tv5oAZMI3i8= github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= @@ -603,16 +646,16 @@ github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU= github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= -github.com/openfga/api/proto v0.0.0-20240807201305-c96ec773cae9 h1:Y0fIAHrYECcf5lpa/o1AbH21bS7rsco/FoH4A4NGlZE= -github.com/openfga/api/proto v0.0.0-20240807201305-c96ec773cae9/go.mod h1:gil5LBD8tSdFQbUkCQdnXsoeU9kDJdJgbGdHkgJfcd0= -github.com/openfga/cli v0.6.1 h1:xwv7QhIIlBZCGMHr7X6UNad8onvpBCX0sJ3bo3s8B7Y= -github.com/openfga/cli v0.6.1/go.mod h1:xdT6sd8GmxU+rUts0a0apqW8onaNjL86EdC/JQo8iew= -github.com/openfga/go-sdk v0.6.0 h1:AzfIByBk2niW5gbN5fm9A8WnDz/vW8wT1Zv4cZwWbww= -github.com/openfga/go-sdk v0.6.0/go.mod h1:L4ss/4HEMmehyV2WIuBEPMdeh686MqIEJcnoUk3Lhd8= -github.com/openfga/language/pkg/go v0.2.0-beta.0 h1:dTvgDkQImfNnH1iDvxnUIbz4INvKr4kS46dI12oAEzM= -github.com/openfga/language/pkg/go v0.2.0-beta.0/go.mod h1:mCwEY2IQvyNgfEwbfH0C0ERUwtL8z6UjSAF8zgn5Xbg= -github.com/openfga/openfga v1.6.0 h1:AfTEEK2PJzZPywSYWtOS3IXtHmqPKdLxGr/z+LFUMGk= -github.com/openfga/openfga v1.6.0/go.mod h1:/Q7/Bg/VeN3m68pAcmySejw/Xpp8HwTV92zrsLBoavo= +github.com/openfga/api/proto v0.0.0-20241107182745-c14fb4b3d4b4 h1:anI1zonbViSGV2X8szoTa0l2I28vjVKN4PGOJO/th7o= +github.com/openfga/api/proto v0.0.0-20241107182745-c14fb4b3d4b4/go.mod h1:gil5LBD8tSdFQbUkCQdnXsoeU9kDJdJgbGdHkgJfcd0= +github.com/openfga/cli v0.6.2 h1:16Q9nlu545EQaShAV3V2zjRQVa7+6SsKOxa2A4DGEmo= +github.com/openfga/cli v0.6.2/go.mod h1:SSC86gSM6Qj4cqgB/1Pyg7CZk8luP7Aw6fKdbeTpcfw= +github.com/openfga/go-sdk v0.6.3 h1:FO3uDYeV+1y844iVvD7MJYKtmIEP1r4mis7kWCaDG2A= +github.com/openfga/go-sdk v0.6.3/go.mod h1:zui7pHE3eLAYh2fFmEMrWg9XbxYns2WW5Xr/GEgili4= +github.com/openfga/language/pkg/go v0.2.0-beta.2.0.20241021130006-9791fa1db4ec h1:RQ1IkMwSrDkPzndUasDMsclhysDeGXL/NDzyBuzOcuc= +github.com/openfga/language/pkg/go v0.2.0-beta.2.0.20241021130006-9791fa1db4ec/go.mod h1:ll/hN6kS4EE6B/7J/PbZqac9Nuv7ZHpI+Jfh36JLrbs= +github.com/openfga/openfga v1.8.0 h1:Yqsont2a4Taocg8hunsIXMDX4TPv1CbGTS5Co3IAs00= +github.com/openfga/openfga v1.8.0/go.mod h1:vxq88JqBCy0tWKpQK5qtKspShV+onryc7N7JML1qu2c= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= @@ -651,19 +694,19 @@ github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDj github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polyfloyd/go-errorlint v1.6.0 h1:tftWV9DE7txiFzPpztTAwyoRLKNj9gpVm2cg8/OwcYY= -github.com/polyfloyd/go-errorlint v1.6.0/go.mod h1:HR7u8wuP1kb1NeN1zqTd1ZMlqUKPPHF+Id4vIPvDqVw= +github.com/polyfloyd/go-errorlint v1.7.0 h1:Zp6lzCK4hpBDj8y8a237YK4EPrMXQWvOe3nGoH4pFrU= +github.com/polyfloyd/go-errorlint v1.7.0/go.mod h1:dGWKu85mGHnegQ2SWpEybFityCg3j7ZbwsVUxAOk9gY= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= -github.com/pressly/goose/v3 v3.21.1 h1:5SSAKKWej8LVVzNLuT6KIvP1eFDuPvxa+B6H0w78buQ= -github.com/pressly/goose/v3 v3.21.1/go.mod h1:sqthmzV8PitchEkjecFJII//l43dLOCzfWh8pHEe+vE= -github.com/prometheus/client_golang v1.20.2 h1:5ctymQzZlyOON1666svgwn3s6IKWgfbjsejTMiXIyjg= -github.com/prometheus/client_golang v1.20.2/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/pressly/goose/v3 v3.22.1 h1:2zICEfr1O3yTP9BRZMGPj7qFxQ+ik6yeo+z1LMuioLc= +github.com/pressly/goose/v3 v3.22.1/go.mod h1:xtMpbstWyCpyH+0cxLTMCENWBG+0CSxvTsXhW95d5eo= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= -github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= +github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/pseudomuto/protoc-gen-doc v1.5.1 h1:Ah259kcrio7Ix1Rhb6u8FCaOkzf9qRBqXnvAufg061w= @@ -682,16 +725,19 @@ github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4l github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= -github.com/quic-go/quic-go v0.47.0 h1:yXs3v7r2bm1wmPTYNLKAAJTHMYkPEsfYJmTazXrCZ7Y= -github.com/quic-go/quic-go v0.47.0/go.mod h1:3bCapYsJvXGZcipOHuu7plYtaV6tnF+z7wIFsU0WK9E= +github.com/quic-go/quic-go v0.48.2 h1:wsKXZPeGWpMpCGSWqOcqpW2wZYic/8T3aqiOID0/KWE= +github.com/quic-go/quic-go v0.48.2/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs= +github.com/raeperd/recvcheck v0.2.0 h1:GnU+NsbiCqdC2XX5+vMZzP+jAJC5fht7rcVTAhX74UI= +github.com/raeperd/recvcheck v0.2.0/go.mod h1:n04eYkwIR0JbgD73wT8wL4JjPC3wm0nFtzBnWNocnYU= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/riza-io/grpc-go v0.2.0 h1:2HxQKFVE7VuYstcJ8zqpN84VnAoJ4dCL6YFhJewNcHQ= github.com/riza-io/grpc-go v0.2.0/go.mod h1:2bDvR9KkKC3KhtlSHfR3dAXjUMT86kg4UfWFyVGWqi8= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= @@ -704,25 +750,26 @@ github.com/sagikazarmark/locafero v0.6.0 h1:ON7AQg37yzcRPU69mt7gwhFEBwxI6P9T4Qu3 github.com/sagikazarmark/locafero v0.6.0/go.mod h1:77OmuIc6VTraTXKXIs/uvUxKGUXjE1GbemJYHqdNjX0= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= -github.com/sanposhiho/wastedassign/v2 v2.0.7 h1:J+6nrY4VW+gC9xFzUc+XjPD3g3wF3je/NsJFwFK7Uxc= -github.com/sanposhiho/wastedassign/v2 v2.0.7/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= -github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= -github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= +github.com/sanposhiho/wastedassign/v2 v2.1.0 h1:crurBF7fJKIORrV85u9UUpePDYGWnwvv3+A96WvwXT0= +github.com/sanposhiho/wastedassign/v2 v2.1.0/go.mod h1:+oSmSC+9bQ+VUAxA66nBb0Z7N8CK7mscKTDYC6aIek4= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 h1:PKK9DyHxif4LZo+uQSgXNqs0jj5+xZwwfKHgph2lxBw= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.1/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= -github.com/sashamelentyev/usestdlibvars v1.27.0 h1:t/3jZpSXtRPRf2xr0m63i32ZrusyurIGT9E5wAvXQnI= -github.com/sashamelentyev/usestdlibvars v1.27.0/go.mod h1:9nl0jgOfHKWNFS43Ojw0i7aRoS4j6EBye3YBhmAIRF8= -github.com/schollz/progressbar/v3 v3.14.6 h1:GyjwcWBAf+GFDMLziwerKvpuS7ZF+mNTAXIB2aspiZs= -github.com/schollz/progressbar/v3 v3.14.6/go.mod h1:Nrzpuw3Nl0srLY0VlTvC4V6RL50pcEymjy6qyJAaLa0= -github.com/securego/gosec/v2 v2.21.2 h1:deZp5zmYf3TWwU7A7cR2+SolbTpZ3HQiwFqnzQyEl3M= -github.com/securego/gosec/v2 v2.21.2/go.mod h1:au33kg78rNseF5PwPnTWhuYBFf534bvJRvOrgZ/bFzU= +github.com/sashamelentyev/usestdlibvars v1.28.0 h1:jZnudE2zKCtYlGzLVreNp5pmCdOxXUzwsMDBkR21cyQ= +github.com/sashamelentyev/usestdlibvars v1.28.0/go.mod h1:9nl0jgOfHKWNFS43Ojw0i7aRoS4j6EBye3YBhmAIRF8= +github.com/schollz/progressbar/v3 v3.17.1 h1:bI1MTaoQO+v5kzklBjYNRQLoVpe0zbyRZNK6DFkVC5U= +github.com/schollz/progressbar/v3 v3.17.1/go.mod h1:RzqpnsPQNjUyIgdglUjRLgD7sVnxN1wpmBMV+UiEbL4= +github.com/securego/gosec/v2 v2.21.4 h1:Le8MSj0PDmOnHJgUATjD96PaXRvCpKC+DGJvwyy0Mlk= +github.com/securego/gosec/v2 v2.21.4/go.mod h1:Jtb/MwRQfRxCXyCm1rfM1BEiiiTfUOdyzzAhlr6lUTA= github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= -github.com/segmentio/encoding v0.4.0 h1:MEBYvRqiUB2nfR2criEXWqwdY6HJOUrCn5hboVOVmy8= -github.com/segmentio/encoding v0.4.0/go.mod h1:/d03Cd8PoaDeceuhUUUQWjU0KhWjrmYrWPgtJHYZSnI= +github.com/segmentio/encoding v0.4.1 h1:KLGaLSW0jrmhB58Nn4+98spfvPvmo4Ci1P/WIQ9wn7w= +github.com/segmentio/encoding v0.4.1/go.mod h1:/d03Cd8PoaDeceuhUUUQWjU0KhWjrmYrWPgtJHYZSnI= +github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/sethvargo/go-retry v0.2.4 h1:T+jHEQy/zKJf5s95UkguisicE0zuF9y7+/vgz08Ocec= -github.com/sethvargo/go-retry v0.2.4/go.mod h1:1afjQuvh7s4gflMObvjLPaWgluLLyhA1wmVZ6KLpICw= +github.com/sethvargo/go-retry v0.3.0 h1:EEt31A35QhrcRZtrYFDTBg91cqZVnFL2navjDrah2SE= +github.com/sethvargo/go-retry v0.3.0/go.mod h1:mNX17F0C/HguQMyMyJxcnU471gOZGxCLyYaFyAZraas= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -735,14 +782,16 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE= github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4= -github.com/sivchari/tenv v1.10.0 h1:g/hzMA+dBCKqGXgW8AV/1xIWhAvDrx0zFKNR48NFMg0= -github.com/sivchari/tenv v1.10.0/go.mod h1:tdY24masnVoZFxYrHv/nD6Tc8FbkEtAQEEziXpyMgqY= -github.com/sonatard/noctx v0.0.2 h1:L7Dz4De2zDQhW8S0t+KUjY0MAQJd6SgVwhzNIc4ok00= -github.com/sonatard/noctx v0.0.2/go.mod h1:kzFz+CzWSjQ2OzIm46uJZoXuBpa2+0y3T36U18dWqIo= +github.com/sivchari/tenv v1.12.1 h1:+E0QzjktdnExv/wwsnnyk4oqZBUfuh89YMQT1cyuvSY= +github.com/sivchari/tenv v1.12.1/go.mod h1:1LjSOUCc25snIr5n3DtGGrENhX3LuWefcplwVGC24mw= +github.com/sonatard/noctx v0.1.0 h1:JjqOc2WN16ISWAjAk8M5ej0RfExEXtkEyExl2hLW+OM= +github.com/sonatard/noctx v0.1.0/go.mod h1:0RvBxqY8D4j9cTTTWE8ylt2vqj2EPI8fHmrxHdsaZ2c= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0= github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= +github.com/speakeasy-api/openapi-overlay v0.9.0 h1:Wrz6NO02cNlLzx1fB093lBlYxSI54VRhy1aSutx0PQg= +github.com/speakeasy-api/openapi-overlay v0.9.0/go.mod h1:f5FloQrHA7MsxYg9djzMD5h6dxrHjVVByWKh7an8TRc= github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= @@ -758,8 +807,8 @@ github.com/sqlc-dev/sqlc v1.27.0 h1:wWc+401GLh0whLa30WmDkkl11lMBZuqvDvgu5OsaDiQ= github.com/sqlc-dev/sqlc v1.27.0/go.mod h1:wXAlx++Ed1eUhMeEKyXfeCO+ogPIN1adG5DdPavR4k0= github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stbenjam/no-sprintf-host-port v0.1.1 h1:tYugd/yrm1O0dV+ThCbaKZh195Dfm07ysF0U6JQXczc= -github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= +github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4= +github.com/stbenjam/no-sprintf-host-port v0.2.0/go.mod h1:eL0bQ9PasS0hsyTyfTjjG+E80QIyPnBVQbYZyv20Jfk= github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs= github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -777,38 +826,42 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/tdakkota/asciicheck v0.2.0 h1:o8jvnUANo0qXtnslk2d3nMKTFNlOnJjRrNcj0j9qkHM= -github.com/tdakkota/asciicheck v0.2.0/go.mod h1:Qb7Y9EgjCLJGup51gDHFzbI08/gbGhL/UVhYIPWG2rg= +github.com/tdakkota/asciicheck v0.3.0 h1:LqDGgZdholxZMaJgpM6b0U9CFIjDCbFdUF00bDnBKOQ= +github.com/tdakkota/asciicheck v0.3.0/go.mod h1:KoJKXuX/Z/lt6XzLo8WMBfQGzak0SrAKZlvRr4tg8Ac= github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA= github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag= github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= -github.com/tetafro/godot v1.4.17 h1:pGzu+Ye7ZUEFx7LHU0dAKmCOXWsPjl7qA6iMGndsjPs= -github.com/tetafro/godot v1.4.17/go.mod h1:2oVxTBSftRTh4+MVfUaUXR6bn2GDXCaMcOG4Dk3rfio= -github.com/tetratelabs/wazero v1.8.1 h1:NrcgVbWfkWvVc4UtT4LRLDf91PsOzDzefMdwhLfA550= -github.com/tetratelabs/wazero v1.8.1/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs= -github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 h1:quvGphlmUVU+nhpFa4gg4yJyTRJ13reZMDHrKwYw53M= -github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966/go.mod h1:27bSVNWSBOHm+qRp1T9qzaIpsWEP6TbUnei/43HK+PQ= -github.com/timonwong/loggercheck v0.9.4 h1:HKKhqrjcVj8sxL7K77beXh0adEm6DLjV/QOGeMXEVi4= -github.com/timonwong/loggercheck v0.9.4/go.mod h1:caz4zlPcgvpEkXgVnAJGowHAMW2NwHaNlpS8xDbVhTg= -github.com/tomarrell/wrapcheck/v2 v2.9.0 h1:801U2YCAjLhdN8zhZ/7tdjB3EnAoRlJHt/s+9hijLQ4= -github.com/tomarrell/wrapcheck/v2 v2.9.0/go.mod h1:g9vNIyhb5/9TQgumxQyOEqDHsmGYcGsVMOx/xGkqdMo= +github.com/tetafro/godot v1.4.20 h1:z/p8Ek55UdNvzt4TFn2zx2KscpW4rWqcnUrdmvWJj7E= +github.com/tetafro/godot v1.4.20/go.mod h1:2oVxTBSftRTh4+MVfUaUXR6bn2GDXCaMcOG4Dk3rfio= +github.com/tetratelabs/wazero v1.8.2 h1:yIgLR/b2bN31bjxwXHD8a3d+BogigR952csSDdLYEv4= +github.com/tetratelabs/wazero v1.8.2/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs= +github.com/timakin/bodyclose v0.0.0-20241017074812-ed6a65f985e3 h1:y4mJRFlM6fUyPhoXuFg/Yu02fg/nIPFMOY8tOqppoFg= +github.com/timakin/bodyclose v0.0.0-20241017074812-ed6a65f985e3/go.mod h1:mkjARE7Yr8qU23YcGMSALbIxTQ9r9QBVahQOBRfU460= +github.com/timonwong/loggercheck v0.10.1 h1:uVZYClxQFpw55eh+PIoqM7uAOHMrhVcDoWDery9R8Lg= +github.com/timonwong/loggercheck v0.10.1/go.mod h1:HEAWU8djynujaAVX7QI65Myb8qgfcZ1uKbdpg3ZzKl8= +github.com/tomarrell/wrapcheck/v2 v2.10.0 h1:SzRCryzy4IrAH7bVGG4cK40tNUhmVmMDuJujy4XwYDg= +github.com/tomarrell/wrapcheck/v2 v2.10.0/go.mod h1:g9vNIyhb5/9TQgumxQyOEqDHsmGYcGsVMOx/xGkqdMo= github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/ultraware/funlen v0.1.0 h1:BuqclbkY6pO+cvxoq7OsktIXZpgBSkYTQtmwhAK81vI= -github.com/ultraware/funlen v0.1.0/go.mod h1:XJqmOQja6DpxarLj6Jj1U7JuoS8PvL4nEqDaQhy22p4= -github.com/ultraware/whitespace v0.1.1 h1:bTPOGejYFulW3PkcrqkeQwOd6NKOOXvmGD9bo/Gk8VQ= -github.com/ultraware/whitespace v0.1.1/go.mod h1:XcP1RLD81eV4BW8UhQlpaR+SDc2givTvyI8a586WjW8= -github.com/uudashr/gocognit v1.1.3 h1:l+a111VcDbKfynh+airAy/DJQKaXh2m9vkoysMPSZyM= -github.com/uudashr/gocognit v1.1.3/go.mod h1:aKH8/e8xbTRBwjbCkwZ8qt4l2EpKXl31KMHgSS+lZ2U= +github.com/ultraware/funlen v0.2.0 h1:gCHmCn+d2/1SemTdYMiKLAHFYxTYz7z9VIDRaTGyLkI= +github.com/ultraware/funlen v0.2.0/go.mod h1:ZE0q4TsJ8T1SQcjmkhN/w+MceuatI6pBFSxxyteHIJA= +github.com/ultraware/whitespace v0.2.0 h1:TYowo2m9Nfj1baEQBjuHzvMRbp19i+RCcRYrSWoFa+g= +github.com/ultraware/whitespace v0.2.0/go.mod h1:XcP1RLD81eV4BW8UhQlpaR+SDc2givTvyI8a586WjW8= +github.com/uudashr/gocognit v1.2.0 h1:3BU9aMr1xbhPlvJLSydKwdLN3tEUUrzPSSM8S4hDYRA= +github.com/uudashr/gocognit v1.2.0/go.mod h1:k/DdKPI6XBZO1q7HgoV2juESI2/Ofj9AcHPZhBBdrTU= +github.com/uudashr/iface v1.3.0 h1:zwPch0fs9tdh9BmL5kcgSpvnObV+yHjO4JjVBl8IA10= +github.com/uudashr/iface v1.3.0/go.mod h1:4QvspiRd3JLPAEXBQ9AiZpLbJlrWWgRChOKDJEuQTdg= github.com/vbatts/tar-split v0.11.6 h1:4SjTW5+PU11n6fZenf2IPoV8/tz3AaYHMWjf23envGs= github.com/vbatts/tar-split v0.11.6/go.mod h1:dqKNtesIOr2j2Qv3W/cHjnvk9I8+G7oAkFDFN6TCBEI= +github.com/vmware-labs/yaml-jsonpath v0.3.2 h1:/5QKeCBGdsInyDCyVNLbXyilb61MXGi9NP674f9Hobk= +github.com/vmware-labs/yaml-jsonpath v0.3.2/go.mod h1:U6whw1z03QyqgWdgXxvVnQ90zN1BWz5V+51Ewf8k+rQ= github.com/wasilibs/go-pgquery v0.0.0-20240606042535-c0843d6592cc h1:Hgim1Xgk1+viV7p0aZh9OOrMRfG+E4mGA+JsI2uB0+k= github.com/wasilibs/go-pgquery v0.0.0-20240606042535-c0843d6592cc/go.mod h1:ah6UfXIl/oA0K3SbourB/UHggVJOBXwPZ2XudDmmFac= github.com/wasilibs/wazero-helpers v0.0.0-20240604052452-61d7981e9a38 h1:RBu75fhabyxyGJ2zhkoNuRyObBMhVeMoXqmeaPTg2CQ= @@ -834,8 +887,8 @@ gitlab.com/bosi/decorder v0.4.2 h1:qbQaV3zgwnBZ4zPMhGLW4KZe7A7NwxEhJx39R3shffo= gitlab.com/bosi/decorder v0.4.2/go.mod h1:muuhHoaJkA9QLcYHq4Mj8FJUwDZ+EirSHRiaTcTf6T8= go-simpler.org/assert v0.9.0 h1:PfpmcSvL7yAnWyChSjOz6Sp6m9j5lyK8Ok9pEL31YkQ= go-simpler.org/assert v0.9.0/go.mod h1:74Eqh5eI6vCK6Y5l3PI8ZYFXG4Sa+tkr70OIPJAUr28= -go-simpler.org/musttag v0.12.2 h1:J7lRc2ysXOq7eM8rwaTYnNrHd5JwjppzB6mScysB2Cs= -go-simpler.org/musttag v0.12.2/go.mod h1:uN1DVIasMTQKk6XSik7yrJoEysGtR2GRqvWnI9S7TYM= +go-simpler.org/musttag v0.13.0 h1:Q/YAW0AHvaoaIbsPj3bvEI5/QFP7w696IMUpnKXQfCE= +go-simpler.org/musttag v0.13.0/go.mod h1:FTzIGeK6OkKlUDVpj0iQUXZLUO1Js9+mvykDQy9C5yM= go-simpler.org/sloglint v0.7.2 h1:Wc9Em/Zeuu7JYpl+oKoYOsQSy2X560aVueCW/m6IijY= go-simpler.org/sloglint v0.7.2/go.mod h1:US+9C80ppl7VsThQclkM7BkCHQAzuz8kHLsW3ppuluo= go.lsp.dev/jsonrpc2 v0.10.0 h1:Pr/YcXJoEOTMc/b6OTmcR1DPJ3mSWl/SWiU1Cct6VmI= @@ -848,33 +901,35 @@ go.lsp.dev/uri v0.3.0 h1:KcZJmh6nFIBeJzTugn5JTU6OOyG0lDOo3R9KwTxTYbo= go.lsp.dev/uri v0.3.0/go.mod h1:P5sbO1IQR+qySTWOCnhnK7phBx+W3zbLqSMDJNTw88I= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 h1:ZIg3ZT/aQ7AfKqdwp7ECpOK6vHqquXXuyTjIO8ZdmPs= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0/go.mod h1:DQAwmETtZV00skUwgD6+0U89g80NKsJE3DCKeLLPQMI= -go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts= -go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 h1:nSiV3s7wiCam610XcLbYOmMfJxB9gO4uK3Xgv5gmTgg= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0/go.mod h1:hKn/e/Nmd19/x1gvIHwtOwVWM+VhuITSWip3JUDghj0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 h1:yd02MEjBdJkG3uabWP9apV+OuWRIXGDuJEUJbOHmCFU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q= +go.opentelemetry.io/otel v1.33.0 h1:/FerN9bax5LoK51X/sI0SVYrjSE0/yUL7DpxW4K3FWw= +go.opentelemetry.io/otel v1.33.0/go.mod h1:SUUkR6csvUQl+yjReHu5uM3EtVV7MBm5FHKRlNx4I8I= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.22.0 h1:FyjCyI9jVEfqhUh2MoSkmolPjfh5fp2hnV0b0irxH4Q= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.22.0/go.mod h1:hYwym2nDEeZfG/motx0p7L7J1N1vyzIThemQsb4g2qY= -go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w= -go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ= -go.opentelemetry.io/otel/sdk v1.30.0 h1:cHdik6irO49R5IysVhdn8oaiR9m8XluDaJAs4DfOrYE= -go.opentelemetry.io/otel/sdk v1.30.0/go.mod h1:p14X4Ok8S+sygzblytT1nqG98QG2KYKv++HE0LY/mhg= -go.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k= -go.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY= -go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc= -go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/otel/metric v1.33.0 h1:r+JOocAyeRVXD8lZpjdQjzMadVZp2M4WmQ+5WtEnklQ= +go.opentelemetry.io/otel/metric v1.33.0/go.mod h1:L9+Fyctbp6HFTddIxClbQkjtubW6O9QS3Ann/M82u6M= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= +go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= +go.opentelemetry.io/otel/trace v1.33.0 h1:cCJuF7LRjUFso9LPnEAHJDB2pqzp+hbO8eu1qqW2d/s= +go.opentelemetry.io/otel/trace v1.33.0/go.mod h1:uIcdVUZMpTAmz0tI1z04GoVSezK37CbGV4fr1f2nBck= +go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg= +go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= -go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= +go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= +go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= @@ -888,23 +943,24 @@ go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -go.uber.org/zap/exp v0.1.1-0.20240913022758-ede8e1888f83 h1:wpjRiPjppWaUIH+GC0bRvsdaH2K4Dw49dEJa7MX01Mk= -go.uber.org/zap/exp v0.1.1-0.20240913022758-ede8e1888f83/go.mod h1:5I384qq7XGxYyByIhHm6jg5CHkGY0nsTfbDLgDDlgJQ= +go.uber.org/zap/exp v0.3.0 h1:6JYzdifzYkGmTdRR59oYH+Ng7k49H9qVpWwNSsGJj3U= +go.uber.org/zap/exp v0.3.0/go.mod h1:5I384qq7XGxYyByIhHm6jg5CHkGY0nsTfbDLgDDlgJQ= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= -golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20241004190924-225e2abe05e6 h1:1wqE9dj9NpSm04INVsJhhEUzhuDVjbcyKH91sVyPATw= -golang.org/x/exp v0.0.0-20241004190924-225e2abe05e6/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8= +golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 h1:1UoZQm6f0P/ZO0w1Ri+f+ifG/gXhegadRdwBIXEFWDo= +golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f h1:phY1HzDcf18Aq9A8KkmRtY9WvOFIxN8wgfvy6Zm1DV8= -golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20241108190413-2d47ceb2692f h1:WTyX8eCCyfdqiPYkRGm0MqElSfYFH3yR1+rl/mct9sA= +golang.org/x/exp/typeparams v0.0.0-20241108190413-2d47ceb2692f/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -916,34 +972,42 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= -golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= -golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -954,18 +1018,25 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -976,6 +1047,7 @@ golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -986,18 +1058,22 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= -golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= -golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -1006,8 +1082,11 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1027,45 +1106,46 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= -golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= +golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8= +golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/api v0.0.0-20240930140551-af27646dc61f h1:jTm13A2itBi3La6yTGqn8bVSrc3ZZ1r8ENHlIXBfnRA= -google.golang.org/genproto/googleapis/api v0.0.0-20240930140551-af27646dc61f/go.mod h1:CLGoBuH1VHxAUXVPP8FfPwPEVJB6lz3URE5mY2SuayE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240930140551-af27646dc61f h1:cUMEy+8oS78BWIH9OWazBkzbr090Od9tWBNtZHkOhf0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240930140551-af27646dc61f/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/api v0.0.0-20241219192143-6b3ec007d9bb h1:B7GIB7sr443wZ/EAEl7VZjmh1V6qzkt5V+RYcUYtS1U= +google.golang.org/genproto/googleapis/api v0.0.0-20241219192143-6b3ec007d9bb/go.mod h1:E5//3O5ZIG2l71Xnt+P/CYUY8Bxs8E7WMoZ9tlcMbAY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241219192143-6b3ec007d9bb h1:3oy2tynMOP1QbTC0MsNNAV+Se8M2Bd0A5+x1QHyw+pI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241219192143-6b3ec007d9bb/go.mod h1:lcTa1sDdWEIHMWlITnIczmw5w60CF9ffkb8Z+DVmmjA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/grpc v1.69.2 h1:U3S9QEtbXC0bYNvRtcoklF3xGtLViumSYxWykJS+7AU= +google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 h1:F29+wU6Ee6qgu9TddPgooOdaqsxTMunOoj8KA5yuS5A= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1/go.mod h1:5KF+wpkbTSbGcR9zteSqZV6fqFOWBl4Yde8En8MryZA= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -1078,14 +1158,16 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk= +google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= @@ -1093,12 +1175,16 @@ gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 h1:6D+BvnJ/j6e222UW8s2qTSe3wGBtvo0MbVQG/c5k8RE= gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473/go.mod h1:N1eN2tsCx0Ydtgjl4cqmbRCsY4/+z4cYDeqwZTk6zog= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20191026110619-0b21df46bc1d/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -1132,8 +1218,8 @@ modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= -modernc.org/sqlite v1.31.1 h1:XVU0VyzxrYHlBhIs1DiEgSl0ZtdnPtbLVy8hSkzxGrs= -modernc.org/sqlite v1.31.1/go.mod h1:UqoylwmTb9F+IqXERT8bW9zzOWN8qwAIcLdzeBZs4hA= +modernc.org/sqlite v1.33.1 h1:trb6Z3YYoeM9eDL1O8do81kP+0ejv+YzgyFo+Gwy0nM= +modernc.org/sqlite v1.33.1/go.mod h1:pXV2xHxhzXZsgT/RtTFAPY6JJDEvOTcTdwADQCCWD4k= modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= diff --git a/tools/tools.go b/tools/tools.go index 123476def3..c0f5df0319 100644 --- a/tools/tools.go +++ b/tools/tools.go @@ -17,14 +17,13 @@ package tools //go:generate go install github.com/norwoodj/helm-docs/cmd/helm-docs //go:generate go install github.com/openfga/cli/cmd/fga //go:generate go install github.com/mikefarah/yq/v4 -//go:generate go install github.com/deepmap/oapi-codegen/v2/cmd/oapi-codegen +//go:generate go install github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen // nolint import ( _ "github.com/bufbuild/buf/cmd/buf" _ "github.com/daixiang0/gci" - _ "github.com/deepmap/oapi-codegen/v2/cmd/oapi-codegen" _ "github.com/go-critic/go-critic/cmd/gocritic" _ "github.com/golangci/golangci-lint/cmd/golangci-lint" _ "github.com/gotesttools/gotestfmt/v2/cmd/gotestfmt" @@ -32,6 +31,7 @@ import ( _ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2" _ "github.com/mikefarah/yq/v4" _ "github.com/norwoodj/helm-docs/cmd/helm-docs" + _ "github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen" _ "github.com/openfga/cli/cmd/fga" _ "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" _ "github.com/sqlc-dev/sqlc/cmd/sqlc"