From 8635cb1cfb78d134df93ebf48983cbf5748f51be Mon Sep 17 00:00:00 2001 From: Bruno Schaatsbergen Date: Wed, 30 Oct 2024 19:50:33 +0100 Subject: [PATCH 01/50] views: move retryLog hook to init view The cloud backend includes a retry hook that relies on a go-tfe implementation. Since these retry messages were not rendered through a view, the `-json` flag was not respected, leading to mixed (non-pure JSON) output in the terminal whenever retry messages were printed. Before passing the init view to the cloud backend, we ensure the retryLog hook is included in the init view. Signed-off-by: Bruno Schaatsbergen --- .../command/views/{cloud.go => hook_cloud.go} | 24 ++++++++++++------- internal/command/views/init.go | 14 +++++++++++ 2 files changed, 30 insertions(+), 8 deletions(-) rename internal/command/views/{cloud.go => hook_cloud.go} (78%) diff --git a/internal/command/views/cloud.go b/internal/command/views/hook_cloud.go similarity index 78% rename from internal/command/views/cloud.go rename to internal/command/views/hook_cloud.go index 4842360507c8..870111368ec4 100644 --- a/internal/command/views/cloud.go +++ b/internal/command/views/hook_cloud.go @@ -1,6 +1,3 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: BUSL-1.1 - package views import ( @@ -8,21 +5,32 @@ import ( "net/http" "strings" "time" + + "github.com/hashicorp/terraform/internal/terraform" ) -// CloudHooks provides functions that help with integrating directly into -// the go-tfe tfe.Client struct. -type CloudHooks struct { - // lastRetry is set to the last time a request was retried. +type RetryLogHook struct { + terraform.NilHook + + view *View + lastRetry time.Time } +var _ terraform.Hook = (*UiHook)(nil) + +func NewRetryLoghook(view *View) *RetryLogHook { + return &RetryLogHook{ + view: view, + } +} + // RetryLogHook returns a string providing an update about a request from the // client being retried. // // If colorize is true, then the value returned by this function should be // processed by a colorizer. -func (hooks *CloudHooks) RetryLogHook(attemptNum int, resp *http.Response, colorize bool) string { +func (hooks *RetryLogHook) RetryLogHook(attemptNum int, resp *http.Response, colorize bool) string { // Ignore the first retry to make sure any delayed output will // be written to the console before we start logging retries. // diff --git a/internal/command/views/init.go b/internal/command/views/init.go index 92868d11615f..e21d1403eb75 100644 --- a/internal/command/views/init.go +++ b/internal/command/views/init.go @@ -10,12 +10,14 @@ import ( "time" "github.com/hashicorp/terraform/internal/command/arguments" + "github.com/hashicorp/terraform/internal/terraform" "github.com/hashicorp/terraform/internal/tfdiags" ) // The Init view is used for the init command. type Init interface { Diagnostics(diags tfdiags.Diagnostics) + Hooks() []terraform.Hook Output(messageCode InitMessageCode, params ...any) LogInitMessage(messageCode InitMessageCode, params ...any) Log(message string, params ...any) @@ -50,6 +52,12 @@ func (v *InitHuman) Diagnostics(diags tfdiags.Diagnostics) { v.view.Diagnostics(diags) } +func (v *InitHuman) Hooks() []terraform.Hook { + return []terraform.Hook{ + NewRetryLoghook(v.view), + } +} + func (v *InitHuman) Output(messageCode InitMessageCode, params ...any) { v.view.streams.Println(v.PrepareMessage(messageCode, params...)) } @@ -90,6 +98,12 @@ func (v *InitJSON) Diagnostics(diags tfdiags.Diagnostics) { v.view.Diagnostics(diags) } +func (v *InitJSON) Hooks() []terraform.Hook { + return []terraform.Hook{ + NewRetryLoghook(v.view.view), + } +} + func (v *InitJSON) Output(messageCode InitMessageCode, params ...any) { // don't add empty messages to json output preppedMessage := v.PrepareMessage(messageCode, params...) From f5dc158709899fce290a039155250177f3d61a6e Mon Sep 17 00:00:00 2001 From: Bruno Schaatsbergen Date: Wed, 30 Oct 2024 19:57:11 +0100 Subject: [PATCH 02/50] views: render retry messages using the view Signed-off-by: Bruno Schaatsbergen --- internal/command/views/hook_cloud.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/command/views/hook_cloud.go b/internal/command/views/hook_cloud.go index 870111368ec4..a9130d29d91b 100644 --- a/internal/command/views/hook_cloud.go +++ b/internal/command/views/hook_cloud.go @@ -52,7 +52,7 @@ func (hooks *RetryLogHook) RetryLogHook(attemptNum int, resp *http.Response, col if colorize { return strings.TrimSpace(fmt.Sprintf("[reset][yellow]%s[reset]", msg)) } - return strings.TrimSpace(msg) + return hooks.view.colorize.Color(strings.TrimSpace(msg)) } // The newline in this error is to make it look good in the CLI! From f9797595e36744dcd12c70de09050f7b3016c9b2 Mon Sep 17 00:00:00 2001 From: Bruno Schaatsbergen Date: Wed, 30 Oct 2024 22:51:15 +0100 Subject: [PATCH 03/50] chore: initialize new view in meta backend Signed-off-by: Bruno Schaatsbergen --- internal/backend/backendrun/cli.go | 4 ++++ internal/cloud/backend.go | 8 ++++---- internal/cloud/backend_cli.go | 2 ++ internal/command/meta_backend.go | 8 +++++--- .../views/{hook_cloud.go => hook_retry_log.go} | 11 +++++++---- internal/command/views/test.go | 8 ++++---- 6 files changed, 26 insertions(+), 15 deletions(-) rename internal/command/views/{hook_cloud.go => hook_retry_log.go} (80%) diff --git a/internal/backend/backendrun/cli.go b/internal/backend/backendrun/cli.go index 01fd90b0d004..eeae51ae28db 100644 --- a/internal/backend/backendrun/cli.go +++ b/internal/backend/backendrun/cli.go @@ -8,6 +8,7 @@ import ( "github.com/mitchellh/colorstring" "github.com/hashicorp/terraform/internal/backend" + "github.com/hashicorp/terraform/internal/command/views" "github.com/hashicorp/terraform/internal/terminal" "github.com/hashicorp/terraform/internal/terraform" ) @@ -60,6 +61,9 @@ type CLIOpts struct { // for tailoring the output to fit the attached terminal, for example. Streams *terminal.Streams + //FIXME: something + View *views.View + // StatePath is the local path where state is read from. // // StateOutPath is the local path where the state will be written. diff --git a/internal/cloud/backend.go b/internal/cloud/backend.go index 9d20de77553e..f9ea25f3956b 100644 --- a/internal/cloud/backend.go +++ b/internal/cloud/backend.go @@ -65,9 +65,8 @@ type Cloud struct { // client is the HCP Terraform or Terraform Enterprise API client. client *tfe.Client - // viewHooks implements functions integrating the tfe.Client with the CLI - // output. - viewHooks views.CloudHooks + //FIXME: something + View *views.View // Hostname of HCP Terraform or Terraform Enterprise Hostname string @@ -607,7 +606,8 @@ func cliConfigToken(hostname svchost.Hostname, services *disco.Disco) (string, e // backend to log any connection issues to prevent data loss. func (b *Cloud) retryLogHook(attemptNum int, resp *http.Response) { if b.CLI != nil { - if output := b.viewHooks.RetryLogHook(attemptNum, resp, true); len(output) > 0 { + retryLogHook := views.NewRetryLoghook(b.View) + if output := retryLogHook.RetryLogHook(attemptNum, resp, true); len(output) > 0 { b.CLI.Output(b.Colorize().Color(output)) } } diff --git a/internal/cloud/backend_cli.go b/internal/cloud/backend_cli.go index c63746ec037d..5d5bf1f98c41 100644 --- a/internal/cloud/backend_cli.go +++ b/internal/cloud/backend_cli.go @@ -25,6 +25,8 @@ func (b *Cloud) CLIInit(opts *backendrun.CLIOpts) error { Streams: opts.Streams, Colorize: opts.CLIColor, } + //FIXME: something + b.View = opts.View return nil } diff --git a/internal/command/meta_backend.go b/internal/command/meta_backend.go index de9c8772820c..9337b754eb1a 100644 --- a/internal/command/meta_backend.go +++ b/internal/command/meta_backend.go @@ -386,9 +386,11 @@ func (m *Meta) backendCLIOpts() (*backendrun.CLIOpts, error) { return nil, err } return &backendrun.CLIOpts{ - CLI: m.Ui, - CLIColor: m.Colorize(), - Streams: m.Streams, + CLI: m.Ui, + CLIColor: m.Colorize(), + Streams: m.Streams, + //FIXME: something + View: views.NewView(m.Streams), StatePath: m.statePath, StateOutPath: m.stateOutPath, StateBackupPath: m.backupPath, diff --git a/internal/command/views/hook_cloud.go b/internal/command/views/hook_retry_log.go similarity index 80% rename from internal/command/views/hook_cloud.go rename to internal/command/views/hook_retry_log.go index a9130d29d91b..fa1df2fcc409 100644 --- a/internal/command/views/hook_cloud.go +++ b/internal/command/views/hook_retry_log.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: BUSL-1.1 + package views import ( @@ -30,7 +33,7 @@ func NewRetryLoghook(view *View) *RetryLogHook { // // If colorize is true, then the value returned by this function should be // processed by a colorizer. -func (hooks *RetryLogHook) RetryLogHook(attemptNum int, resp *http.Response, colorize bool) string { +func (hook *RetryLogHook) RetryLogHook(attemptNum int, resp *http.Response, colorize bool) string { // Ignore the first retry to make sure any delayed output will // be written to the console before we start logging retries. // @@ -38,7 +41,7 @@ func (hooks *RetryLogHook) RetryLogHook(attemptNum int, resp *http.Response, col // requests and server errors, but in the cloud backend we only // care about server errors so we ignore rate limit (429) errors. if attemptNum == 0 || (resp != nil && resp.StatusCode == 429) { - hooks.lastRetry = time.Now() + hook.lastRetry = time.Now() return "" } @@ -46,13 +49,13 @@ func (hooks *RetryLogHook) RetryLogHook(attemptNum int, resp *http.Response, col if attemptNum == 1 { msg = initialRetryError } else { - msg = fmt.Sprintf(repeatedRetryError, time.Since(hooks.lastRetry).Round(time.Second)) + msg = fmt.Sprintf(repeatedRetryError, time.Since(hook.lastRetry).Round(time.Second)) } if colorize { return strings.TrimSpace(fmt.Sprintf("[reset][yellow]%s[reset]", msg)) } - return hooks.view.colorize.Color(strings.TrimSpace(msg)) + return hook.view.colorize.Color(strings.TrimSpace(msg)) } // The newline in this error is to make it look good in the CLI! diff --git a/internal/command/views/test.go b/internal/command/views/test.go index 2fbb85a56318..5c363ede381d 100644 --- a/internal/command/views/test.go +++ b/internal/command/views/test.go @@ -101,7 +101,7 @@ func NewTest(vt arguments.ViewType, view *View) Test { } type TestHuman struct { - CloudHooks + RetryLogHook view *View } @@ -371,11 +371,11 @@ func (t *TestHuman) TFCStatusUpdate(status tfe.TestRunStatus, elapsed time.Durat } func (t *TestHuman) TFCRetryHook(attemptNum int, resp *http.Response) { - t.view.streams.Println(t.view.colorize.Color(t.RetryLogHook(attemptNum, resp, true))) + t.view.streams.Println(t.view.colorize.Color(t.RetryLogHook.RetryLogHook(attemptNum, resp, true))) } type TestJSON struct { - CloudHooks + RetryLogHook view *JSONView } @@ -730,7 +730,7 @@ func (t *TestJSON) TFCStatusUpdate(status tfe.TestRunStatus, elapsed time.Durati func (t *TestJSON) TFCRetryHook(attemptNum int, resp *http.Response) { t.view.log.Error( - t.RetryLogHook(attemptNum, resp, false), + t.RetryLogHook.RetryLogHook(attemptNum, resp, false), "type", json.MessageTestRetry, ) } From a90930427a68d446138fec3af6d9b2ad27e55d01 Mon Sep 17 00:00:00 2001 From: Bruno Schaatsbergen Date: Fri, 1 Nov 2024 11:47:09 +0100 Subject: [PATCH 04/50] chore: remove the retrylog hook from the init view Signed-off-by: Bruno Schaatsbergen --- internal/cloud/backend.go | 4 ++-- internal/command/views/hook_retry_log.go | 2 +- internal/command/views/init.go | 14 -------------- 3 files changed, 3 insertions(+), 17 deletions(-) diff --git a/internal/cloud/backend.go b/internal/cloud/backend.go index f9ea25f3956b..8d7f43b85983 100644 --- a/internal/cloud/backend.go +++ b/internal/cloud/backend.go @@ -606,8 +606,8 @@ func cliConfigToken(hostname svchost.Hostname, services *disco.Disco) (string, e // backend to log any connection issues to prevent data loss. func (b *Cloud) retryLogHook(attemptNum int, resp *http.Response) { if b.CLI != nil { - retryLogHook := views.NewRetryLoghook(b.View) - if output := retryLogHook.RetryLogHook(attemptNum, resp, true); len(output) > 0 { + h := views.NewRetryLoghook(b.View) + if output := h.RetryLogHook(attemptNum, resp, true); len(output) > 0 { b.CLI.Output(b.Colorize().Color(output)) } } diff --git a/internal/command/views/hook_retry_log.go b/internal/command/views/hook_retry_log.go index fa1df2fcc409..b0c59ad2ab1e 100644 --- a/internal/command/views/hook_retry_log.go +++ b/internal/command/views/hook_retry_log.go @@ -55,7 +55,7 @@ func (hook *RetryLogHook) RetryLogHook(attemptNum int, resp *http.Response, colo if colorize { return strings.TrimSpace(fmt.Sprintf("[reset][yellow]%s[reset]", msg)) } - return hook.view.colorize.Color(strings.TrimSpace(msg)) + return strings.TrimSpace(msg) } // The newline in this error is to make it look good in the CLI! diff --git a/internal/command/views/init.go b/internal/command/views/init.go index e21d1403eb75..92868d11615f 100644 --- a/internal/command/views/init.go +++ b/internal/command/views/init.go @@ -10,14 +10,12 @@ import ( "time" "github.com/hashicorp/terraform/internal/command/arguments" - "github.com/hashicorp/terraform/internal/terraform" "github.com/hashicorp/terraform/internal/tfdiags" ) // The Init view is used for the init command. type Init interface { Diagnostics(diags tfdiags.Diagnostics) - Hooks() []terraform.Hook Output(messageCode InitMessageCode, params ...any) LogInitMessage(messageCode InitMessageCode, params ...any) Log(message string, params ...any) @@ -52,12 +50,6 @@ func (v *InitHuman) Diagnostics(diags tfdiags.Diagnostics) { v.view.Diagnostics(diags) } -func (v *InitHuman) Hooks() []terraform.Hook { - return []terraform.Hook{ - NewRetryLoghook(v.view), - } -} - func (v *InitHuman) Output(messageCode InitMessageCode, params ...any) { v.view.streams.Println(v.PrepareMessage(messageCode, params...)) } @@ -98,12 +90,6 @@ func (v *InitJSON) Diagnostics(diags tfdiags.Diagnostics) { v.view.Diagnostics(diags) } -func (v *InitJSON) Hooks() []terraform.Hook { - return []terraform.Hook{ - NewRetryLoghook(v.view.view), - } -} - func (v *InitJSON) Output(messageCode InitMessageCode, params ...any) { // don't add empty messages to json output preppedMessage := v.PrepareMessage(messageCode, params...) From 377c959c33a182f34f31d3692f6f285fb21bce83 Mon Sep 17 00:00:00 2001 From: Bruno Schaatsbergen Date: Fri, 1 Nov 2024 15:40:51 +0100 Subject: [PATCH 05/50] views: add cloud view The cloud view is responsible for rendering messages related to cloud operations, presenting them to the user in either a human-readable format or as JSON output in the terminal. Signed-off-by: Bruno Schaatsbergen --- internal/command/views/cloud.go | 196 +++++++++++++++++++++++ internal/command/views/hook_retry_log.go | 67 -------- 2 files changed, 196 insertions(+), 67 deletions(-) create mode 100644 internal/command/views/cloud.go delete mode 100644 internal/command/views/hook_retry_log.go diff --git a/internal/command/views/cloud.go b/internal/command/views/cloud.go new file mode 100644 index 000000000000..314171eca267 --- /dev/null +++ b/internal/command/views/cloud.go @@ -0,0 +1,196 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: BUSL-1.1 + +package views + +import ( + "encoding/json" + "fmt" + "net/http" + "strings" + "time" + + "github.com/hashicorp/terraform/internal/command/arguments" + "github.com/hashicorp/terraform/internal/tfdiags" +) + +// The Cloud view is used for operations that are specific to cloud operations. +type Cloud interface { + RetryLog(attemptNum int, resp *http.Response) + Diagnostics(diags tfdiags.Diagnostics) + Output(messageCode CloudMessageCode, params ...any) +} + +// NewCloud returns Cloud implementation for the given ViewType. +func NewCloud(vt arguments.ViewType, view *View) Cloud { + switch vt { + case arguments.ViewJSON: + return &CloudJSON{ + view: NewJSONView(view), + } + case arguments.ViewHuman: + return &CloudHuman{ + view: view, + } + default: + panic(fmt.Sprintf("unknown view type %v", vt)) + } +} + +// The CloudHuman implementation renders human-readable text logs, suitable for +// a scrolling terminal. +type CloudHuman struct { + view *View + + lastRetry time.Time +} + +var _ Cloud = (*CloudHuman)(nil) + +func (v *CloudHuman) Diagnostics(diags tfdiags.Diagnostics) { + v.view.Diagnostics(diags) +} + +func (v *CloudHuman) RetryLog(attemptNum int, resp *http.Response) { + // Ignore the first retry to make sure any delayed output will + // be written to the console before we start logging retries. + // + // The retry logic in the TFE client will retry both rate limited + // requests and server errors, but in the cloud backend we only + // care about server errors so we ignore rate limit (429) errors. + if attemptNum == 0 || (resp != nil && resp.StatusCode == 429) { + v.lastRetry = time.Now() + return + } + + var msg string + if attemptNum == 1 { + msg = v.PrepareMessage(InitialRetryErrorMessage) + } else { + msg = v.PrepareMessage(RepeatedRetryErrorMessage, time.Since(v.lastRetry).Round(time.Second)) + } + + v.view.streams.Println(msg) +} + +func (v *CloudHuman) Output(messageCode CloudMessageCode, params ...any) { + v.view.streams.Println(v.PrepareMessage(messageCode, params...)) +} + +func (v *CloudHuman) PrepareMessage(messageCode CloudMessageCode, params ...any) string { + message, ok := CloudMessageRegistry[messageCode] + if !ok { + // display the message code as fallback if not found in the message registry + return string(messageCode) + } + + if message.HumanValue == "" { + // no need to apply colorization if the message is empty + return message.HumanValue + } + + return v.view.colorize.Color(strings.TrimSpace(fmt.Sprintf(message.HumanValue, params...))) +} + +// The CloudJSON implementation renders streaming JSON logs, suitable for +// integrating with other software. +type CloudJSON struct { + view *JSONView + + lastRetry time.Time +} + +var _ Cloud = (*CloudJSON)(nil) + +func (v *CloudJSON) Diagnostics(diags tfdiags.Diagnostics) { + v.view.Diagnostics(diags) +} + +func (v *CloudJSON) RetryLog(attemptNum int, resp *http.Response) { + // Ignore the first retry to make sure any delayed output will + // be written to the console before we start logging retries. + // + // The retry logic in the TFE client will retry both rate limited + // requests and server errors, but in the cloud backend we only + // care about server errors so we ignore rate limit (429) errors. + if attemptNum == 0 || (resp != nil && resp.StatusCode == 429) { + v.lastRetry = time.Now() + return + } + + var msg string + if attemptNum == 1 { + msg = v.PrepareMessage(InitialRetryErrorMessage) + } else { + msg = v.PrepareMessage(RepeatedRetryErrorMessage, time.Since(v.lastRetry).Round(time.Second)) + } + + v.view.view.streams.Println(msg) +} + +func (v *CloudJSON) Output(messageCode CloudMessageCode, params ...any) { + // don't add empty messages to json output + preppedMessage := v.PrepareMessage(messageCode, params...) + if preppedMessage == "" { + return + } + + current_timestamp := time.Now().UTC().Format(time.RFC3339) + json_data := map[string]string{ + "@level": "info", + "@message": preppedMessage, + "@module": "terraform.ui", + "@timestamp": current_timestamp, + "type": "cloud_output", + "message_code": string(messageCode), + } + + cloud_output, _ := json.Marshal(json_data) + v.view.view.streams.Println(string(cloud_output)) +} + +func (v *CloudJSON) PrepareMessage(messageCode CloudMessageCode, params ...any) string { + message, ok := CloudMessageRegistry[messageCode] + if !ok { + // display the message code as fallback if not found in the message registry + return string(messageCode) + } + + return strings.TrimSpace(fmt.Sprintf(message.JSONValue, params...)) +} + +// CloudMessage represents a message string in both json and human decorated text format. +type CloudMessage struct { + HumanValue string + JSONValue string +} + +var CloudMessageRegistry map[CloudMessageCode]CloudMessage = map[CloudMessageCode]CloudMessage{ + "initial_retry_error_message": { + HumanValue: initialRetryError, + JSONValue: initialRetryErrorJSON, + }, + "repeated_retry_error_message": { + HumanValue: repeatdRetryError, + JSONValue: repeatdRetryErrorJSON, + }, +} + +type CloudMessageCode string + +const ( + InitialRetryErrorMessage CloudMessageCode = "initial_retry_error_message" + RepeatedRetryErrorMessage CloudMessageCode = "repeated_retry_error_message" +) + +const initialRetryError = `[reset][yellow] +There was an error connecting to HCP Terraform. Please do not exit +Terraform to prevent data loss! Trying to restore the connection...[reset] +` +const initialRetryErrorJSON = ` +There was an error connecting to HCP Terraform. Please do not exit +Terraform to prevent data loss! Trying to restore the connection... +` + +const repeatdRetryError = `[reset][yellow]Still trying to restore the connection... (%s elapsed)[reset]` +const repeatdRetryErrorJSON = `Still trying to restore the connection... (%s elapsed)` diff --git a/internal/command/views/hook_retry_log.go b/internal/command/views/hook_retry_log.go deleted file mode 100644 index b0c59ad2ab1e..000000000000 --- a/internal/command/views/hook_retry_log.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: BUSL-1.1 - -package views - -import ( - "fmt" - "net/http" - "strings" - "time" - - "github.com/hashicorp/terraform/internal/terraform" -) - -type RetryLogHook struct { - terraform.NilHook - - view *View - - lastRetry time.Time -} - -var _ terraform.Hook = (*UiHook)(nil) - -func NewRetryLoghook(view *View) *RetryLogHook { - return &RetryLogHook{ - view: view, - } -} - -// RetryLogHook returns a string providing an update about a request from the -// client being retried. -// -// If colorize is true, then the value returned by this function should be -// processed by a colorizer. -func (hook *RetryLogHook) RetryLogHook(attemptNum int, resp *http.Response, colorize bool) string { - // Ignore the first retry to make sure any delayed output will - // be written to the console before we start logging retries. - // - // The retry logic in the TFE client will retry both rate limited - // requests and server errors, but in the cloud backend we only - // care about server errors so we ignore rate limit (429) errors. - if attemptNum == 0 || (resp != nil && resp.StatusCode == 429) { - hook.lastRetry = time.Now() - return "" - } - - var msg string - if attemptNum == 1 { - msg = initialRetryError - } else { - msg = fmt.Sprintf(repeatedRetryError, time.Since(hook.lastRetry).Round(time.Second)) - } - - if colorize { - return strings.TrimSpace(fmt.Sprintf("[reset][yellow]%s[reset]", msg)) - } - return strings.TrimSpace(msg) -} - -// The newline in this error is to make it look good in the CLI! -const initialRetryError = ` -There was an error connecting to HCP Terraform. Please do not exit -Terraform to prevent data loss! Trying to restore the connection... -` - -const repeatedRetryError = "Still trying to restore the connection... (%s elapsed)" From d8bfe7a80b378bf6ebdaaa194a68d217eba3e4d9 Mon Sep 17 00:00:00 2001 From: Bruno Schaatsbergen Date: Fri, 1 Nov 2024 16:18:26 +0100 Subject: [PATCH 06/50] cloud: Initialize a new cloud view in the backend to render messages based on view type. Signed-off-by: Bruno Schaatsbergen --- internal/backend/backendrun/cli.go | 8 +++++--- internal/cloud/backend.go | 8 ++------ internal/cloud/backend_cli.go | 5 +++-- internal/command/meta_backend.go | 13 ++++++++----- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/internal/backend/backendrun/cli.go b/internal/backend/backendrun/cli.go index eeae51ae28db..c731ef4f5ed8 100644 --- a/internal/backend/backendrun/cli.go +++ b/internal/backend/backendrun/cli.go @@ -8,7 +8,7 @@ import ( "github.com/mitchellh/colorstring" "github.com/hashicorp/terraform/internal/backend" - "github.com/hashicorp/terraform/internal/command/views" + "github.com/hashicorp/terraform/internal/command/arguments" "github.com/hashicorp/terraform/internal/terminal" "github.com/hashicorp/terraform/internal/terraform" ) @@ -61,8 +61,10 @@ type CLIOpts struct { // for tailoring the output to fit the attached terminal, for example. Streams *terminal.Streams - //FIXME: something - View *views.View + // FIXME: Temporarily exposing ViewType to the backend. + // This is a workaround until the backend is refactored to support + // native View handling. + ViewType arguments.ViewType // StatePath is the local path where state is read from. // diff --git a/internal/cloud/backend.go b/internal/cloud/backend.go index 8d7f43b85983..6595c84ac7d0 100644 --- a/internal/cloud/backend.go +++ b/internal/cloud/backend.go @@ -65,8 +65,7 @@ type Cloud struct { // client is the HCP Terraform or Terraform Enterprise API client. client *tfe.Client - //FIXME: something - View *views.View + View views.Cloud // Hostname of HCP Terraform or Terraform Enterprise Hostname string @@ -606,10 +605,7 @@ func cliConfigToken(hostname svchost.Hostname, services *disco.Disco) (string, e // backend to log any connection issues to prevent data loss. func (b *Cloud) retryLogHook(attemptNum int, resp *http.Response) { if b.CLI != nil { - h := views.NewRetryLoghook(b.View) - if output := h.RetryLogHook(attemptNum, resp, true); len(output) > 0 { - b.CLI.Output(b.Colorize().Color(output)) - } + b.View.RetryLog(attemptNum, resp) } } diff --git a/internal/cloud/backend_cli.go b/internal/cloud/backend_cli.go index 5d5bf1f98c41..60edc2711b4b 100644 --- a/internal/cloud/backend_cli.go +++ b/internal/cloud/backend_cli.go @@ -6,6 +6,7 @@ package cloud import ( "github.com/hashicorp/terraform/internal/backend/backendrun" "github.com/hashicorp/terraform/internal/command/jsonformat" + "github.com/hashicorp/terraform/internal/command/views" ) // CLIInit implements backendrun.CLI @@ -25,8 +26,8 @@ func (b *Cloud) CLIInit(opts *backendrun.CLIOpts) error { Streams: opts.Streams, Colorize: opts.CLIColor, } - //FIXME: something - b.View = opts.View + view := views.NewView(opts.Streams) + b.View = views.NewCloud(opts.ViewType, view) return nil } diff --git a/internal/command/meta_backend.go b/internal/command/meta_backend.go index 9337b754eb1a..65155be5ae9c 100644 --- a/internal/command/meta_backend.go +++ b/internal/command/meta_backend.go @@ -151,6 +151,11 @@ func (m *Meta) Backend(opts *BackendOpts) (backendrun.OperationsBackend, tfdiags } cliOpts.Validation = true + // FIXME: Temporarily exposing ViewType to the backend. + // This is a workaround until the backend is refactored to support + // native View handling. + cliOpts.ViewType = opts.ViewType + // If the backend supports CLI initialization, do it. if cli, ok := b.(backendrun.CLI); ok { if err := cli.CLIInit(cliOpts); err != nil { @@ -386,11 +391,9 @@ func (m *Meta) backendCLIOpts() (*backendrun.CLIOpts, error) { return nil, err } return &backendrun.CLIOpts{ - CLI: m.Ui, - CLIColor: m.Colorize(), - Streams: m.Streams, - //FIXME: something - View: views.NewView(m.Streams), + CLI: m.Ui, + CLIColor: m.Colorize(), + Streams: m.Streams, StatePath: m.statePath, StateOutPath: m.stateOutPath, StateBackupPath: m.backupPath, From 6c14e52d8e7802eae7e94631e3a2d73db6b797fc Mon Sep 17 00:00:00 2001 From: Bruno Schaatsbergen Date: Fri, 1 Nov 2024 16:18:42 +0100 Subject: [PATCH 07/50] test: use Cloud view Signed-off-by: Bruno Schaatsbergen --- internal/command/views/test.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/internal/command/views/test.go b/internal/command/views/test.go index 5c363ede381d..742df1887dd8 100644 --- a/internal/command/views/test.go +++ b/internal/command/views/test.go @@ -101,7 +101,7 @@ func NewTest(vt arguments.ViewType, view *View) Test { } type TestHuman struct { - RetryLogHook + Cloud view *View } @@ -371,11 +371,11 @@ func (t *TestHuman) TFCStatusUpdate(status tfe.TestRunStatus, elapsed time.Durat } func (t *TestHuman) TFCRetryHook(attemptNum int, resp *http.Response) { - t.view.streams.Println(t.view.colorize.Color(t.RetryLogHook.RetryLogHook(attemptNum, resp, true))) + t.Cloud.RetryLog(attemptNum, resp) } type TestJSON struct { - RetryLogHook + Cloud view *JSONView } @@ -729,10 +729,7 @@ func (t *TestJSON) TFCStatusUpdate(status tfe.TestRunStatus, elapsed time.Durati } func (t *TestJSON) TFCRetryHook(attemptNum int, resp *http.Response) { - t.view.log.Error( - t.RetryLogHook.RetryLogHook(attemptNum, resp, false), - "type", json.MessageTestRetry, - ) + t.Cloud.RetryLog(attemptNum, resp) } // TestJUnitXMLFile produces a JUnit XML file at the conclusion of a test From 09ddfc039ff270e43ae80373d335f485fc6c07e3 Mon Sep 17 00:00:00 2001 From: Bruno Schaatsbergen Date: Mon, 4 Nov 2024 16:31:05 +0100 Subject: [PATCH 08/50] docs: add a comment to the View field Signed-off-by: Bruno Schaatsbergen --- internal/cloud/backend.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/cloud/backend.go b/internal/cloud/backend.go index 6595c84ac7d0..b2b862553583 100644 --- a/internal/cloud/backend.go +++ b/internal/cloud/backend.go @@ -65,6 +65,7 @@ type Cloud struct { // client is the HCP Terraform or Terraform Enterprise API client. client *tfe.Client + // View handles rendering output in human-readable or machine-readable format from cloud-specific operations. View views.Cloud // Hostname of HCP Terraform or Terraform Enterprise From 1e80cd8e103e40158d818c796ff8d38206344aef Mon Sep 17 00:00:00 2001 From: Bruno Schaatsbergen Date: Mon, 4 Nov 2024 18:04:08 +0100 Subject: [PATCH 09/50] cloud: clarify reason for guard statement Added a comment to explain the rationale behind the guard statement, which prevents potential nil errors during backend initialization and retryLogHook call. Signed-off-by: Bruno Schaatsbergen --- internal/cloud/backend.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/internal/cloud/backend.go b/internal/cloud/backend.go index b2b862553583..4a017eae66af 100644 --- a/internal/cloud/backend.go +++ b/internal/cloud/backend.go @@ -605,6 +605,13 @@ func cliConfigToken(hostname svchost.Hostname, services *disco.Disco) (string, e // retryLogHook is invoked each time a request is retried allowing the // backend to log any connection issues to prevent data loss. func (b *Cloud) retryLogHook(attemptNum int, resp *http.Response) { + // FIXME: This guard statement prevents a potential nil error + // due to the way the backend is initialized and the context from which + // this function is called. + // + // In a future refactor, we should ensure that views are natively supported + // in backends and allow for calling a View directly within the + // backend.Configure method. if b.CLI != nil { b.View.RetryLog(attemptNum, resp) } From c9f418d85376fef81bb61cecb9679888d2025330 Mon Sep 17 00:00:00 2001 From: Bruno Schaatsbergen Date: Mon, 4 Nov 2024 18:47:21 +0100 Subject: [PATCH 10/50] views: add PrepareMessage to cloud view interface Signed-off-by: Bruno Schaatsbergen --- internal/command/views/cloud.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/command/views/cloud.go b/internal/command/views/cloud.go index 314171eca267..8b9d4adeef73 100644 --- a/internal/command/views/cloud.go +++ b/internal/command/views/cloud.go @@ -19,6 +19,7 @@ type Cloud interface { RetryLog(attemptNum int, resp *http.Response) Diagnostics(diags tfdiags.Diagnostics) Output(messageCode CloudMessageCode, params ...any) + PrepareMessage(messageCode CloudMessageCode, params ...any) string } // NewCloud returns Cloud implementation for the given ViewType. From ad1f3e0adcb3f4d4ae03041ee2561d2a4ea1a441 Mon Sep 17 00:00:00 2001 From: Bruno Schaatsbergen Date: Mon, 4 Nov 2024 18:47:34 +0100 Subject: [PATCH 11/50] views: add tests for cloud view Signed-off-by: Bruno Schaatsbergen --- internal/command/views/cloud_test.go | 262 +++++++++++++++++++++++++++ 1 file changed, 262 insertions(+) create mode 100644 internal/command/views/cloud_test.go diff --git a/internal/command/views/cloud_test.go b/internal/command/views/cloud_test.go new file mode 100644 index 000000000000..358a895bddc4 --- /dev/null +++ b/internal/command/views/cloud_test.go @@ -0,0 +1,262 @@ +package views + +import ( + "fmt" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/hashicorp/hcl/v2" + "github.com/hashicorp/terraform/internal/command/arguments" + "github.com/hashicorp/terraform/internal/terminal" + "github.com/hashicorp/terraform/internal/tfdiags" + tfversion "github.com/hashicorp/terraform/version" +) + +func TestNewCloud_unsupportedViewDiagnostics(t *testing.T) { + defer func() { + r := recover() + if r == nil { + t.Fatalf("should panic with unsupported view type raw") + } else if r != "unknown view type raw" { + t.Fatalf("unexpected panic message: %v", r) + } + }() + + streams, done := terminal.StreamsForTesting(t) + defer done(t) + + NewCloud(arguments.ViewRaw, NewView(streams).SetRunningInAutomation(true)) +} + +func TestNewCloud_humanViewOutput(t *testing.T) { + t.Run("no param", func(t *testing.T) { + streams, done := terminal.StreamsForTesting(t) + + newCloud := NewCloud(arguments.ViewHuman, NewView(streams).SetRunningInAutomation(true)) + if _, ok := newCloud.(*CloudHuman); !ok { + t.Fatalf("unexpected return type %t", newCloud) + } + + newCloud.Output(InitialRetryErrorMessage) + + actual := done(t).All() + expected := "There was an error connecting to HCP Terraform. Please do not exit\nTerraform to prevent data loss! Trying to restore the connection..." + if !strings.Contains(actual, expected) { + t.Fatalf("expected output to contain: %s, but got %s", expected, actual) + } + }) + + t.Run("single param", func(t *testing.T) { + streams, done := terminal.StreamsForTesting(t) + + newCloud := NewCloud(arguments.ViewHuman, NewView(streams).SetRunningInAutomation(true)) + if _, ok := newCloud.(*CloudHuman); !ok { + t.Fatalf("unexpected return type %t", newCloud) + } + + duration := 5 * time.Second + newCloud.Output(RepeatedRetryErrorMessage, duration) + + actual := done(t).All() + expected := fmt.Sprintf("Still trying to restore the connection... (%s elapsed)", duration) + if !strings.Contains(actual, expected) { + t.Fatalf("expected output to contain: %s, but got %s", expected, actual) + } + }) +} + +func TestNewCloud_humanViewPrepareMessage(t *testing.T) { + t.Run("existing message code", func(t *testing.T) { + streams, _ := terminal.StreamsForTesting(t) + + newCloud := NewCloud(arguments.ViewHuman, NewView(streams).SetRunningInAutomation(true)) + if _, ok := newCloud.(*CloudHuman); !ok { + t.Fatalf("unexpected return type %t", newCloud) + } + + want := "\nThere was an error connecting to HCP Terraform. Please do not exit\nTerraform to prevent data loss! Trying to restore the connection..." + + actual := newCloud.PrepareMessage(InitialRetryErrorMessage) + if !cmp.Equal(want, actual) { + t.Errorf("unexpected output: %s", cmp.Diff(want, actual)) + } + }) +} + +func TestNewCloud_humanViewDiagnostics(t *testing.T) { + streams, done := terminal.StreamsForTesting(t) + + newCloud := NewCloud(arguments.ViewHuman, NewView(streams).SetRunningInAutomation(true)) + if _, ok := newCloud.(*CloudHuman); !ok { + t.Fatalf("unexpected return type %t", newCloud) + } + + diags := getHCPDiags(t) + newCloud.Diagnostics(diags) + + actual := done(t).All() + expected := "\nError: Error connecting to HCP\n\nCould not connect to HCP Terraform. Check your network.\n\nError: Network Timeout\n\nConnection to HCP timed out. Check your network.\n" + if !strings.Contains(actual, expected) { + t.Fatalf("expected output to contain: %s, but got %s", expected, actual) + } +} + +func TestNewCloud_jsonViewOutput(t *testing.T) { + t.Run("no param", func(t *testing.T) { + streams, done := terminal.StreamsForTesting(t) + + newCloud := NewCloud(arguments.ViewJSON, NewView(streams).SetRunningInAutomation(true)) + if _, ok := newCloud.(*CloudJSON); !ok { + t.Fatalf("unexpected return type %t", newCloud) + } + + newCloud.Output(InitialRetryErrorMessage) + + version := tfversion.String() + want := []map[string]interface{}{ + { + "@level": "info", + "@message": fmt.Sprintf("Terraform %s", version), + "@module": "terraform.ui", + "terraform": version, + "type": "version", + "ui": JSON_UI_VERSION, + }, + { + "@level": "info", + "@message": "There was an error connecting to HCP Terraform. Please do not exit\nTerraform to prevent data loss! Trying to restore the connection...", + "message_code": "initial_retry_error_message", + "@module": "terraform.ui", + "type": "cloud_output", + }, + } + + actual := done(t).Stdout() + testJSONViewOutputEqualsFull(t, actual, want) + }) + + t.Run("single param", func(t *testing.T) { + streams, done := terminal.StreamsForTesting(t) + + newCloud := NewCloud(arguments.ViewJSON, NewView(streams).SetRunningInAutomation(true)) + if _, ok := newCloud.(*CloudJSON); !ok { + t.Fatalf("unexpected return type %t", newCloud) + } + + duration := 5 * time.Second + newCloud.Output(RepeatedRetryErrorMessage, duration) + + version := tfversion.String() + want := []map[string]interface{}{ + { + "@level": "info", + "@message": fmt.Sprintf("Terraform %s", version), + "@module": "terraform.ui", + "terraform": version, + "type": "version", + "ui": JSON_UI_VERSION, + }, + { + "@level": "info", + "@message": fmt.Sprintf("Still trying to restore the connection... (%s elapsed)", duration), + "@module": "terraform.ui", + "message_code": "repeated_retry_error_message", + "type": "cloud_output", + }, + } + + actual := done(t).Stdout() + testJSONViewOutputEqualsFull(t, actual, want) + }) +} + +func TestNewCloud_jsonViewPrepareMessage(t *testing.T) { + t.Run("existing message code", func(t *testing.T) { + streams, _ := terminal.StreamsForTesting(t) + + newCloud := NewCloud(arguments.ViewJSON, NewView(streams).SetRunningInAutomation(true)) + if _, ok := newCloud.(*CloudJSON); !ok { + t.Fatalf("unexpected return type %t", newCloud) + } + + want := "There was an error connecting to HCP Terraform. Please do not exit\nTerraform to prevent data loss! Trying to restore the connection..." + + actual := newCloud.PrepareMessage(InitialRetryErrorMessage) + if !cmp.Equal(want, actual) { + t.Errorf("unexpected output: %s", cmp.Diff(want, actual)) + } + }) +} + +func TestNewCloud_jsonViewDiagnostics(t *testing.T) { + streams, done := terminal.StreamsForTesting(t) + + newCloud := NewCloud(arguments.ViewJSON, NewView(streams).SetRunningInAutomation(true)) + if _, ok := newCloud.(*CloudJSON); !ok { + t.Fatalf("unexpected return type %t", newCloud) + } + + diags := getHCPDiags(t) // Assuming you want to use the HCP diagnostics here + newCloud.Diagnostics(diags) + + version := tfversion.String() + want := []map[string]interface{}{ + { + "@level": "info", + "@message": fmt.Sprintf("Terraform %s", version), + "@module": "terraform.ui", + "terraform": version, + "type": "version", + "ui": JSON_UI_VERSION, + }, + { + "@level": "error", + "@message": "Error: Error connecting to HCP", + "@module": "terraform.ui", + "diagnostic": map[string]interface{}{ + "severity": "error", + "summary": "Error connecting to HCP", + "detail": "Could not connect to HCP Terraform. Check your network.", + }, + "type": "diagnostic", + }, + { + "@level": "error", + "@message": "Error: Network Timeout", + "@module": "terraform.ui", + "diagnostic": map[string]interface{}{ + "severity": "error", + "summary": "Network Timeout", + "detail": "Connection to HCP timed out. Check your network.", + }, + "type": "diagnostic", + }, + } + + actual := done(t).Stdout() + testJSONViewOutputEqualsFull(t, actual, want) +} + +// These are mock error messages created solely for testing connectivity issues. +func getHCPDiags(t *testing.T) tfdiags.Diagnostics { + t.Helper() + + var diags tfdiags.Diagnostics + diags = diags.Append( + tfdiags.Sourceless( + tfdiags.Error, + "Error connecting to HCP", + "Could not connect to HCP Terraform. Check your network.", + ), + &hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Network Timeout", + Detail: "Connection to HCP timed out. Check your network.", + Subject: nil, + }, + ) + + return diags +} From c71a1a775e20e6c642a4c9e74f030961d7082bd1 Mon Sep 17 00:00:00 2001 From: Bruno Schaatsbergen Date: Wed, 6 Nov 2024 06:29:03 -0600 Subject: [PATCH 12/50] views: refactor retry logic with retryHelper function Signed-off-by: Bruno Schaatsbergen --- internal/command/views/cloud.go | 72 ++++++++++++++++----------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/internal/command/views/cloud.go b/internal/command/views/cloud.go index 8b9d4adeef73..66f1cb0ef350 100644 --- a/internal/command/views/cloud.go +++ b/internal/command/views/cloud.go @@ -53,25 +53,11 @@ func (v *CloudHuman) Diagnostics(diags tfdiags.Diagnostics) { } func (v *CloudHuman) RetryLog(attemptNum int, resp *http.Response) { - // Ignore the first retry to make sure any delayed output will - // be written to the console before we start logging retries. - // - // The retry logic in the TFE client will retry both rate limited - // requests and server errors, but in the cloud backend we only - // care about server errors so we ignore rate limit (429) errors. - if attemptNum == 0 || (resp != nil && resp.StatusCode == 429) { - v.lastRetry = time.Now() - return - } - - var msg string - if attemptNum == 1 { - msg = v.PrepareMessage(InitialRetryErrorMessage) - } else { - msg = v.PrepareMessage(RepeatedRetryErrorMessage, time.Since(v.lastRetry).Round(time.Second)) + msg := retryLogMessage(attemptNum, resp, &v.lastRetry) + // retryLogMessage returns an empty string for the first attempt or rate-limited responses + if msg != "" { + v.Output(msg) } - - v.view.streams.Println(msg) } func (v *CloudHuman) Output(messageCode CloudMessageCode, params ...any) { @@ -108,25 +94,11 @@ func (v *CloudJSON) Diagnostics(diags tfdiags.Diagnostics) { } func (v *CloudJSON) RetryLog(attemptNum int, resp *http.Response) { - // Ignore the first retry to make sure any delayed output will - // be written to the console before we start logging retries. - // - // The retry logic in the TFE client will retry both rate limited - // requests and server errors, but in the cloud backend we only - // care about server errors so we ignore rate limit (429) errors. - if attemptNum == 0 || (resp != nil && resp.StatusCode == 429) { - v.lastRetry = time.Now() - return - } - - var msg string - if attemptNum == 1 { - msg = v.PrepareMessage(InitialRetryErrorMessage) - } else { - msg = v.PrepareMessage(RepeatedRetryErrorMessage, time.Since(v.lastRetry).Round(time.Second)) + msg := retryLogMessage(attemptNum, resp, &v.lastRetry) + // retryLogMessage returns an empty string for the first attempt or rate-limited responses + if msg != "" { + v.Output(msg) } - - v.view.view.streams.Println(msg) } func (v *CloudJSON) Output(messageCode CloudMessageCode, params ...any) { @@ -195,3 +167,31 @@ Terraform to prevent data loss! Trying to restore the connection... const repeatdRetryError = `[reset][yellow]Still trying to restore the connection... (%s elapsed)[reset]` const repeatdRetryErrorJSON = `Still trying to restore the connection... (%s elapsed)` + +// retryLogMessage determines the appropriate retry message based on the attempt number +// and the response status, and updates the `lastRetry` timestamp. It returns a +// message code that indicates whether a retry message should be logged. +// +// The `RetryLog` function uses the returned message to decide if the retry message +// should be logged, based on the retry attempt and response status. +// +// The function: +// - Skips logging for the first retry or if the response indicates a rate-limited request (HTTP 429). +// - Logs an initial retry message on the first retry attempt. +// - Logs a repeated retry message on subsequent attempts, including the elapsed time since the last retry. +func retryLogMessage(attemptNum int, resp *http.Response, lastRetry *time.Time) CloudMessageCode { + // Ignore the first retry to ensure any delayed output is written before logging retries. + // Skip rate-limited requests (HTTP 429), which are handled differently. + if attemptNum == 0 || (resp != nil && resp.StatusCode == 429) { + *lastRetry = time.Now() // Update the retry timestamp + return "" // No message to log + } + + // Return the initial retry message on the first retry attempt + if attemptNum == 1 { + return InitialRetryErrorMessage + } + + // Return a repeated retry message with the time since the last retry for subsequent attempts + return CloudMessageCode(fmt.Sprint(RepeatedRetryErrorMessage, time.Since(*lastRetry).Round(time.Second))) +} From 93ae38dadfd0634160aafce59294d455e7302f6c Mon Sep 17 00:00:00 2001 From: Bruno Schaatsbergen Date: Wed, 6 Nov 2024 13:52:56 -0600 Subject: [PATCH 13/50] views: add tests for cloud view Signed-off-by: Bruno Schaatsbergen --- internal/command/views/cloud_test.go | 223 ++++++++++++++++++++++----- 1 file changed, 186 insertions(+), 37 deletions(-) diff --git a/internal/command/views/cloud_test.go b/internal/command/views/cloud_test.go index 358a895bddc4..63167fffddfc 100644 --- a/internal/command/views/cloud_test.go +++ b/internal/command/views/cloud_test.go @@ -2,11 +2,11 @@ package views import ( "fmt" + "net/http" "strings" "testing" "time" - "github.com/google/go-cmp/cmp" "github.com/hashicorp/hcl/v2" "github.com/hashicorp/terraform/internal/command/arguments" "github.com/hashicorp/terraform/internal/terminal" @@ -14,6 +14,71 @@ import ( tfversion "github.com/hashicorp/terraform/version" ) +func TestNewCloudHuman_RetryLog(t *testing.T) { + t.Run("first retry, no output", func(t *testing.T) { + streams, done := terminal.StreamsForTesting(t) + newCloud := NewCloud(arguments.ViewHuman, NewView(streams).SetRunningInAutomation(true)) + cloudHuman, ok := newCloud.(*CloudHuman) + if !ok { + t.Fatalf("unexpected return type %T", newCloud) + } + + cloudHuman.RetryLog(0, nil) + output := done(t).All() + if output != "" { + t.Fatalf("expected no output for the first retry attempt, but got: %s", output) + } + }) + + t.Run("second retry, server error", func(t *testing.T) { + streams, done := terminal.StreamsForTesting(t) + newCloud := NewCloud(arguments.ViewHuman, NewView(streams).SetRunningInAutomation(true)) + cloudHuman, ok := newCloud.(*CloudHuman) + if !ok { + t.Fatalf("unexpected return type %T", newCloud) + } + + cloudHuman.RetryLog(1, &http.Response{StatusCode: 500}) + output := done(t).All() + expected := "There was an error connecting to HCP Terraform. Please do not exit\nTerraform to prevent data loss! Trying to restore the connection..." + if !strings.Contains(output, expected) { + t.Fatalf("expected output to contain: %s, but got %s", expected, output) + } + }) + + t.Run("subsequent retry with elapsed time", func(t *testing.T) { + streams, done := terminal.StreamsForTesting(t) + newCloud := NewCloud(arguments.ViewHuman, NewView(streams).SetRunningInAutomation(true)) + cloudHuman, ok := newCloud.(*CloudHuman) + if !ok { + t.Fatalf("unexpected return type %T", newCloud) + } + + cloudHuman.lastRetry = time.Now().Add(-2 * time.Second) // Simulate a delay of 2 seconds + cloudHuman.RetryLog(2, &http.Response{StatusCode: 500}) + output := done(t).All() + expected := "Still trying to restore the connection... (2s elapsed)" + if !strings.Contains(output, expected) { + t.Fatalf("expected output to contain: %s, but got %s", expected, output) + } + }) + + t.Run("retry with 429 status, no output", func(t *testing.T) { + streams, done := terminal.StreamsForTesting(t) + newCloud := NewCloud(arguments.ViewHuman, NewView(streams).SetRunningInAutomation(true)) + cloudHuman, ok := newCloud.(*CloudHuman) + if !ok { + t.Fatalf("unexpected return type %T", newCloud) + } + + cloudHuman.RetryLog(2, &http.Response{StatusCode: 429}) + output := done(t).All() + if output != "" { + t.Fatalf("expected no output for status code 429, but got: %s", output) + } + }) +} + func TestNewCloud_unsupportedViewDiagnostics(t *testing.T) { defer func() { r := recover() @@ -67,24 +132,6 @@ func TestNewCloud_humanViewOutput(t *testing.T) { }) } -func TestNewCloud_humanViewPrepareMessage(t *testing.T) { - t.Run("existing message code", func(t *testing.T) { - streams, _ := terminal.StreamsForTesting(t) - - newCloud := NewCloud(arguments.ViewHuman, NewView(streams).SetRunningInAutomation(true)) - if _, ok := newCloud.(*CloudHuman); !ok { - t.Fatalf("unexpected return type %t", newCloud) - } - - want := "\nThere was an error connecting to HCP Terraform. Please do not exit\nTerraform to prevent data loss! Trying to restore the connection..." - - actual := newCloud.PrepareMessage(InitialRetryErrorMessage) - if !cmp.Equal(want, actual) { - t.Errorf("unexpected output: %s", cmp.Diff(want, actual)) - } - }) -} - func TestNewCloud_humanViewDiagnostics(t *testing.T) { streams, done := terminal.StreamsForTesting(t) @@ -103,16 +150,41 @@ func TestNewCloud_humanViewDiagnostics(t *testing.T) { } } -func TestNewCloud_jsonViewOutput(t *testing.T) { - t.Run("no param", func(t *testing.T) { +func TestNewCloudJSON_RetryLog(t *testing.T) { + t.Run("attempt 0, no output", func(t *testing.T) { streams, done := terminal.StreamsForTesting(t) + newCloud := NewCloud(arguments.ViewJSON, NewView(streams).SetRunningInAutomation(true)) + cloudJSON, ok := newCloud.(*CloudJSON) + if !ok { + t.Fatalf("unexpected return type %T", newCloud) + } + cloudJSON.RetryLog(0, nil) + + version := tfversion.String() + want := []map[string]interface{}{ + { + "@level": "info", + "@message": fmt.Sprintf("Terraform %s", version), + "@module": "terraform.ui", + "terraform": version, + "type": "version", + "ui": JSON_UI_VERSION, + }, + } + actual := done(t).Stdout() + testJSONViewOutputEqualsFull(t, actual, want) + }) + + t.Run("attempt 1, server error", func(t *testing.T) { + streams, done := terminal.StreamsForTesting(t) newCloud := NewCloud(arguments.ViewJSON, NewView(streams).SetRunningInAutomation(true)) - if _, ok := newCloud.(*CloudJSON); !ok { - t.Fatalf("unexpected return type %t", newCloud) + cloudJSON, ok := newCloud.(*CloudJSON) + if !ok { + t.Fatalf("unexpected return type %T", newCloud) } - newCloud.Output(InitialRetryErrorMessage) + cloudJSON.RetryLog(1, &http.Response{StatusCode: 500}) version := tfversion.String() want := []map[string]interface{}{ @@ -132,12 +204,74 @@ func TestNewCloud_jsonViewOutput(t *testing.T) { "type": "cloud_output", }, } + actual := done(t).Stdout() + testJSONViewOutputEqualsFull(t, actual, want) + }) + + t.Run("subsequent retry with elapsed time", func(t *testing.T) { + streams, done := terminal.StreamsForTesting(t) + newCloud := NewCloud(arguments.ViewJSON, NewView(streams).SetRunningInAutomation(true)) + cloudJSON, ok := newCloud.(*CloudJSON) + if !ok { + t.Fatalf("unexpected return type %T", newCloud) + } + + cloudJSON.lastRetry = time.Now().Add(-2 * time.Second) // Simulate a delay of 2 seconds + cloudJSON.RetryLog(2, &http.Response{StatusCode: 500}) + + version := tfversion.String() + want := []map[string]interface{}{ + { + "@level": "info", + "@message": fmt.Sprintf("Terraform %s", version), + "@module": "terraform.ui", + "terraform": version, + "type": "version", + "ui": JSON_UI_VERSION, + }, + { + "@level": "info", + "@message": "Still trying to restore the connection... (2s elapsed)", + "message_code": "repeated_retry_error_message", + "@module": "terraform.ui", + "type": "cloud_output", + }, + } actual := done(t).Stdout() testJSONViewOutputEqualsFull(t, actual, want) }) - t.Run("single param", func(t *testing.T) { + t.Run("retry with 429 status, no output", func(t *testing.T) { + streams, done := terminal.StreamsForTesting(t) + newCloud := NewCloud(arguments.ViewJSON, NewView(streams).SetRunningInAutomation(true)) + cloudJSON, ok := newCloud.(*CloudJSON) + if !ok { + t.Fatalf("unexpected return type %T", newCloud) + } + + cloudJSON.RetryLog(0, &http.Response{ + StatusCode: http.StatusTooManyRequests, // HTTP: 429 + }) + + version := tfversion.String() + want := []map[string]interface{}{ + { + "@level": "info", + "@message": fmt.Sprintf("Terraform %s", version), + "@module": "terraform.ui", + "terraform": version, + "type": "version", + "ui": JSON_UI_VERSION, + }, + } + actual := done(t).Stdout() + testJSONViewOutputEqualsFull(t, actual, want) + }) +} + +func TestNewCloud_jsonViewOutput(t *testing.T) { + t.Run("no param", func(t *testing.T) { streams, done := terminal.StreamsForTesting(t) newCloud := NewCloud(arguments.ViewJSON, NewView(streams).SetRunningInAutomation(true)) @@ -145,8 +279,7 @@ func TestNewCloud_jsonViewOutput(t *testing.T) { t.Fatalf("unexpected return type %t", newCloud) } - duration := 5 * time.Second - newCloud.Output(RepeatedRetryErrorMessage, duration) + newCloud.Output(InitialRetryErrorMessage) version := tfversion.String() want := []map[string]interface{}{ @@ -160,9 +293,9 @@ func TestNewCloud_jsonViewOutput(t *testing.T) { }, { "@level": "info", - "@message": fmt.Sprintf("Still trying to restore the connection... (%s elapsed)", duration), + "@message": "There was an error connecting to HCP Terraform. Please do not exit\nTerraform to prevent data loss! Trying to restore the connection...", + "message_code": "initial_retry_error_message", "@module": "terraform.ui", - "message_code": "repeated_retry_error_message", "type": "cloud_output", }, } @@ -170,23 +303,39 @@ func TestNewCloud_jsonViewOutput(t *testing.T) { actual := done(t).Stdout() testJSONViewOutputEqualsFull(t, actual, want) }) -} -func TestNewCloud_jsonViewPrepareMessage(t *testing.T) { - t.Run("existing message code", func(t *testing.T) { - streams, _ := terminal.StreamsForTesting(t) + t.Run("single param", func(t *testing.T) { + streams, done := terminal.StreamsForTesting(t) newCloud := NewCloud(arguments.ViewJSON, NewView(streams).SetRunningInAutomation(true)) if _, ok := newCloud.(*CloudJSON); !ok { t.Fatalf("unexpected return type %t", newCloud) } - want := "There was an error connecting to HCP Terraform. Please do not exit\nTerraform to prevent data loss! Trying to restore the connection..." + duration := 5 * time.Second + newCloud.Output(RepeatedRetryErrorMessage, duration) - actual := newCloud.PrepareMessage(InitialRetryErrorMessage) - if !cmp.Equal(want, actual) { - t.Errorf("unexpected output: %s", cmp.Diff(want, actual)) + version := tfversion.String() + want := []map[string]interface{}{ + { + "@level": "info", + "@message": fmt.Sprintf("Terraform %s", version), + "@module": "terraform.ui", + "terraform": version, + "type": "version", + "ui": JSON_UI_VERSION, + }, + { + "@level": "info", + "@message": fmt.Sprintf("Still trying to restore the connection... (%s elapsed)", duration), + "@module": "terraform.ui", + "message_code": "repeated_retry_error_message", + "type": "cloud_output", + }, } + + actual := done(t).Stdout() + testJSONViewOutputEqualsFull(t, actual, want) }) } From 94c732b7a5fbb6c8f6ecec87f41c6f3b40b03f78 Mon Sep 17 00:00:00 2001 From: Bruno Schaatsbergen Date: Wed, 6 Nov 2024 13:52:47 -0600 Subject: [PATCH 14/50] views: refactor RetryLog to use an elapsed time Signed-off-by: Bruno Schaatsbergen --- internal/command/views/cloud.go | 59 ++++++++++++++++----------------- 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/internal/command/views/cloud.go b/internal/command/views/cloud.go index 66f1cb0ef350..d99e5c137c3f 100644 --- a/internal/command/views/cloud.go +++ b/internal/command/views/cloud.go @@ -53,10 +53,14 @@ func (v *CloudHuman) Diagnostics(diags tfdiags.Diagnostics) { } func (v *CloudHuman) RetryLog(attemptNum int, resp *http.Response) { - msg := retryLogMessage(attemptNum, resp, &v.lastRetry) - // retryLogMessage returns an empty string for the first attempt or rate-limited responses + msg, elapsed := retryLogMessage(attemptNum, resp, &v.lastRetry) + // retryLogMessage returns an empty string for the first attempt or for rate-limited responses (HTTP 429) if msg != "" { - v.Output(msg) + if elapsed != nil { + v.Output(msg, elapsed) + } else { + v.Output(msg) + } } } @@ -94,10 +98,14 @@ func (v *CloudJSON) Diagnostics(diags tfdiags.Diagnostics) { } func (v *CloudJSON) RetryLog(attemptNum int, resp *http.Response) { - msg := retryLogMessage(attemptNum, resp, &v.lastRetry) - // retryLogMessage returns an empty string for the first attempt or rate-limited responses + msg, elapsed := retryLogMessage(attemptNum, resp, &v.lastRetry) + // retryLogMessage returns an empty string for the first attempt or for rate-limited responses (HTTP 429) if msg != "" { - v.Output(msg) + if elapsed != nil { + v.Output(msg, elapsed) + } else { + v.Output(msg) + } } } @@ -144,8 +152,8 @@ var CloudMessageRegistry map[CloudMessageCode]CloudMessage = map[CloudMessageCod JSONValue: initialRetryErrorJSON, }, "repeated_retry_error_message": { - HumanValue: repeatdRetryError, - JSONValue: repeatdRetryErrorJSON, + HumanValue: repeatedRetryError, + JSONValue: repeatedRetryErrorJSON, }, } @@ -165,33 +173,22 @@ There was an error connecting to HCP Terraform. Please do not exit Terraform to prevent data loss! Trying to restore the connection... ` -const repeatdRetryError = `[reset][yellow]Still trying to restore the connection... (%s elapsed)[reset]` -const repeatdRetryErrorJSON = `Still trying to restore the connection... (%s elapsed)` - -// retryLogMessage determines the appropriate retry message based on the attempt number -// and the response status, and updates the `lastRetry` timestamp. It returns a -// message code that indicates whether a retry message should be logged. -// -// The `RetryLog` function uses the returned message to decide if the retry message -// should be logged, based on the retry attempt and response status. -// -// The function: -// - Skips logging for the first retry or if the response indicates a rate-limited request (HTTP 429). -// - Logs an initial retry message on the first retry attempt. -// - Logs a repeated retry message on subsequent attempts, including the elapsed time since the last retry. -func retryLogMessage(attemptNum int, resp *http.Response, lastRetry *time.Time) CloudMessageCode { - // Ignore the first retry to ensure any delayed output is written before logging retries. - // Skip rate-limited requests (HTTP 429), which are handled differently. +const repeatedRetryError = `[reset][yellow]Still trying to restore the connection... (%s elapsed)[reset]` +const repeatedRetryErrorJSON = `Still trying to restore the connection... (%s elapsed)` + +func retryLogMessage(attemptNum int, resp *http.Response, lastRetry *time.Time) (CloudMessageCode, *time.Duration) { + // Skips logging for the first attempt or for rate-limited requests (HTTP 429) if attemptNum == 0 || (resp != nil && resp.StatusCode == 429) { - *lastRetry = time.Now() // Update the retry timestamp - return "" // No message to log + *lastRetry = time.Now() // Update the retry timestamp for subsequent attempts + return "", nil } - // Return the initial retry message on the first retry attempt + // Logs initial retry message on the first retry attempt if attemptNum == 1 { - return InitialRetryErrorMessage + return InitialRetryErrorMessage, nil } - // Return a repeated retry message with the time since the last retry for subsequent attempts - return CloudMessageCode(fmt.Sprint(RepeatedRetryErrorMessage, time.Since(*lastRetry).Round(time.Second))) + // Logs repeated retry message on subsequent attempts with elapsed time + elapsed := time.Since(*lastRetry).Round(time.Second) + return RepeatedRetryErrorMessage, &elapsed } From ad96f4161c571f67ff0359bd0c01f98cadd14b49 Mon Sep 17 00:00:00 2001 From: Brandon Croft Date: Thu, 31 Oct 2024 12:29:23 -0600 Subject: [PATCH 15/50] Prefer kv tags when tags defined as set This will prevent duplicate workspace tags from being created when set tags are matched using kv bindings, or vice-versa. --- internal/cloud/backend.go | 151 ++++++++++++++++++++---------- internal/cloud/backend_test.go | 32 ++++++- internal/cloud/testing.go | 18 ++++ internal/cloud/tfe_client_mock.go | 40 +++++--- 4 files changed, 177 insertions(+), 64 deletions(-) diff --git a/internal/cloud/backend.go b/internal/cloud/backend.go index 9d20de77553e..74f646e2bcd6 100644 --- a/internal/cloud/backend.go +++ b/internal/cloud/backend.go @@ -11,6 +11,7 @@ import ( "net/http" "net/url" "os" + "slices" "sort" "strings" "sync" @@ -46,7 +47,7 @@ const ( genericHostname = "localterraform.com" ) -var ErrCloudDoesNotSupportKVTags = errors.New("your version of Terraform Enterprise does not support key-value tags. Please upgrade to a version that supports this feature.") +var ErrCloudDoesNotSupportKVTags = errors.New("your version of Terraform Enterprise does not support key-value tags. Please upgrade Terraform Enterprise to a version that supports this feature or use set type tags instead.") // Cloud is an implementation of EnhancedBackend in service of the HCP Terraform or Terraform Enterprise // integration for Terraform CLI. This backend is not intended to be surfaced at the user level and @@ -632,7 +633,18 @@ func (b *Cloud) Workspaces() ([]string, error) { if b.WorkspaceMapping.Strategy() == WorkspaceTagsStrategy { options.Tags = strings.Join(b.WorkspaceMapping.TagsAsSet, ",") } else if b.WorkspaceMapping.Strategy() == WorkspaceKVTagsStrategy { - options.TagBindings = b.WorkspaceMapping.tfeTagBindings() + options.TagBindings = b.WorkspaceMapping.asTFETagBindings() + + // Populate keys, too, just in case backend does not support key/value tags. + // The backend will end up applying both filters but that should always + // be the same result set anyway. + for _, tag := range options.TagBindings { + if options.Tags != "" { + options.Tags = options.Tags + "," + } + options.Tags = options.Tags + tag.Key + } + } log.Printf("[TRACE] cloud: Listing workspaces with tag bindings %q", b.WorkspaceMapping.DescribeTags()) @@ -760,7 +772,7 @@ func (b *Cloud) StateMgr(name string) (statemgr.Full, error) { if b.WorkspaceMapping.Strategy() == WorkspaceTagsStrategy { workspaceCreateOptions.Tags = b.WorkspaceMapping.tfeTags() } else if b.WorkspaceMapping.Strategy() == WorkspaceKVTagsStrategy { - workspaceCreateOptions.TagBindings = b.WorkspaceMapping.tfeTagBindings() + workspaceCreateOptions.TagBindings = b.WorkspaceMapping.asTFETagBindings() } // Create project if not exists, otherwise use it @@ -813,26 +825,24 @@ func (b *Cloud) StateMgr(name string) (statemgr.Full, error) { } } - updateRequired, err := b.workspaceTagsRequireUpdate(context.Background(), workspace, b.WorkspaceMapping) - if updateRequired { - if err != nil { - if errors.Is(err, tfe.ErrResourceNotFound) { - return nil, fmt.Errorf("workspace %s does not exist or access to it is unauthorized", name) - } else if errors.Is(err, ErrCloudDoesNotSupportKVTags) { - return nil, err + tagCheck, errFromTagCheck := b.workspaceTagsRequireUpdate(context.Background(), workspace, b.WorkspaceMapping) + if tagCheck.requiresUpdate { + if errFromTagCheck != nil { + if errors.Is(errFromTagCheck, ErrCloudDoesNotSupportKVTags) { + return nil, fmt.Errorf("backend does not support key/value tags. Try using key-only tags: %w", errFromTagCheck) } - return nil, fmt.Errorf("error checking if workspace %s requires update: %w", name, err) } - log.Printf("[TRACE] cloud: Updating tags for %s workspace %s/%s to %s", b.appName, b.Organization, name, b.WorkspaceMapping.DescribeTags()) - if b.WorkspaceMapping.Strategy() == WorkspaceTagsStrategy { + log.Printf("[TRACE] cloud: Updating tags for %s workspace %s/%s to %q", b.appName, b.Organization, name, b.WorkspaceMapping.DescribeTags()) + // Always update using KV tags if possible + if !tagCheck.supportsKVTags { options := tfe.WorkspaceAddTagsOptions{ Tags: b.WorkspaceMapping.tfeTags(), } err = b.client.Workspaces.AddTags(context.Background(), workspace.ID, options) - } else if b.WorkspaceMapping.Strategy() == WorkspaceKVTagsStrategy { + } else { options := tfe.WorkspaceAddTagBindingsOptions{ - TagBindings: b.WorkspaceMapping.tfeTagBindings(), + TagBindings: b.WorkspaceMapping.asTFETagBindings(), } _, err = b.client.Workspaces.AddTagBindings(context.Background(), workspace.ID, options) } @@ -1160,39 +1170,75 @@ func (b *Cloud) cliColorize() *colorstring.Colorize { } } -func (b *Cloud) workspaceTagsRequireUpdate(ctx context.Context, workspace *tfe.Workspace, workspaceMapping WorkspaceMapping) (bool, error) { - if workspaceMapping.Strategy() == WorkspaceTagsStrategy { - existingTags := map[string]struct{}{} - for _, t := range workspace.TagNames { - existingTags[t] = struct{}{} - } +type tagRequiresUpdateResult struct { + requiresUpdate bool + supportsKVTags bool +} - for _, tag := range workspaceMapping.TagsAsSet { - if _, ok := existingTags[tag]; !ok { - return true, nil - } - } - } else if workspaceMapping.Strategy() == WorkspaceKVTagsStrategy { - existingTags := make(map[string]string) - bindings, err := b.client.Workspaces.ListTagBindings(ctx, workspace.ID) - if err != nil && err == tfe.ErrResourceNotFound { - return true, ErrCloudDoesNotSupportKVTags - } else if err != nil { - return true, err - } +func (b *Cloud) workspaceTagsRequireUpdate(ctx context.Context, workspace *tfe.Workspace, workspaceMapping WorkspaceMapping) (result tagRequiresUpdateResult, err error) { + result = tagRequiresUpdateResult{ + supportsKVTags: true, + } - for _, binding := range bindings { - existingTags[binding.Key] = binding.Value + // First, depending on the strategy, build a map of the tags defined in config + // so we can compare them to the actual tags on the workspace + normalizedTagMap := make(map[string]string) + if workspaceMapping.IsTagsStrategy() { + for _, b := range workspaceMapping.asTFETagBindings() { + normalizedTagMap[b.Key] = b.Value } - - for tag, val := range workspaceMapping.TagsAsMap { - if existingVal, ok := existingTags[tag]; !ok || existingVal != val { - return true, nil + } else { + // Not a tag strategy + return + } + + // Fetch tag bindings and determine if they should be checked + bindings, err := b.client.Workspaces.ListTagBindings(ctx, workspace.ID) + if err != nil && errors.Is(err, tfe.ErrResourceNotFound) { + // By this time, the workspace should have been fetched, proving that the + // authenticated user has access to it. If the tag bindings are not found, + // it would mean that the backened does not support tag bindings. + result.supportsKVTags = false + } else if err != nil { + return + } + + err = nil +check: + // Check desired workspace tags against existing tags + for k, v := range normalizedTagMap { + log.Printf("[TRACE] cloud: Checking tag %q=%q", k, v) + if v == "" { + // Tag can exist in legacy tags or tag bindings + if !slices.Contains(workspace.TagNames, k) || (result.supportsKVTags && !slices.ContainsFunc(bindings, func(b *tfe.TagBinding) bool { + return b.Key == k + })) { + result.requiresUpdate = true + break check + } + } else if !result.supportsKVTags { + // There is a value defined, but the backend does not support tag bindings + result.requiresUpdate = true + err = ErrCloudDoesNotSupportKVTags + break check + } else { + // There is a value, so it must match a tag binding + if !slices.ContainsFunc(bindings, func(b *tfe.TagBinding) bool { + return b.Key == k && b.Value == v + }) { + result.requiresUpdate = true + break check } } } - return false, nil + doesOrDoesnot := "does " + if !result.requiresUpdate { + doesOrDoesnot = "does not " + } + log.Printf("[TRACE] cloud: Workspace %s %srequire tag update", workspace.Name, doesOrDoesnot) + + return } type WorkspaceMapping struct { @@ -1390,21 +1436,24 @@ func (wm WorkspaceMapping) tfeTags() []*tfe.Tag { return tags } -func (wm WorkspaceMapping) tfeTagBindings() []*tfe.TagBinding { +func (wm WorkspaceMapping) asTFETagBindings() []*tfe.TagBinding { var tagBindings []*tfe.TagBinding - if wm.Strategy() != WorkspaceKVTagsStrategy { - return tagBindings - } + if wm.Strategy() == WorkspaceKVTagsStrategy { + tagBindings = make([]*tfe.TagBinding, len(wm.TagsAsMap)) - tagBindings = make([]*tfe.TagBinding, len(wm.TagsAsMap)) + index := 0 + for key, val := range wm.TagsAsMap { + tagBindings[index] = &tfe.TagBinding{Key: key, Value: val} + index += 1 + } + } else if wm.Strategy() == WorkspaceTagsStrategy { + tagBindings = make([]*tfe.TagBinding, len(wm.TagsAsSet)) - index := 0 - for key, val := range wm.TagsAsMap { - tagBindings[index] = &tfe.TagBinding{Key: key, Value: val} - index += 1 + for i, tag := range wm.TagsAsSet { + tagBindings[i] = &tfe.TagBinding{Key: tag} + } } - return tagBindings } diff --git a/internal/cloud/backend_test.go b/internal/cloud/backend_test.go index d5c644ff4096..1b7e37342cce 100644 --- a/internal/cloud/backend_test.go +++ b/internal/cloud/backend_test.go @@ -79,6 +79,36 @@ func TestCloud_backendWithTags(t *testing.T) { } } +func TestCloud_backendWithKVTags(t *testing.T) { + b, bCleanup := testBackendWithKVTags(t) + defer bCleanup() + + _, err := b.client.Workspaces.Create(context.Background(), "hashicorp", tfe.WorkspaceCreateOptions{ + Name: tfe.String("ws-billing-101"), + TagBindings: []*tfe.TagBinding{ + {Key: "dept", Value: "billing"}, + {Key: "costcenter", Value: "101"}, + }, + }) + if err != nil { + t.Fatalf("error creating workspace: %s", err) + } + + workspaces, err := b.Workspaces() + if err != nil { + t.Fatalf("error: %s", err) + } + + actual := len(workspaces) + if actual != 1 { + t.Fatalf("expected 1 workspaces, got %d", actual) + } + + if workspaces[0] != "ws-billing-101" { + t.Fatalf("expected workspace name to be 'ws-billing-101', got %s", workspaces[0]) + } +} + func TestCloud_DescribeTags(t *testing.T) { cases := map[string]struct { expected string @@ -1223,7 +1253,7 @@ func TestCloud_resolveCloudConfig(t *testing.T) { t.Fatalf("%s: expected final config of %#v but instead got %#v", name, tc.expectedResult, result) } - if !reflect.DeepEqual(tc.expectedResult.workspaceMapping.tfeTagBindings(), result.workspaceMapping.tfeTagBindings()) { + if !reflect.DeepEqual(tc.expectedResult.workspaceMapping.asTFETagBindings(), result.workspaceMapping.asTFETagBindings()) { t.Fatalf("%s: expected final config of %#v but instead got %#v", name, tc.expectedResult, result) } } diff --git a/internal/cloud/testing.go b/internal/cloud/testing.go index 009a11961651..9018001841c6 100644 --- a/internal/cloud/testing.go +++ b/internal/cloud/testing.go @@ -120,6 +120,24 @@ func testBackendWithTags(t *testing.T) (*Cloud, func()) { return b, c } +func testBackendWithKVTags(t *testing.T) (*Cloud, func()) { + obj := cty.ObjectVal(map[string]cty.Value{ + "hostname": cty.NullVal(cty.String), + "organization": cty.StringVal("hashicorp"), + "token": cty.NullVal(cty.String), + "workspaces": cty.ObjectVal(map[string]cty.Value{ + "name": cty.NullVal(cty.String), + "tags": cty.MapVal(map[string]cty.Value{ + "dept": cty.StringVal("billing"), + "costcenter": cty.StringVal("101"), + }), + "project": cty.NullVal(cty.String), + }), + }) + b, _, c := testBackend(t, obj, nil) + return b, c +} + func testBackendNoOperations(t *testing.T) (*Cloud, func()) { obj := cty.ObjectVal(map[string]cty.Value{ "hostname": cty.NullVal(cty.String), diff --git a/internal/cloud/tfe_client_mock.go b/internal/cloud/tfe_client_mock.go index f6f7fca8ad98..53bfc374cf45 100644 --- a/internal/cloud/tfe_client_mock.go +++ b/internal/cloud/tfe_client_mock.go @@ -1942,35 +1942,51 @@ func newMockWorkspaces(client *MockClient) *MockWorkspaces { func (m *MockWorkspaces) List(ctx context.Context, organization string, options *tfe.WorkspaceListOptions) (*tfe.WorkspaceList, error) { wl := &tfe.WorkspaceList{} // Get all the workspaces that match the Search value - searchValue := "" var ws []*tfe.Workspace - var tags []string + searchValue := "" + searchTags := make(map[string]string) if options != nil { if len(options.Search) > 0 { searchValue = options.Search } if len(options.Tags) > 0 { - tags = strings.Split(options.Tags, ",") + for _, tag := range strings.Split(options.Tags, ",") { + searchTags[tag] = "" + } + } + if len(options.TagBindings) > 0 { + for _, kvTag := range options.TagBindings { + searchTags[kvTag.Key] = kvTag.Value + } } } for _, w := range m.workspaceIDs { - wTags := make(map[string]struct{}) + wTags := make(map[string]string) for _, wTag := range w.Tags { - wTags[wTag.Name] = struct{}{} + wTags[wTag.Name] = "" } - if strings.Contains(w.Name, searchValue) { - tagsSatisfied := true - for _, tag := range tags { - if _, ok := wTags[tag]; !ok { + for _, kvTag := range w.TagBindings { + wTags[kvTag.Key] = kvTag.Value + } + + tagsSatisfied := true + for k, v := range searchTags { + if value, ok := wTags[k]; ok { + if value != v { tagsSatisfied = false + break } + } else { + tagsSatisfied = false + break } - if tagsSatisfied { - ws = append(ws, w) - } + } + + if strings.Contains(w.Name, searchValue) && tagsSatisfied { + ws = append(ws, w) } } From f41d5a5954e07d761f9b4d62d71d433ee2e63987 Mon Sep 17 00:00:00 2001 From: Brandon Croft Date: Fri, 8 Nov 2024 10:40:18 -0700 Subject: [PATCH 16/50] Fix typo --- internal/cloud/backend.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/cloud/backend.go b/internal/cloud/backend.go index 74f646e2bcd6..546f1139a6bc 100644 --- a/internal/cloud/backend.go +++ b/internal/cloud/backend.go @@ -1197,7 +1197,7 @@ func (b *Cloud) workspaceTagsRequireUpdate(ctx context.Context, workspace *tfe.W if err != nil && errors.Is(err, tfe.ErrResourceNotFound) { // By this time, the workspace should have been fetched, proving that the // authenticated user has access to it. If the tag bindings are not found, - // it would mean that the backened does not support tag bindings. + // it would mean that the backend does not support tag bindings. result.supportsKVTags = false } else if err != nil { return From 1e011248ffeaeb51f684868bb73f404f1cedca81 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Fri, 8 Nov 2024 13:01:43 -0500 Subject: [PATCH 17/50] Sensitive is not the only possible mark This has not applied within Terraform for a long time, but the sensitive function was never tested with extra marks. --- internal/lang/funcs/sensitive_test.go | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/internal/lang/funcs/sensitive_test.go b/internal/lang/funcs/sensitive_test.go index 4a2b807f73fb..865635e3d35a 100644 --- a/internal/lang/funcs/sensitive_test.go +++ b/internal/lang/funcs/sensitive_test.go @@ -45,14 +45,6 @@ func TestSensitive(t *testing.T) { cty.NumberIntVal(1).Mark(marks.Sensitive), ``, }, - { - // A value with some non-standard mark gets "fixed" to be marked - // with the standard "sensitive" mark. (This situation occurring - // would imply an inconsistency/bug elsewhere, so we're just - // being robust about it here.) - cty.NumberIntVal(1).Mark("bloop"), - ``, - }, { // A value deep already marked is allowed and stays marked, // _and_ we'll also mark the outer collection as sensitive. @@ -81,17 +73,7 @@ func TestSensitive(t *testing.T) { t.Errorf("result is not marked sensitive") } - gotRaw, gotMarks := got.Unmark() - if len(gotMarks) != 1 { - // We're only expecting to have the "sensitive" mark we checked - // above. Any others are an error, even if they happen to - // appear alongside "sensitive". (We might change this rule - // if someday we decide to use marks for some additional - // unrelated thing in Terraform, but currently we assume that - // _all_ marks imply sensitive, and so returning any other - // marks would be confusing.) - t.Errorf("extraneous marks %#v", gotMarks) - } + gotRaw, _ := got.Unmark() // Disregarding shallow marks, the result should have the same // effective value as the input. From c4741dcd4cbaa45693c06caad9b9e28443c7b093 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Fri, 8 Nov 2024 13:50:08 -0500 Subject: [PATCH 18/50] there are other marks besides sensitive The sensitive function must not strip off other marks --- internal/lang/funcs/sensitive.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/internal/lang/funcs/sensitive.go b/internal/lang/funcs/sensitive.go index b30e2fa579c3..69fd703b90ff 100644 --- a/internal/lang/funcs/sensitive.go +++ b/internal/lang/funcs/sensitive.go @@ -28,8 +28,7 @@ var SensitiveFunc = function.New(&function.Spec{ return args[0].Type(), nil }, Impl: func(args []cty.Value, retType cty.Type) (ret cty.Value, err error) { - val, _ := args[0].Unmark() - return val.Mark(marks.Sensitive), nil + return args[0].Mark(marks.Sensitive), nil }, }) From f1428b33884ea33278efc91ea57dadf039e2fb1a Mon Sep 17 00:00:00 2001 From: Bruno Schaatsbergen Date: Fri, 8 Nov 2024 13:51:06 -0600 Subject: [PATCH 19/50] backend/cloud: expose View to enable reuse in a (cloud) backend Signed-off-by: Bruno Schaatsbergen --- internal/backend/backendrun/cli.go | 4 +++- internal/cloud/backend_cli.go | 3 +-- internal/command/meta_backend.go | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/internal/backend/backendrun/cli.go b/internal/backend/backendrun/cli.go index c731ef4f5ed8..659ed3be8004 100644 --- a/internal/backend/backendrun/cli.go +++ b/internal/backend/backendrun/cli.go @@ -9,6 +9,7 @@ import ( "github.com/hashicorp/terraform/internal/backend" "github.com/hashicorp/terraform/internal/command/arguments" + "github.com/hashicorp/terraform/internal/command/views" "github.com/hashicorp/terraform/internal/terminal" "github.com/hashicorp/terraform/internal/terraform" ) @@ -61,10 +62,11 @@ type CLIOpts struct { // for tailoring the output to fit the attached terminal, for example. Streams *terminal.Streams - // FIXME: Temporarily exposing ViewType to the backend. + // FIXME: Temporarily exposing ViewType and View to the backend. // This is a workaround until the backend is refactored to support // native View handling. ViewType arguments.ViewType + View *views.View // StatePath is the local path where state is read from. // diff --git a/internal/cloud/backend_cli.go b/internal/cloud/backend_cli.go index 60edc2711b4b..b1c63962b50a 100644 --- a/internal/cloud/backend_cli.go +++ b/internal/cloud/backend_cli.go @@ -26,8 +26,7 @@ func (b *Cloud) CLIInit(opts *backendrun.CLIOpts) error { Streams: opts.Streams, Colorize: opts.CLIColor, } - view := views.NewView(opts.Streams) - b.View = views.NewCloud(opts.ViewType, view) + b.View = views.NewCloud(opts.ViewType, opts.View) return nil } diff --git a/internal/command/meta_backend.go b/internal/command/meta_backend.go index 65155be5ae9c..0113eed31b53 100644 --- a/internal/command/meta_backend.go +++ b/internal/command/meta_backend.go @@ -151,10 +151,11 @@ func (m *Meta) Backend(opts *BackendOpts) (backendrun.OperationsBackend, tfdiags } cliOpts.Validation = true - // FIXME: Temporarily exposing ViewType to the backend. + // FIXME: Temporarily exposing ViewType and View to the backend. // This is a workaround until the backend is refactored to support // native View handling. cliOpts.ViewType = opts.ViewType + cliOpts.View = m.View // If the backend supports CLI initialization, do it. if cli, ok := b.(backendrun.CLI); ok { From ae661f3568311b754be27669b7a24db9303498ef Mon Sep 17 00:00:00 2001 From: Bruno Schaatsbergen Date: Fri, 8 Nov 2024 14:03:28 -0600 Subject: [PATCH 20/50] views: add comments for clarity Signed-off-by: Bruno Schaatsbergen --- internal/command/views/cloud.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/internal/command/views/cloud.go b/internal/command/views/cloud.go index d99e5c137c3f..057e9fa6c1ea 100644 --- a/internal/command/views/cloud.go +++ b/internal/command/views/cloud.go @@ -57,9 +57,10 @@ func (v *CloudHuman) RetryLog(attemptNum int, resp *http.Response) { // retryLogMessage returns an empty string for the first attempt or for rate-limited responses (HTTP 429) if msg != "" { if elapsed != nil { - v.Output(msg, elapsed) + v.Output(msg, elapsed) // subsequent retry message } else { - v.Output(msg) + v.Output(msg) // initial retry message + v.view.streams.Println() // ensures a newline between messages } } } @@ -102,9 +103,9 @@ func (v *CloudJSON) RetryLog(attemptNum int, resp *http.Response) { // retryLogMessage returns an empty string for the first attempt or for rate-limited responses (HTTP 429) if msg != "" { if elapsed != nil { - v.Output(msg, elapsed) + v.Output(msg, elapsed) // subsequent retry message } else { - v.Output(msg) + v.Output(msg) // initial retry message } } } From a51be5e930672285a5f856a47484464b968a925a Mon Sep 17 00:00:00 2001 From: James Bardin Date: Fri, 8 Nov 2024 15:19:33 -0500 Subject: [PATCH 21/50] lang functions must deal with unknown and marks You can't deal with marks in a function without also dealing with unknown. If AllowMarked is true, but AllowKnown is not, the caller will short-circuit the evaluation with an unknown, without being able to deal with marks from all arguments. --- internal/lang/funcs/conversion.go | 7 +++-- internal/lang/funcs/conversion_test.go | 24 +++++++++++++++-- internal/lang/funcs/encoding.go | 11 +++++--- internal/lang/funcs/encoding_test.go | 6 +++++ internal/lang/funcs/filesystem.go | 36 ++++++++++++++++++------- internal/lang/funcs/filesystem_test.go | 37 ++++++++++++++++++++++++++ internal/lang/funcs/funcs_test.go | 6 +++++ 7 files changed, 110 insertions(+), 17 deletions(-) create mode 100644 internal/lang/funcs/funcs_test.go diff --git a/internal/lang/funcs/conversion.go b/internal/lang/funcs/conversion.go index 6e223089b429..25609ff02451 100644 --- a/internal/lang/funcs/conversion.go +++ b/internal/lang/funcs/conversion.go @@ -37,6 +37,7 @@ func MakeToFunc(wantTy cty.Type) function.Function { AllowNull: true, AllowMarked: true, AllowDynamicType: true, + AllowUnknown: true, }, }, Type: func(args []cty.Value) (cty.Type, error) { @@ -61,8 +62,10 @@ func MakeToFunc(wantTy cty.Type) function.Function { return wantTy, nil }, Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { - // We didn't set "AllowUnknown" on our argument, so it is guaranteed - // to be known here but may still be null. + if !args[0].IsKnown() { + return cty.UnknownVal(retType).WithSameMarks(args[0]), nil + } + ret, err := convert.Convert(args[0], retType) if err != nil { val, _ := args[0].UnmarkDeep() diff --git a/internal/lang/funcs/conversion_test.go b/internal/lang/funcs/conversion_test.go index 79ea88404a9b..885275b6cbb4 100644 --- a/internal/lang/funcs/conversion_test.go +++ b/internal/lang/funcs/conversion_test.go @@ -181,6 +181,24 @@ func TestTo(t *testing.T) { cty.DynamicVal, `incompatible object type for conversion: attribute "foo" is required`, }, + { + cty.UnknownVal(cty.Object(map[string]cty.Type{"foo": cty.String})).Mark(marks.Ephemeral).Mark("boop"), + cty.Map(cty.String), + cty.UnknownVal(cty.Map(cty.String)).Mark(marks.Ephemeral).Mark("boop"), + ``, + }, + { + cty.ObjectVal(map[string]cty.Value{ + "foo": cty.StringVal("hello"), + "bar": cty.StringVal("world").Mark("beep"), + }).Mark("boop"), + cty.Map(cty.String), + cty.MapVal(map[string]cty.Value{ + "foo": cty.StringVal("hello"), + "bar": cty.StringVal("world").Mark("beep"), + }).Mark("boop"), + ``, + }, } for _, test := range tests { @@ -322,13 +340,15 @@ func TestEphemeralAsNull(t *testing.T) { { cty.ObjectVal(map[string]cty.Value{ "addr": cty.StringVal("127.0.0.1:12654").Mark(marks.Ephemeral), - "greet": cty.StringVal("hello"), + "greet": cty.StringVal("hello").Mark(marks.Sensitive), "happy": cty.True, + "both": cty.NumberIntVal(2).WithMarks(cty.NewValueMarks(marks.Sensitive, marks.Ephemeral)), }), cty.ObjectVal(map[string]cty.Value{ "addr": cty.NullVal(cty.String), - "greet": cty.StringVal("hello"), + "greet": cty.StringVal("hello").Mark(marks.Sensitive), "happy": cty.True, + "both": cty.NullVal(cty.Number).Mark(marks.Sensitive), }), }, } diff --git a/internal/lang/funcs/encoding.go b/internal/lang/funcs/encoding.go index 94ccc7e017e5..f92d7df48649 100644 --- a/internal/lang/funcs/encoding.go +++ b/internal/lang/funcs/encoding.go @@ -21,15 +21,20 @@ import ( var Base64DecodeFunc = function.New(&function.Spec{ Params: []function.Parameter{ { - Name: "str", - Type: cty.String, - AllowMarked: true, + Name: "str", + Type: cty.String, + AllowMarked: true, + AllowUnknown: true, }, }, Type: function.StaticReturnType(cty.String), RefineResult: refineNotNull, Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { str, strMarks := args[0].Unmark() + if !str.IsKnown() { + return cty.UnknownVal(cty.String).WithMarks(strMarks), nil + } + s := str.AsString() sDec, err := base64.StdEncoding.DecodeString(s) if err != nil { diff --git a/internal/lang/funcs/encoding_test.go b/internal/lang/funcs/encoding_test.go index a29022dfa2bc..43f03ecc7cae 100644 --- a/internal/lang/funcs/encoding_test.go +++ b/internal/lang/funcs/encoding_test.go @@ -37,6 +37,12 @@ func TestBase64Decode(t *testing.T) { cty.UnknownVal(cty.String), true, }, + // unknown marked + { + cty.UnknownVal(cty.String).Mark("a").Mark("b"), + cty.UnknownVal(cty.String).RefineNotNull().Mark("a").Mark("b"), + false, + }, } for _, test := range tests { diff --git a/internal/lang/funcs/filesystem.go b/internal/lang/funcs/filesystem.go index 2257d5d91c1b..39b3125e20f3 100644 --- a/internal/lang/funcs/filesystem.go +++ b/internal/lang/funcs/filesystem.go @@ -28,15 +28,21 @@ func MakeFileFunc(baseDir string, encBase64 bool) function.Function { return function.New(&function.Spec{ Params: []function.Parameter{ { - Name: "path", - Type: cty.String, - AllowMarked: true, + Name: "path", + Type: cty.String, + AllowMarked: true, + AllowUnknown: true, }, }, Type: function.StaticReturnType(cty.String), RefineResult: refineNotNull, Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { pathArg, pathMarks := args[0].Unmark() + + if !pathArg.IsKnown() { + return cty.UnknownVal(cty.String).WithMarks(pathMarks), nil + } + path := pathArg.AsString() src, err := readFileBytes(baseDir, path, pathMarks) if err != nil { @@ -94,13 +100,16 @@ func MakeTemplateFileFunc(baseDir string, funcsCb func() (funcs map[string]funct return function.New(&function.Spec{ Params: []function.Parameter{ { - Name: "path", - Type: cty.String, - AllowMarked: true, + Name: "path", + Type: cty.String, + AllowMarked: true, + AllowUnknown: true, }, { - Name: "vars", - Type: cty.DynamicPseudoType, + Name: "vars", + Type: cty.DynamicPseudoType, + AllowMarked: true, + AllowUnknown: true, }, }, Type: func(args []cty.Value) (cty.Type, error) { @@ -125,12 +134,19 @@ func MakeTemplateFileFunc(baseDir string, funcsCb func() (funcs map[string]funct }, Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { pathArg, pathMarks := args[0].Unmark() + + vars, varsMarks := args[1].UnmarkDeep() + + if !pathArg.IsKnown() { + return cty.UnknownVal(retType).WithMarks(pathMarks, varsMarks), nil + } + expr, tmplMarks, err := loadTmpl(pathArg.AsString(), pathMarks) if err != nil { return cty.DynamicVal, err } - result, err := renderTmpl(expr, args[1]) - return result.WithMarks(tmplMarks), err + result, err := renderTmpl(expr, vars) + return result.WithMarks(tmplMarks, varsMarks), err }, }) diff --git a/internal/lang/funcs/filesystem_test.go b/internal/lang/funcs/filesystem_test.go index 4b65560fa01e..2d88663b7eee 100644 --- a/internal/lang/funcs/filesystem_test.go +++ b/internal/lang/funcs/filesystem_test.go @@ -29,6 +29,11 @@ func TestFile(t *testing.T) { cty.StringVal("Hello World"), ``, }, + { + cty.UnknownVal(cty.String).Mark(marks.Sensitive), + cty.UnknownVal(cty.String).RefineNotNull().Mark(marks.Sensitive), + ``, + }, { cty.StringVal("testdata/icon.png"), cty.NilVal, @@ -199,6 +204,38 @@ func TestTemplateFile(t *testing.T) { cty.StringVal("Hello World").Mark(marks.Sensitive), ``, }, + { + cty.StringVal("testdata/list.tmpl").Mark("path"), + cty.ObjectVal(map[string]cty.Value{ + "list": cty.ListVal([]cty.Value{ + cty.StringVal("a"), + cty.StringVal("b").Mark("var"), + cty.StringVal("c"), + }), + }), + cty.StringVal("- a\n- b\n- c\n").Mark("path").Mark("var"), + ``, + }, + { + cty.StringVal("testdata/list.tmpl").Mark("path"), + cty.ObjectVal(map[string]cty.Value{ + "list": cty.ListVal([]cty.Value{ + cty.StringVal("a"), + cty.UnknownVal(cty.String).Mark("var"), + cty.StringVal("c"), + }), + }), + cty.UnknownVal(cty.String).RefineNotNull().Mark("path").Mark("var"), + ``, + }, + { + cty.UnknownVal(cty.String).Mark("path"), + cty.ObjectVal(map[string]cty.Value{ + "key": cty.StringVal("value").Mark("var"), + }), + cty.DynamicVal.Mark("path").Mark("var"), + ``, + }, } funcs := map[string]function.Function{ diff --git a/internal/lang/funcs/funcs_test.go b/internal/lang/funcs/funcs_test.go new file mode 100644 index 000000000000..8aeb897555f7 --- /dev/null +++ b/internal/lang/funcs/funcs_test.go @@ -0,0 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: BUSL-1.1 + +package funcs + +import _ "github.com/hashicorp/terraform/internal/logging" From 651a80fb573681f41caffbd223fbbbbdc40a86a9 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Sun, 10 Nov 2024 15:16:23 -0500 Subject: [PATCH 22/50] deal with unknown marked vals in fs funcs Filesystem functions accepts marked values, and must also deal with unknowns. --- internal/lang/funcs/filesystem.go | 34 +++++++++++++++++--------- internal/lang/funcs/filesystem_test.go | 17 +++++++++++++ 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/internal/lang/funcs/filesystem.go b/internal/lang/funcs/filesystem.go index 39b3125e20f3..289a09ea9083 100644 --- a/internal/lang/funcs/filesystem.go +++ b/internal/lang/funcs/filesystem.go @@ -158,15 +158,21 @@ func MakeFileExistsFunc(baseDir string) function.Function { return function.New(&function.Spec{ Params: []function.Parameter{ { - Name: "path", - Type: cty.String, - AllowMarked: true, + Name: "path", + Type: cty.String, + AllowMarked: true, + AllowUnknown: true, }, }, Type: function.StaticReturnType(cty.Bool), RefineResult: refineNotNull, Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { pathArg, pathMarks := args[0].Unmark() + + if !pathArg.IsKnown() { + return cty.UnknownVal(cty.Bool).WithMarks(pathMarks), nil + } + path := pathArg.AsString() path, err := homedir.Expand(path) if err != nil { @@ -226,24 +232,30 @@ func MakeFileSetFunc(baseDir string) function.Function { return function.New(&function.Spec{ Params: []function.Parameter{ { - Name: "path", - Type: cty.String, - AllowMarked: true, + Name: "path", + Type: cty.String, + AllowMarked: true, + AllowUnknown: true, }, { - Name: "pattern", - Type: cty.String, - AllowMarked: true, + Name: "pattern", + Type: cty.String, + AllowMarked: true, + AllowUnknown: true, }, }, Type: function.StaticReturnType(cty.Set(cty.String)), RefineResult: refineNotNull, Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { pathArg, pathMarks := args[0].Unmark() - path := pathArg.AsString() patternArg, patternMarks := args[1].Unmark() - pattern := patternArg.AsString() + if !pathArg.IsKnown() || !patternArg.IsKnown() { + return cty.UnknownVal(retType).WithMarks(pathMarks, patternMarks), nil + } + + path := pathArg.AsString() + pattern := patternArg.AsString() marks := []cty.ValueMarks{pathMarks, patternMarks} if !filepath.IsAbs(path) { diff --git a/internal/lang/funcs/filesystem_test.go b/internal/lang/funcs/filesystem_test.go index 2d88663b7eee..5439661424c4 100644 --- a/internal/lang/funcs/filesystem_test.go +++ b/internal/lang/funcs/filesystem_test.go @@ -314,6 +314,11 @@ func TestFileExists(t *testing.T) { cty.BoolVal(false), `failed to stat (sensitive value)`, }, + { + cty.UnknownVal(cty.String).Mark(marks.Sensitive), + cty.UnknownVal(cty.Bool).RefineNotNull().Mark(marks.Sensitive), + ``, + }, } // Ensure "unreadable" directory cannot be listed during the test run @@ -546,6 +551,18 @@ func TestFileSet(t *testing.T) { }), ``, }, + { + cty.StringVal("testdata"), + cty.UnknownVal(cty.String), + cty.UnknownVal(cty.Set(cty.String)).RefineNotNull(), + ``, + }, + { + cty.StringVal("testdata"), + cty.UnknownVal(cty.String).Mark(marks.Sensitive), + cty.UnknownVal(cty.Set(cty.String)).RefineNotNull().Mark(marks.Sensitive), + ``, + }, } for _, test := range tests { From 2ae01741cdd79f2d3054ff07bfcaa9e2a97c8c8f Mon Sep 17 00:00:00 2001 From: James Bardin Date: Sun, 10 Nov 2024 15:28:36 -0500 Subject: [PATCH 23/50] handle marked-unknowns in number funcs --- internal/lang/funcs/number.go | 21 ++++++++++++++------- internal/lang/funcs/number_test.go | 6 ++++++ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/internal/lang/funcs/number.go b/internal/lang/funcs/number.go index d90b2f45e316..08774e3d83cc 100644 --- a/internal/lang/funcs/number.go +++ b/internal/lang/funcs/number.go @@ -101,14 +101,16 @@ var SignumFunc = function.New(&function.Spec{ var ParseIntFunc = function.New(&function.Spec{ Params: []function.Parameter{ { - Name: "number", - Type: cty.DynamicPseudoType, - AllowMarked: true, + Name: "number", + Type: cty.DynamicPseudoType, + AllowMarked: true, + AllowUnknown: true, }, { - Name: "base", - Type: cty.Number, - AllowMarked: true, + Name: "base", + Type: cty.Number, + AllowMarked: true, + AllowUnknown: true, }, }, @@ -126,11 +128,16 @@ var ParseIntFunc = function.New(&function.Spec{ var err error numArg, numMarks := args[0].Unmark() + baseArg, baseMarks := args[1].Unmark() + + if !numArg.IsKnown() || !baseArg.IsKnown() { + return cty.UnknownVal(retType).WithMarks(numMarks, baseMarks), nil + } + if err = gocty.FromCtyValue(numArg, &numstr); err != nil { return cty.UnknownVal(cty.String), function.NewArgError(0, err) } - baseArg, baseMarks := args[1].Unmark() if err = gocty.FromCtyValue(baseArg, &base); err != nil { return cty.UnknownVal(cty.Number), function.NewArgError(1, err) } diff --git a/internal/lang/funcs/number_test.go b/internal/lang/funcs/number_test.go index 1cdc002baccf..83ca3f53d06e 100644 --- a/internal/lang/funcs/number_test.go +++ b/internal/lang/funcs/number_test.go @@ -217,6 +217,12 @@ func TestParseInt(t *testing.T) { cty.NumberIntVal(128).Mark(marks.Sensitive), ``, }, + { + cty.StringVal("128").Mark(marks.Sensitive), + cty.UnknownVal(cty.Number).Mark(marks.Sensitive), + cty.UnknownVal(cty.Number).RefineNotNull().Mark(marks.Sensitive), + ``, + }, { cty.StringVal("128").Mark("boop"), cty.NumberIntVal(10).Mark(marks.Sensitive), From 515897a125ff93fb34947aa5b5950e2e77fa18be Mon Sep 17 00:00:00 2001 From: Bruno Schaatsbergen Date: Mon, 11 Nov 2024 08:26:01 -0700 Subject: [PATCH 24/50] copyright: add missing header Signed-off-by: Bruno Schaatsbergen --- internal/command/views/cloud_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/internal/command/views/cloud_test.go b/internal/command/views/cloud_test.go index 63167fffddfc..3eb44d3cfdb5 100644 --- a/internal/command/views/cloud_test.go +++ b/internal/command/views/cloud_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: BUSL-1.1 + package views import ( From ac54255d682903346b202a2533e714e0b11d94f1 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Mon, 11 Nov 2024 10:18:06 -0500 Subject: [PATCH 25/50] unknown+ephem in length+lookup --- internal/lang/funcs/collection.go | 22 +++++++++++++--------- internal/lang/funcs/collection_test.go | 13 +++++++++++++ 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/internal/lang/funcs/collection.go b/internal/lang/funcs/collection.go index 0fb23d902de2..311dfa061afb 100644 --- a/internal/lang/funcs/collection.go +++ b/internal/lang/funcs/collection.go @@ -40,6 +40,7 @@ var LengthFunc = function.New(&function.Spec{ coll := args[0] collTy := args[0].Type() marks := coll.Marks() + switch { case collTy == cty.DynamicPseudoType: return cty.UnknownVal(cty.Number).WithMarks(marks), nil @@ -222,14 +223,16 @@ var IndexFunc = function.New(&function.Spec{ var LookupFunc = function.New(&function.Spec{ Params: []function.Parameter{ { - Name: "inputMap", - Type: cty.DynamicPseudoType, - AllowMarked: true, + Name: "inputMap", + Type: cty.DynamicPseudoType, + AllowMarked: true, + AllowUnknown: true, }, { - Name: "key", - Type: cty.String, - AllowMarked: true, + Name: "key", + Type: cty.String, + AllowMarked: true, + AllowUnknown: true, }, }, VarParam: &function.Parameter{ @@ -276,7 +279,7 @@ var LookupFunc = function.New(&function.Spec{ } }, Impl: func(args []cty.Value, retType cty.Type) (ret cty.Value, err error) { - var defaultVal cty.Value + defaultVal := cty.NullVal(retType) defaultValueSet := false if len(args) == 3 { @@ -297,12 +300,13 @@ var LookupFunc = function.New(&function.Spec{ if len(keyMarks) > 0 { markses = append(markses, keyMarks) } - lookupKey := keyVal.AsString() - if !mapVar.IsKnown() { + if !(mapVar.IsKnown() && keyVal.IsKnown()) { return cty.UnknownVal(retType).WithMarks(markses...), nil } + lookupKey := keyVal.AsString() + if mapVar.Type().IsObjectType() { if mapVar.Type().HasAttribute(lookupKey) { return mapVar.GetAttr(lookupKey).WithMarks(markses...), nil diff --git a/internal/lang/funcs/collection_test.go b/internal/lang/funcs/collection_test.go index 27c531c13888..3f08edc02937 100644 --- a/internal/lang/funcs/collection_test.go +++ b/internal/lang/funcs/collection_test.go @@ -169,6 +169,10 @@ func TestLength(t *testing.T) { }).Mark("secret"), cty.NumberIntVal(3).Mark("secret"), }, + { // Marked objects return a marked length + cty.UnknownVal(cty.String).Mark("secret"), + cty.UnknownVal(cty.Number).Refine().NotNull().NumberRangeLowerBound(cty.NumberIntVal(0), true).NewValue().Mark("secret"), + }, { // Marks on object attribute values do not propagate cty.ObjectVal(map[string]cty.Value{ "a": cty.StringVal("hello").Mark("a"), @@ -884,6 +888,15 @@ func TestLookup(t *testing.T) { cty.StringVal("beep").Mark("a"), false, }, + { // propagate marks from unknown map + []cty.Value{ + cty.UnknownVal(cty.Map(cty.String)).Mark("a"), + cty.StringVal("boop").Mark("b"), + cty.StringVal("nope"), + }, + cty.UnknownVal(cty.String).Mark("a").Mark("b"), + false, + }, } for _, test := range tests { From 04aee4eb7399bf0bb45df786fd2bc6b55f644f4a Mon Sep 17 00:00:00 2001 From: James Bardin Date: Mon, 11 Nov 2024 10:41:21 -0500 Subject: [PATCH 26/50] ephemeral plan diags moved to validate The improved handling of marks in functions has moved these diagnostics from plan to validate. --- internal/terraform/context_plan_ephemeral_test.go | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/internal/terraform/context_plan_ephemeral_test.go b/internal/terraform/context_plan_ephemeral_test.go index 1c382e620eb3..509e92ea62ab 100644 --- a/internal/terraform/context_plan_ephemeral_test.go +++ b/internal/terraform/context_plan_ephemeral_test.go @@ -159,7 +159,7 @@ resource "test_object" "test" { } `, }, - expectPlanDiagnostics: func(m *configs.Config) (diags tfdiags.Diagnostics) { + expectValidateDiagnostics: func(m *configs.Config) (diags tfdiags.Diagnostics) { return diags.Append(&hcl.Diagnostic{ Severity: hcl.DiagError, Summary: "Invalid for_each argument", @@ -205,7 +205,7 @@ module "child" { `, }, - expectPlanDiagnostics: func(m *configs.Config) (diags tfdiags.Diagnostics) { + expectValidateDiagnostics: func(m *configs.Config) (diags tfdiags.Diagnostics) { return diags.Append(&hcl.Diagnostic{ Severity: hcl.DiagError, Summary: "Invalid for_each argument", @@ -255,18 +255,13 @@ resource "test_object" "test" { } `, }, - expectPlanDiagnostics: func(m *configs.Config) (diags tfdiags.Diagnostics) { + expectValidateDiagnostics: func(m *configs.Config) (diags tfdiags.Diagnostics) { return diags.Append( &hcl.Diagnostic{ Severity: hcl.DiagError, Summary: "Invalid for_each argument", Detail: `The given "for_each" value is derived from an ephemeral value, which means that Terraform cannot persist it between plan/apply rounds. Use only non-ephemeral values to specify a resource's instance keys.`, }, - &hcl.Diagnostic{ - Severity: hcl.DiagError, - Summary: "Invalid for_each argument", - Detail: `The given "for_each" value is derived from an ephemeral value, which means that Terraform cannot persist it between plan/apply rounds. Use only non-ephemeral values to specify a resource's instance keys.`, - }, ) }, }, From 297972ee032576bc0e9aff7c361354aa12a00438 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Mon, 11 Nov 2024 10:56:33 -0500 Subject: [PATCH 27/50] incorrect validateCount function was hiding diags The validateCount function was probably implemented incorrectly to hide some other evaluation bug. There shouldn't be any reason to disregard diagnostics because the value is unknown. --- .../terraform/context_plan_ephemeral_test.go | 2 +- internal/terraform/node_resource_validate.go | 17 +---------------- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/internal/terraform/context_plan_ephemeral_test.go b/internal/terraform/context_plan_ephemeral_test.go index 509e92ea62ab..379cb55a500e 100644 --- a/internal/terraform/context_plan_ephemeral_test.go +++ b/internal/terraform/context_plan_ephemeral_test.go @@ -179,7 +179,7 @@ resource "test_object" "test" { } `, }, - expectPlanDiagnostics: func(m *configs.Config) (diags tfdiags.Diagnostics) { + expectValidateDiagnostics: func(m *configs.Config) (diags tfdiags.Diagnostics) { return diags.Append(&hcl.Diagnostic{ Severity: hcl.DiagError, Summary: "Invalid count argument", diff --git a/internal/terraform/node_resource_validate.go b/internal/terraform/node_resource_validate.go index 5ebbafdcda16..9725f3437999 100644 --- a/internal/terraform/node_resource_validate.go +++ b/internal/terraform/node_resource_validate.go @@ -300,7 +300,7 @@ func (n *NodeValidatableResource) validateResource(ctx EvalContext) tfdiags.Diag // Basic type-checking of the count argument. More complete validation // of this will happen when we DynamicExpand during the plan walk. - countDiags := validateCount(ctx, n.Config.Count) + _, countDiags := evaluateCountExpressionValue(n.Config.Count, ctx) diags = diags.Append(countDiags) case n.Config.ForEach != nil: @@ -727,21 +727,6 @@ func (n *NodeValidatableResource) validateConfigGen(ctx EvalContext) tfdiags.Dia return diags } -func validateCount(ctx EvalContext, expr hcl.Expression) (diags tfdiags.Diagnostics) { - val, countDiags := evaluateCountExpressionValue(expr, ctx) - // If the value isn't known then that's the best we can do for now, but - // we'll check more thoroughly during the plan walk - if !val.IsKnown() { - return diags - } - - if countDiags.HasErrors() { - diags = diags.Append(countDiags) - } - - return diags -} - func validateDependsOn(ctx EvalContext, dependsOn []hcl.Traversal) (diags tfdiags.Diagnostics) { for _, traversal := range dependsOn { ref, refDiags := addrs.ParseRef(traversal) From 05fe005aaf95a9c35f6dac0bab5b9a1b9459f5c5 Mon Sep 17 00:00:00 2001 From: Bruno Schaatsbergen Date: Mon, 11 Nov 2024 21:11:24 -0700 Subject: [PATCH 28/50] logo: update to new design Signed-off-by: Bruno Schaatsbergen --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3b34d939e152..24d1bf843d2e 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ - Tutorials: [HashiCorp's Learn Platform](https://learn.hashicorp.com/terraform) - Certification Exam: [HashiCorp Certified: Terraform Associate](https://www.hashicorp.com/certification/#hashicorp-certified-terraform-associate) -Terraform +Terraform Terraform is a tool for building, changing, and versioning infrastructure safely and efficiently. Terraform can manage existing and popular service providers as well as custom in-house solutions. From 27312c0dd85644d61a81880322de1af78733c92e Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Tue, 12 Nov 2024 14:07:58 +0100 Subject: [PATCH 29/50] move default release target to 1.11.x --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index a7c738735344..024e699a8129 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -31,7 +31,7 @@ label to enable the backport bot. --> -1.10.x +1.11.x ## Draft CHANGELOG entry From 2ac7af3d675d83e2107abff6a5cf0582c8ad5a22 Mon Sep 17 00:00:00 2001 From: Nara Kasbergen Kwon <855115+xiehan@users.noreply.github.com> Date: Tue, 12 Nov 2024 15:19:27 +0100 Subject: [PATCH 30/50] github: Update CODEOWNERS (#35988) Make the Education team (shared) codeowners of the docs on the website so that they can approve docs-only PRs as well. We don't need to be gatekeepers for those kinds of changes. --- CODEOWNERS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CODEOWNERS b/CODEOWNERS index 8ee3496d0d49..14ac082e5992 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -28,3 +28,5 @@ builtin/provisioners/file @hashicorp/terraform-core builtin/provisioners/local-exec @hashicorp/terraform-core builtin/provisioners/remote-exec @hashicorp/terraform-core +# Docs on developer.hashicorp.com/terraform/docs +website/ @hashicorp/terraform-core @hashicorp/terraform-education From b050a7e102d54e56dae7234bc96385ddc33e97e4 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Tue, 12 Nov 2024 10:10:43 -0500 Subject: [PATCH 31/50] update go-cty for better marks handling in funcs The main branch contains some fixes for handling marks in function calls, which we need for better ephemeral value support. --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 02a4aefcdc63..c9f8544281c1 100644 --- a/go.mod +++ b/go.mod @@ -61,7 +61,7 @@ require ( github.com/spf13/afero v1.9.5 github.com/xanzy/ssh-agent v0.3.3 github.com/xlab/treeprint v0.0.0-20161029104018-1d6e34225557 - github.com/zclconf/go-cty v1.15.0 + github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7 github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940 github.com/zclconf/go-cty-yaml v1.1.0 go.opentelemetry.io/contrib/exporters/autoexport v0.45.0 diff --git a/go.sum b/go.sum index 1b68af522933..6165c6d02bc8 100644 --- a/go.sum +++ b/go.sum @@ -1025,6 +1025,8 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zclconf/go-cty v1.15.0 h1:tTCRWxsexYUmtt/wVxgDClUe+uQusuI443uL6e+5sXQ= github.com/zclconf/go-cty v1.15.0/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7 h1:0vfzNfMza1xy8F0pbg9ut4KhfqQKtuq46a6wcRvsTEU= +github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940 h1:4r45xpDWB6ZMSMNJFMOjqrGHynW3DIBuR2H9j0ug+Mo= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940/go.mod h1:CmBdvvj3nqzfzJ6nTCIwDTPZ56aVGvDrmztiO5g3qrM= github.com/zclconf/go-cty-yaml v1.1.0 h1:nP+jp0qPHv2IhUVqmQSzjvqAWcObN0KBkUl2rWBdig0= From 1699bc2658d16fbde55cae910541fc7cdefa4c66 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Tue, 12 Nov 2024 10:12:54 -0500 Subject: [PATCH 32/50] sync deps --- go.sum | 2 -- internal/backend/remote-state/azure/go.mod | 2 +- internal/backend/remote-state/azure/go.sum | 4 ++-- internal/backend/remote-state/consul/go.mod | 2 +- internal/backend/remote-state/consul/go.sum | 4 ++-- internal/backend/remote-state/cos/go.mod | 2 +- internal/backend/remote-state/cos/go.sum | 4 ++-- internal/backend/remote-state/gcs/go.mod | 2 +- internal/backend/remote-state/gcs/go.sum | 4 ++-- internal/backend/remote-state/kubernetes/go.mod | 2 +- internal/backend/remote-state/kubernetes/go.sum | 4 ++-- internal/backend/remote-state/oss/go.mod | 2 +- internal/backend/remote-state/oss/go.sum | 4 ++-- internal/backend/remote-state/pg/go.mod | 2 +- internal/backend/remote-state/pg/go.sum | 4 ++-- internal/backend/remote-state/s3/go.mod | 2 +- internal/backend/remote-state/s3/go.sum | 4 ++-- internal/legacy/go.mod | 2 +- internal/legacy/go.sum | 4 ++-- 19 files changed, 27 insertions(+), 29 deletions(-) diff --git a/go.sum b/go.sum index 6165c6d02bc8..c4f5d3332f53 100644 --- a/go.sum +++ b/go.sum @@ -1023,8 +1023,6 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zclconf/go-cty v1.15.0 h1:tTCRWxsexYUmtt/wVxgDClUe+uQusuI443uL6e+5sXQ= -github.com/zclconf/go-cty v1.15.0/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7 h1:0vfzNfMza1xy8F0pbg9ut4KhfqQKtuq46a6wcRvsTEU= github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940 h1:4r45xpDWB6ZMSMNJFMOjqrGHynW3DIBuR2H9j0ug+Mo= diff --git a/internal/backend/remote-state/azure/go.mod b/internal/backend/remote-state/azure/go.mod index 7a6cea919a47..fcee0668fbd9 100644 --- a/internal/backend/remote-state/azure/go.mod +++ b/internal/backend/remote-state/azure/go.mod @@ -50,7 +50,7 @@ require ( github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/spf13/afero v1.9.5 // indirect github.com/stretchr/testify v1.8.4 // indirect - github.com/zclconf/go-cty v1.15.0 // indirect + github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7 // indirect golang.org/x/crypto v0.27.0 // indirect golang.org/x/mod v0.21.0 // indirect golang.org/x/net v0.29.0 // indirect diff --git a/internal/backend/remote-state/azure/go.sum b/internal/backend/remote-state/azure/go.sum index 0f89bed34743..69a4dfc8b62f 100644 --- a/internal/backend/remote-state/azure/go.sum +++ b/internal/backend/remote-state/azure/go.sum @@ -304,8 +304,8 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/zclconf/go-cty v1.15.0 h1:tTCRWxsexYUmtt/wVxgDClUe+uQusuI443uL6e+5sXQ= -github.com/zclconf/go-cty v1.15.0/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7 h1:0vfzNfMza1xy8F0pbg9ut4KhfqQKtuq46a6wcRvsTEU= +github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940 h1:4r45xpDWB6ZMSMNJFMOjqrGHynW3DIBuR2H9j0ug+Mo= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940/go.mod h1:CmBdvvj3nqzfzJ6nTCIwDTPZ56aVGvDrmztiO5g3qrM= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= diff --git a/internal/backend/remote-state/consul/go.mod b/internal/backend/remote-state/consul/go.mod index 7ad05ae7d1cd..f2e56cb3f0e0 100644 --- a/internal/backend/remote-state/consul/go.mod +++ b/internal/backend/remote-state/consul/go.mod @@ -6,7 +6,7 @@ require ( github.com/hashicorp/consul/api v1.13.0 github.com/hashicorp/consul/sdk v0.8.0 github.com/hashicorp/terraform v0.0.0-00010101000000-000000000000 - github.com/zclconf/go-cty v1.15.0 + github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7 ) require ( diff --git a/internal/backend/remote-state/consul/go.sum b/internal/backend/remote-state/consul/go.sum index 9ccd4c296ce1..4e73d69914b0 100644 --- a/internal/backend/remote-state/consul/go.sum +++ b/internal/backend/remote-state/consul/go.sum @@ -302,8 +302,8 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/zclconf/go-cty v1.15.0 h1:tTCRWxsexYUmtt/wVxgDClUe+uQusuI443uL6e+5sXQ= -github.com/zclconf/go-cty v1.15.0/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7 h1:0vfzNfMza1xy8F0pbg9ut4KhfqQKtuq46a6wcRvsTEU= +github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940 h1:4r45xpDWB6ZMSMNJFMOjqrGHynW3DIBuR2H9j0ug+Mo= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940/go.mod h1:CmBdvvj3nqzfzJ6nTCIwDTPZ56aVGvDrmztiO5g3qrM= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= diff --git a/internal/backend/remote-state/cos/go.mod b/internal/backend/remote-state/cos/go.mod index b29bee322ed2..6b0ac26465f5 100644 --- a/internal/backend/remote-state/cos/go.mod +++ b/internal/backend/remote-state/cos/go.mod @@ -31,7 +31,7 @@ require ( github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/mozillazg/go-httpheader v0.3.0 // indirect github.com/spf13/afero v1.9.5 // indirect - github.com/zclconf/go-cty v1.15.0 // indirect + github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7 // indirect golang.org/x/mod v0.21.0 // indirect golang.org/x/net v0.29.0 // indirect golang.org/x/sync v0.8.0 // indirect diff --git a/internal/backend/remote-state/cos/go.sum b/internal/backend/remote-state/cos/go.sum index f9bcb5942d21..d0c9ae733c78 100644 --- a/internal/backend/remote-state/cos/go.sum +++ b/internal/backend/remote-state/cos/go.sum @@ -243,8 +243,8 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/zclconf/go-cty v1.15.0 h1:tTCRWxsexYUmtt/wVxgDClUe+uQusuI443uL6e+5sXQ= -github.com/zclconf/go-cty v1.15.0/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7 h1:0vfzNfMza1xy8F0pbg9ut4KhfqQKtuq46a6wcRvsTEU= +github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940 h1:4r45xpDWB6ZMSMNJFMOjqrGHynW3DIBuR2H9j0ug+Mo= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940/go.mod h1:CmBdvvj3nqzfzJ6nTCIwDTPZ56aVGvDrmztiO5g3qrM= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= diff --git a/internal/backend/remote-state/gcs/go.mod b/internal/backend/remote-state/gcs/go.mod index fb5aad7c4a8f..b071eac4084a 100644 --- a/internal/backend/remote-state/gcs/go.mod +++ b/internal/backend/remote-state/gcs/go.mod @@ -7,7 +7,7 @@ require ( cloud.google.com/go/storage v1.30.1 github.com/hashicorp/terraform v0.0.0-00010101000000-000000000000 github.com/mitchellh/go-homedir v1.1.0 - github.com/zclconf/go-cty v1.15.0 + github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7 golang.org/x/oauth2 v0.23.0 google.golang.org/api v0.126.0 google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d diff --git a/internal/backend/remote-state/gcs/go.sum b/internal/backend/remote-state/gcs/go.sum index e81d76b7638a..5ff13dbf9e6d 100644 --- a/internal/backend/remote-state/gcs/go.sum +++ b/internal/backend/remote-state/gcs/go.sum @@ -240,8 +240,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zclconf/go-cty v1.15.0 h1:tTCRWxsexYUmtt/wVxgDClUe+uQusuI443uL6e+5sXQ= -github.com/zclconf/go-cty v1.15.0/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7 h1:0vfzNfMza1xy8F0pbg9ut4KhfqQKtuq46a6wcRvsTEU= +github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940 h1:4r45xpDWB6ZMSMNJFMOjqrGHynW3DIBuR2H9j0ug+Mo= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940/go.mod h1:CmBdvvj3nqzfzJ6nTCIwDTPZ56aVGvDrmztiO5g3qrM= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= diff --git a/internal/backend/remote-state/kubernetes/go.mod b/internal/backend/remote-state/kubernetes/go.mod index f2f36ec7d5e4..036fc0e92683 100644 --- a/internal/backend/remote-state/kubernetes/go.mod +++ b/internal/backend/remote-state/kubernetes/go.mod @@ -5,7 +5,7 @@ go 1.23.3 require ( github.com/hashicorp/terraform v0.0.0-00010101000000-000000000000 github.com/mitchellh/go-homedir v1.1.0 - github.com/zclconf/go-cty v1.15.0 + github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7 k8s.io/api v0.25.5 k8s.io/apimachinery v0.25.5 k8s.io/client-go v0.25.5 diff --git a/internal/backend/remote-state/kubernetes/go.sum b/internal/backend/remote-state/kubernetes/go.sum index 10ea1f3b410b..07c67bd0b3e4 100644 --- a/internal/backend/remote-state/kubernetes/go.sum +++ b/internal/backend/remote-state/kubernetes/go.sum @@ -307,8 +307,8 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/zclconf/go-cty v1.15.0 h1:tTCRWxsexYUmtt/wVxgDClUe+uQusuI443uL6e+5sXQ= -github.com/zclconf/go-cty v1.15.0/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7 h1:0vfzNfMza1xy8F0pbg9ut4KhfqQKtuq46a6wcRvsTEU= +github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940 h1:4r45xpDWB6ZMSMNJFMOjqrGHynW3DIBuR2H9j0ug+Mo= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940/go.mod h1:CmBdvvj3nqzfzJ6nTCIwDTPZ56aVGvDrmztiO5g3qrM= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= diff --git a/internal/backend/remote-state/oss/go.mod b/internal/backend/remote-state/oss/go.mod index 10e17a74ae7d..7439ddddd2f1 100644 --- a/internal/backend/remote-state/oss/go.mod +++ b/internal/backend/remote-state/oss/go.mod @@ -39,7 +39,7 @@ require ( github.com/satori/go.uuid v1.2.0 // indirect github.com/spf13/afero v1.9.5 // indirect github.com/stretchr/testify v1.8.4 // indirect - github.com/zclconf/go-cty v1.15.0 // indirect + github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7 // indirect golang.org/x/mod v0.21.0 // indirect golang.org/x/net v0.29.0 // indirect golang.org/x/sync v0.8.0 // indirect diff --git a/internal/backend/remote-state/oss/go.sum b/internal/backend/remote-state/oss/go.sum index ae3c42bc680d..379bbad5a712 100644 --- a/internal/backend/remote-state/oss/go.sum +++ b/internal/backend/remote-state/oss/go.sum @@ -259,8 +259,8 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/zclconf/go-cty v1.15.0 h1:tTCRWxsexYUmtt/wVxgDClUe+uQusuI443uL6e+5sXQ= -github.com/zclconf/go-cty v1.15.0/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7 h1:0vfzNfMza1xy8F0pbg9ut4KhfqQKtuq46a6wcRvsTEU= +github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940 h1:4r45xpDWB6ZMSMNJFMOjqrGHynW3DIBuR2H9j0ug+Mo= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940/go.mod h1:CmBdvvj3nqzfzJ6nTCIwDTPZ56aVGvDrmztiO5g3qrM= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= diff --git a/internal/backend/remote-state/pg/go.mod b/internal/backend/remote-state/pg/go.mod index b569bf0b73ef..b7495696b5de 100644 --- a/internal/backend/remote-state/pg/go.mod +++ b/internal/backend/remote-state/pg/go.mod @@ -7,7 +7,7 @@ require ( github.com/hashicorp/hcl/v2 v2.22.1-0.20240924195505-78fe99307e88 github.com/hashicorp/terraform v0.0.0-00010101000000-000000000000 github.com/lib/pq v1.10.3 - github.com/zclconf/go-cty v1.15.0 + github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7 ) require ( diff --git a/internal/backend/remote-state/pg/go.sum b/internal/backend/remote-state/pg/go.sum index ab37012f39fd..2b6f8e89d829 100644 --- a/internal/backend/remote-state/pg/go.sum +++ b/internal/backend/remote-state/pg/go.sum @@ -217,8 +217,8 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/zclconf/go-cty v1.15.0 h1:tTCRWxsexYUmtt/wVxgDClUe+uQusuI443uL6e+5sXQ= -github.com/zclconf/go-cty v1.15.0/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7 h1:0vfzNfMza1xy8F0pbg9ut4KhfqQKtuq46a6wcRvsTEU= +github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940 h1:4r45xpDWB6ZMSMNJFMOjqrGHynW3DIBuR2H9j0ug+Mo= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940/go.mod h1:CmBdvvj3nqzfzJ6nTCIwDTPZ56aVGvDrmztiO5g3qrM= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= diff --git a/internal/backend/remote-state/s3/go.mod b/internal/backend/remote-state/s3/go.mod index 6f3b4a27a9f7..5058ebf0ec67 100644 --- a/internal/backend/remote-state/s3/go.mod +++ b/internal/backend/remote-state/s3/go.mod @@ -15,7 +15,7 @@ require ( github.com/hashicorp/go-uuid v1.0.3 github.com/hashicorp/hcl/v2 v2.22.1-0.20240924195505-78fe99307e88 github.com/hashicorp/terraform v0.0.0-00010101000000-000000000000 - github.com/zclconf/go-cty v1.15.0 + github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7 ) require ( diff --git a/internal/backend/remote-state/s3/go.sum b/internal/backend/remote-state/s3/go.sum index 75983c0fc7f2..b85cfb7a9a77 100644 --- a/internal/backend/remote-state/s3/go.sum +++ b/internal/backend/remote-state/s3/go.sum @@ -287,8 +287,8 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/zclconf/go-cty v1.15.0 h1:tTCRWxsexYUmtt/wVxgDClUe+uQusuI443uL6e+5sXQ= -github.com/zclconf/go-cty v1.15.0/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7 h1:0vfzNfMza1xy8F0pbg9ut4KhfqQKtuq46a6wcRvsTEU= +github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940 h1:4r45xpDWB6ZMSMNJFMOjqrGHynW3DIBuR2H9j0ug+Mo= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940/go.mod h1:CmBdvvj3nqzfzJ6nTCIwDTPZ56aVGvDrmztiO5g3qrM= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= diff --git a/internal/legacy/go.mod b/internal/legacy/go.mod index 3535c56a37fc..567040e1e9b0 100644 --- a/internal/legacy/go.mod +++ b/internal/legacy/go.mod @@ -11,7 +11,7 @@ require ( github.com/mitchellh/copystructure v1.2.0 github.com/mitchellh/mapstructure v1.5.0 github.com/mitchellh/reflectwalk v1.0.2 - github.com/zclconf/go-cty v1.15.0 + github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7 ) require ( diff --git a/internal/legacy/go.sum b/internal/legacy/go.sum index 084167186a20..4b5fe372fc6f 100644 --- a/internal/legacy/go.sum +++ b/internal/legacy/go.sum @@ -219,8 +219,8 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/zclconf/go-cty v1.15.0 h1:tTCRWxsexYUmtt/wVxgDClUe+uQusuI443uL6e+5sXQ= -github.com/zclconf/go-cty v1.15.0/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7 h1:0vfzNfMza1xy8F0pbg9ut4KhfqQKtuq46a6wcRvsTEU= +github.com/zclconf/go-cty v1.15.1-0.20241111215639-63279be090d7/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940 h1:4r45xpDWB6ZMSMNJFMOjqrGHynW3DIBuR2H9j0ug+Mo= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940/go.mod h1:CmBdvvj3nqzfzJ6nTCIwDTPZ56aVGvDrmztiO5g3qrM= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= From effc1414b43042a083047baeb0c9b528487a7d51 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Tue, 12 Nov 2024 10:12:58 -0500 Subject: [PATCH 33/50] enable remaining ephemeral value tests --- internal/terraform/context_plan_ephemeral_test.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/internal/terraform/context_plan_ephemeral_test.go b/internal/terraform/context_plan_ephemeral_test.go index 379cb55a500e..e84c93e38fc7 100644 --- a/internal/terraform/context_plan_ephemeral_test.go +++ b/internal/terraform/context_plan_ephemeral_test.go @@ -21,7 +21,6 @@ import ( func TestContext2Plan_ephemeralValues(t *testing.T) { for name, tc := range map[string]struct { - toBeImplemented bool // Skip the test module map[string]string expectValidateDiagnostics func(m *configs.Config) tfdiags.Diagnostics expectPlanDiagnostics func(m *configs.Config) tfdiags.Diagnostics @@ -267,7 +266,6 @@ resource "test_object" "test" { }, "functions": { - toBeImplemented: true, module: map[string]string{ "child/main.tf": ` ephemeral "ephem_resource" "data" {} @@ -294,7 +292,6 @@ module "child" { }, "provider-defined functions": { - toBeImplemented: true, module: map[string]string{ "child/main.tf": ` @@ -554,9 +551,6 @@ You can correct this by removing references to ephemeral values, or by carefully }, } { t.Run(name, func(t *testing.T) { - if tc.toBeImplemented { - t.Skip("To be implemented") - } m := testModuleInline(t, tc.module) ephem := &testing_provider.MockProvider{ From 50b3732f723afcfe96170e2d5484bf76526da519 Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Tue, 12 Nov 2024 14:05:38 +0100 Subject: [PATCH 34/50] write-only attributes: add to provider schema --- docs/plugin-protocol/tfplugin5.8.proto | 687 +++++++++++ docs/plugin-protocol/tfplugin6.8.proto | 667 +++++++++++ internal/configs/configschema/schema.go | 4 + internal/plugin/convert/schema.go | 1 + internal/plugin6/convert/schema.go | 1 + internal/tfplugin5/tfplugin5.pb.go | 1448 ++++++++++++----------- internal/tfplugin5/tfplugin5.proto | 2 +- internal/tfplugin6/tfplugin6.pb.go | 1362 ++++++++++----------- internal/tfplugin6/tfplugin6.proto | 2 +- 9 files changed, 2777 insertions(+), 1397 deletions(-) create mode 100644 docs/plugin-protocol/tfplugin5.8.proto create mode 100644 docs/plugin-protocol/tfplugin6.8.proto diff --git a/docs/plugin-protocol/tfplugin5.8.proto b/docs/plugin-protocol/tfplugin5.8.proto new file mode 100644 index 000000000000..60764179f796 --- /dev/null +++ b/docs/plugin-protocol/tfplugin5.8.proto @@ -0,0 +1,687 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +// Terraform Plugin RPC protocol version 5.8 +// +// This file defines version 5.8 of the RPC protocol. To implement a plugin +// against this protocol, copy this definition into your own codebase and +// use protoc to generate stubs for your target language. +// +// This file will not be updated. Any minor versions of protocol 5 to follow +// should copy this file and modify the copy while maintaing backwards +// compatibility. Breaking changes, if any are required, will come +// in a subsequent major version with its own separate proto definition. +// +// Note that only the proto files included in a release tag of Terraform are +// official protocol releases. Proto files taken from other commits may include +// incomplete changes or features that did not make it into a final release. +// In all reasonable cases, plugin developers should take the proto file from +// the tag of the most recent release of Terraform, and not from the main +// branch or any other development branch. +// +syntax = "proto3"; +option go_package = "github.com/hashicorp/terraform/internal/tfplugin5"; + +import "google/protobuf/timestamp.proto"; + +package tfplugin5; + +// DynamicValue is an opaque encoding of terraform data, with the field name +// indicating the encoding scheme used. +message DynamicValue { + bytes msgpack = 1; + bytes json = 2; +} + +message Diagnostic { + enum Severity { + INVALID = 0; + ERROR = 1; + WARNING = 2; + } + Severity severity = 1; + string summary = 2; + string detail = 3; + AttributePath attribute = 4; +} + +message FunctionError { + string text = 1; + // The optional function_argument records the index position of the + // argument which caused the error. + optional int64 function_argument = 2; +} + +message AttributePath { + message Step { + oneof selector { + // Set "attribute_name" to represent looking up an attribute + // in the current object value. + string attribute_name = 1; + // Set "element_key_*" to represent looking up an element in + // an indexable collection type. + string element_key_string = 2; + int64 element_key_int = 3; + } + } + repeated Step steps = 1; +} + +message Stop { + message Request { + } + message Response { + string Error = 1; + } +} + +// RawState holds the stored state for a resource to be upgraded by the +// provider. It can be in one of two formats, the current json encoded format +// in bytes, or the legacy flatmap format as a map of strings. +message RawState { + bytes json = 1; + map flatmap = 2; +} + +enum StringKind { + PLAIN = 0; + MARKDOWN = 1; +} + +// Schema is the configuration schema for a Resource, Provider, or Provisioner. +message Schema { + message Block { + int64 version = 1; + repeated Attribute attributes = 2; + repeated NestedBlock block_types = 3; + string description = 4; + StringKind description_kind = 5; + bool deprecated = 6; + } + + message Attribute { + string name = 1; + bytes type = 2; + string description = 3; + bool required = 4; + bool optional = 5; + bool computed = 6; + bool sensitive = 7; + StringKind description_kind = 8; + bool deprecated = 9; + bool write_only = 10; + } + + message NestedBlock { + enum NestingMode { + INVALID = 0; + SINGLE = 1; + LIST = 2; + SET = 3; + MAP = 4; + GROUP = 5; + } + + string type_name = 1; + Block block = 2; + NestingMode nesting = 3; + int64 min_items = 4; + int64 max_items = 5; + } + + // The version of the schema. + // Schemas are versioned, so that providers can upgrade a saved resource + // state when the schema is changed. + int64 version = 1; + + // Block is the top level configuration block for this schema. + Block block = 2; +} + +// ServerCapabilities allows providers to communicate extra information +// regarding supported protocol features. This is used to indicate +// availability of certain forward-compatible changes which may be optional +// in a major protocol version, but cannot be tested for directly. +message ServerCapabilities { + // The plan_destroy capability signals that a provider expects a call + // to PlanResourceChange when a resource is going to be destroyed. + bool plan_destroy = 1; + + // The get_provider_schema_optional capability indicates that this + // provider does not require calling GetProviderSchema to operate + // normally, and the caller can used a cached copy of the provider's + // schema. + bool get_provider_schema_optional = 2; + + // The move_resource_state capability signals that a provider supports the + // MoveResourceState RPC. + bool move_resource_state = 3; +} + +// ClientCapabilities allows Terraform to publish information regarding +// supported protocol features. This is used to indicate availability of +// certain forward-compatible changes which may be optional in a major +// protocol version, but cannot be tested for directly. +message ClientCapabilities { + // The deferral_allowed capability signals that the client is able to + // handle deferred responses from the provider. + bool deferral_allowed = 1; +} + +message Function { + // parameters is the ordered list of positional function parameters. + repeated Parameter parameters = 1; + + // variadic_parameter is an optional final parameter which accepts + // zero or more argument values, in which Terraform will send an + // ordered list of the parameter type. + Parameter variadic_parameter = 2; + + // Return is the function return parameter. + Return return = 3; + + // summary is the human-readable shortened documentation for the function. + string summary = 4; + + // description is human-readable documentation for the function. + string description = 5; + + // description_kind is the formatting of the description. + StringKind description_kind = 6; + + // deprecation_message is human-readable documentation if the + // function is deprecated. + string deprecation_message = 7; + + message Parameter { + // name is the human-readable display name for the parameter. + string name = 1; + + // type is the type constraint for the parameter. + bytes type = 2; + + // allow_null_value when enabled denotes that a null argument value can + // be passed to the provider. When disabled, Terraform returns an error + // if the argument value is null. + bool allow_null_value = 3; + + // allow_unknown_values when enabled denotes that only wholly known + // argument values will be passed to the provider. When disabled, + // Terraform skips the function call entirely and assumes an unknown + // value result from the function. + bool allow_unknown_values = 4; + + // description is human-readable documentation for the parameter. + string description = 5; + + // description_kind is the formatting of the description. + StringKind description_kind = 6; + } + + message Return { + // type is the type constraint for the function result. + bytes type = 1; + } +} + +// Deferred is a message that indicates that change is deferred for a reason. +message Deferred { + // Reason is the reason for deferring the change. + enum Reason { + // UNKNOWN is the default value, and should not be used. + UNKNOWN = 0; + // RESOURCE_CONFIG_UNKNOWN is used when the config is partially unknown and the real + // values need to be known before the change can be planned. + RESOURCE_CONFIG_UNKNOWN = 1; + // PROVIDER_CONFIG_UNKNOWN is used when parts of the provider configuration + // are unknown, e.g. the provider configuration is only known after the apply is done. + PROVIDER_CONFIG_UNKNOWN = 2; + // ABSENT_PREREQ is used when a hard dependency has not been satisfied. + ABSENT_PREREQ = 3; + } + + // reason is the reason for deferring the change. + Reason reason = 1; +} + + +service Provider { + //////// Information about what a provider supports/expects + + // GetMetadata returns upfront information about server capabilities and + // supported resource types without requiring the server to instantiate all + // schema information, which may be memory intensive. This RPC is optional, + // where clients may receive an unimplemented RPC error. Clients should + // ignore the error and call the GetSchema RPC as a fallback. + rpc GetMetadata(GetMetadata.Request) returns (GetMetadata.Response); + + // GetSchema returns schema information for the provider, data resources, + // and managed resources. + rpc GetSchema(GetProviderSchema.Request) returns (GetProviderSchema.Response); + rpc PrepareProviderConfig(PrepareProviderConfig.Request) returns (PrepareProviderConfig.Response); + rpc ValidateResourceTypeConfig(ValidateResourceTypeConfig.Request) returns (ValidateResourceTypeConfig.Response); + rpc ValidateDataSourceConfig(ValidateDataSourceConfig.Request) returns (ValidateDataSourceConfig.Response); + rpc UpgradeResourceState(UpgradeResourceState.Request) returns (UpgradeResourceState.Response); + + //////// One-time initialization, called before other functions below + rpc Configure(Configure.Request) returns (Configure.Response); + + //////// Managed Resource Lifecycle + rpc ReadResource(ReadResource.Request) returns (ReadResource.Response); + rpc PlanResourceChange(PlanResourceChange.Request) returns (PlanResourceChange.Response); + rpc ApplyResourceChange(ApplyResourceChange.Request) returns (ApplyResourceChange.Response); + rpc ImportResourceState(ImportResourceState.Request) returns (ImportResourceState.Response); + rpc MoveResourceState(MoveResourceState.Request) returns (MoveResourceState.Response); + rpc ReadDataSource(ReadDataSource.Request) returns (ReadDataSource.Response); + + //////// Ephemeral Resource Lifecycle + rpc ValidateEphemeralResourceConfig(ValidateEphemeralResourceConfig.Request) returns (ValidateEphemeralResourceConfig.Response); + rpc OpenEphemeralResource(OpenEphemeralResource.Request) returns (OpenEphemeralResource.Response); + rpc RenewEphemeralResource(RenewEphemeralResource.Request) returns (RenewEphemeralResource.Response); + rpc CloseEphemeralResource(CloseEphemeralResource.Request) returns (CloseEphemeralResource.Response); + + // GetFunctions returns the definitions of all functions. + rpc GetFunctions(GetFunctions.Request) returns (GetFunctions.Response); + + //////// Provider-contributed Functions + rpc CallFunction(CallFunction.Request) returns (CallFunction.Response); + + //////// Graceful Shutdown + rpc Stop(Stop.Request) returns (Stop.Response); +} + +message GetMetadata { + message Request { + } + + message Response { + ServerCapabilities server_capabilities = 1; + repeated Diagnostic diagnostics = 2; + repeated DataSourceMetadata data_sources = 3; + repeated ResourceMetadata resources = 4; + // functions returns metadata for any functions. + repeated FunctionMetadata functions = 5; + repeated EphemeralMetadata ephemeral_resources = 6; + } + + message EphemeralMetadata { + string type_name = 1; + } + + message FunctionMetadata { + // name is the function name. + string name = 1; + } + + message DataSourceMetadata { + string type_name = 1; + } + + message ResourceMetadata { + string type_name = 1; + } +} + +message GetProviderSchema { + message Request { + } + message Response { + Schema provider = 1; + map resource_schemas = 2; + map data_source_schemas = 3; + map functions = 7; + map ephemeral_resource_schemas = 8; + repeated Diagnostic diagnostics = 4; + Schema provider_meta = 5; + ServerCapabilities server_capabilities = 6; + } +} + +message PrepareProviderConfig { + message Request { + DynamicValue config = 1; + } + message Response { + DynamicValue prepared_config = 1; + repeated Diagnostic diagnostics = 2; + } +} + +message UpgradeResourceState { + // Request is the message that is sent to the provider during the + // UpgradeResourceState RPC. + // + // This message intentionally does not include configuration data as any + // configuration-based or configuration-conditional changes should occur + // during the PlanResourceChange RPC. Additionally, the configuration is + // not guaranteed to exist (in the case of resource destruction), be wholly + // known, nor match the given prior state, which could lead to unexpected + // provider behaviors for practitioners. + message Request { + string type_name = 1; + + // version is the schema_version number recorded in the state file + int64 version = 2; + + // raw_state is the raw states as stored for the resource. Core does + // not have access to the schema of prior_version, so it's the + // provider's responsibility to interpret this value using the + // appropriate older schema. The raw_state will be the json encoded + // state, or a legacy flat-mapped format. + RawState raw_state = 3; + } + message Response { + // new_state is a msgpack-encoded data structure that, when interpreted with + // the _current_ schema for this resource type, is functionally equivalent to + // that which was given in prior_state_raw. + DynamicValue upgraded_state = 1; + + // diagnostics describes any errors encountered during migration that could not + // be safely resolved, and warnings about any possibly-risky assumptions made + // in the upgrade process. + repeated Diagnostic diagnostics = 2; + } +} + +message ValidateResourceTypeConfig { + message Request { + string type_name = 1; + DynamicValue config = 2; + } + message Response { + repeated Diagnostic diagnostics = 1; + } +} + +message ValidateDataSourceConfig { + message Request { + string type_name = 1; + DynamicValue config = 2; + } + message Response { + repeated Diagnostic diagnostics = 1; + } +} + +message ValidateEphemeralResourceConfig { + message Request { + string type_name = 1; + DynamicValue config = 2; + } + message Response { + repeated Diagnostic diagnostics = 1; + } +} + +message Configure { + message Request { + string terraform_version = 1; + DynamicValue config = 2; + ClientCapabilities client_capabilities = 3; + } + message Response { + repeated Diagnostic diagnostics = 1; + } +} + +message ReadResource { + // Request is the message that is sent to the provider during the + // ReadResource RPC. + // + // This message intentionally does not include configuration data as any + // configuration-based or configuration-conditional changes should occur + // during the PlanResourceChange RPC. Additionally, the configuration is + // not guaranteed to be wholly known nor match the given prior state, which + // could lead to unexpected provider behaviors for practitioners. + message Request { + string type_name = 1; + DynamicValue current_state = 2; + bytes private = 3; + DynamicValue provider_meta = 4; + ClientCapabilities client_capabilities = 5; + } + message Response { + DynamicValue new_state = 1; + repeated Diagnostic diagnostics = 2; + bytes private = 3; + // deferred is set if the provider is deferring the change. If set the caller + // needs to handle the deferral. + Deferred deferred = 4; + } +} + +message PlanResourceChange { + message Request { + string type_name = 1; + DynamicValue prior_state = 2; + DynamicValue proposed_new_state = 3; + DynamicValue config = 4; + bytes prior_private = 5; + DynamicValue provider_meta = 6; + ClientCapabilities client_capabilities = 7; + } + + message Response { + DynamicValue planned_state = 1; + repeated AttributePath requires_replace = 2; + bytes planned_private = 3; + repeated Diagnostic diagnostics = 4; + + + // This may be set only by the helper/schema "SDK" in the main Terraform + // repository, to request that Terraform Core >=0.12 permit additional + // inconsistencies that can result from the legacy SDK type system + // and its imprecise mapping to the >=0.12 type system. + // The change in behavior implied by this flag makes sense only for the + // specific details of the legacy SDK type system, and are not a general + // mechanism to avoid proper type handling in providers. + // + // ==== DO NOT USE THIS ==== + // ==== THIS MUST BE LEFT UNSET IN ALL OTHER SDKS ==== + // ==== DO NOT USE THIS ==== + bool legacy_type_system = 5; + + // deferred is set if the provider is deferring the change. If set the caller + // needs to handle the deferral. + Deferred deferred = 6; + } +} + +message ApplyResourceChange { + message Request { + string type_name = 1; + DynamicValue prior_state = 2; + DynamicValue planned_state = 3; + DynamicValue config = 4; + bytes planned_private = 5; + DynamicValue provider_meta = 6; + } + message Response { + DynamicValue new_state = 1; + bytes private = 2; + repeated Diagnostic diagnostics = 3; + + // This may be set only by the helper/schema "SDK" in the main Terraform + // repository, to request that Terraform Core >=0.12 permit additional + // inconsistencies that can result from the legacy SDK type system + // and its imprecise mapping to the >=0.12 type system. + // The change in behavior implied by this flag makes sense only for the + // specific details of the legacy SDK type system, and are not a general + // mechanism to avoid proper type handling in providers. + // + // ==== DO NOT USE THIS ==== + // ==== THIS MUST BE LEFT UNSET IN ALL OTHER SDKS ==== + // ==== DO NOT USE THIS ==== + bool legacy_type_system = 4; + } +} + +message ImportResourceState { + message Request { + string type_name = 1; + string id = 2; + ClientCapabilities client_capabilities = 3; + } + + message ImportedResource { + string type_name = 1; + DynamicValue state = 2; + bytes private = 3; + } + + message Response { + repeated ImportedResource imported_resources = 1; + repeated Diagnostic diagnostics = 2; + // deferred is set if the provider is deferring the change. If set the caller + // needs to handle the deferral. + Deferred deferred = 3; + } +} + +message MoveResourceState { + message Request { + // The address of the provider the resource is being moved from. + string source_provider_address = 1; + + // The resource type that the resource is being moved from. + string source_type_name = 2; + + // The schema version of the resource type that the resource is being + // moved from. + int64 source_schema_version = 3; + + // The raw state of the resource being moved. Only the json field is + // populated, as there should be no legacy providers using the flatmap + // format that support newly introduced RPCs. + RawState source_state = 4; + + // The resource type that the resource is being moved to. + string target_type_name = 5; + + // The private state of the resource being moved. + bytes source_private = 6; + } + + message Response { + // The state of the resource after it has been moved. + DynamicValue target_state = 1; + + // Any diagnostics that occurred during the move. + repeated Diagnostic diagnostics = 2; + + // The private state of the resource after it has been moved. + bytes target_private = 3; + } +} + +message ReadDataSource { + message Request { + string type_name = 1; + DynamicValue config = 2; + DynamicValue provider_meta = 3; + ClientCapabilities client_capabilities = 4; + } + message Response { + DynamicValue state = 1; + repeated Diagnostic diagnostics = 2; + // deferred is set if the provider is deferring the change. If set the caller + // needs to handle the deferral. + Deferred deferred = 3; + } +} + +service Provisioner { + rpc GetSchema(GetProvisionerSchema.Request) returns (GetProvisionerSchema.Response); + rpc ValidateProvisionerConfig(ValidateProvisionerConfig.Request) returns (ValidateProvisionerConfig.Response); + rpc ProvisionResource(ProvisionResource.Request) returns (stream ProvisionResource.Response); + rpc Stop(Stop.Request) returns (Stop.Response); +} + +message GetProvisionerSchema { + message Request { + } + message Response { + Schema provisioner = 1; + repeated Diagnostic diagnostics = 2; + } +} + +message ValidateProvisionerConfig { + message Request { + DynamicValue config = 1; + } + message Response { + repeated Diagnostic diagnostics = 1; + } +} + +message ProvisionResource { + message Request { + DynamicValue config = 1; + DynamicValue connection = 2; + } + message Response { + string output = 1; + repeated Diagnostic diagnostics = 2; + } +} + +message OpenEphemeralResource { + message Request { + string type_name = 1; + DynamicValue config = 2; + ClientCapabilities client_capabilities = 3; + } + message Response { + repeated Diagnostic diagnostics = 1; + optional google.protobuf.Timestamp renew_at = 2; + DynamicValue result = 3; + optional bytes private = 4; + Deferred deferred = 5; + } +} + +message RenewEphemeralResource { + message Request { + string type_name = 1; + optional bytes private = 2; + } + message Response { + repeated Diagnostic diagnostics = 1; + optional google.protobuf.Timestamp renew_at = 2; + optional bytes private = 3; + } +} + +message CloseEphemeralResource { + message Request { + string type_name = 1; + optional bytes private = 2; + } + message Response { + repeated Diagnostic diagnostics = 1; + } +} + +message GetFunctions { + message Request {} + + message Response { + // functions is a mapping of function names to definitions. + map functions = 1; + + // diagnostics is any warnings or errors. + repeated Diagnostic diagnostics = 2; + } +} + +message CallFunction { + message Request { + string name = 1; + repeated DynamicValue arguments = 2; + } + message Response { + DynamicValue result = 1; + FunctionError error = 2; + } +} diff --git a/docs/plugin-protocol/tfplugin6.8.proto b/docs/plugin-protocol/tfplugin6.8.proto new file mode 100644 index 000000000000..d1f4aba00e06 --- /dev/null +++ b/docs/plugin-protocol/tfplugin6.8.proto @@ -0,0 +1,667 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +// Terraform Plugin RPC protocol version 6.8 +// +// This file defines version 6.8 of the RPC protocol. To implement a plugin +// against this protocol, copy this definition into your own codebase and +// use protoc to generate stubs for your target language. +// +// This file will not be updated. Any minor versions of protocol 6 to follow +// should copy this file and modify the copy while maintaing backwards +// compatibility. Breaking changes, if any are required, will come +// in a subsequent major version with its own separate proto definition. +// +// Note that only the proto files included in a release tag of Terraform are +// official protocol releases. Proto files taken from other commits may include +// incomplete changes or features that did not make it into a final release. +// In all reasonable cases, plugin developers should take the proto file from +// the tag of the most recent release of Terraform, and not from the main +// branch or any other development branch. +// +syntax = "proto3"; +option go_package = "github.com/hashicorp/terraform/internal/tfplugin6"; + +import "google/protobuf/timestamp.proto"; + +package tfplugin6; + +// DynamicValue is an opaque encoding of terraform data, with the field name +// indicating the encoding scheme used. +message DynamicValue { + bytes msgpack = 1; + bytes json = 2; +} + +message Diagnostic { + enum Severity { + INVALID = 0; + ERROR = 1; + WARNING = 2; + } + Severity severity = 1; + string summary = 2; + string detail = 3; + AttributePath attribute = 4; +} + +message FunctionError { + string text = 1; + // The optional function_argument records the index position of the + // argument which caused the error. + optional int64 function_argument = 2; +} + +message AttributePath { + message Step { + oneof selector { + // Set "attribute_name" to represent looking up an attribute + // in the current object value. + string attribute_name = 1; + // Set "element_key_*" to represent looking up an element in + // an indexable collection type. + string element_key_string = 2; + int64 element_key_int = 3; + } + } + repeated Step steps = 1; +} + +message StopProvider { + message Request { + } + message Response { + string Error = 1; + } +} + +// RawState holds the stored state for a resource to be upgraded by the +// provider. It can be in one of two formats, the current json encoded format +// in bytes, or the legacy flatmap format as a map of strings. +message RawState { + bytes json = 1; + map flatmap = 2; +} + +enum StringKind { + PLAIN = 0; + MARKDOWN = 1; +} + +// Schema is the configuration schema for a Resource or Provider. +message Schema { + message Block { + int64 version = 1; + repeated Attribute attributes = 2; + repeated NestedBlock block_types = 3; + string description = 4; + StringKind description_kind = 5; + bool deprecated = 6; + } + + message Attribute { + string name = 1; + bytes type = 2; + Object nested_type = 10; + string description = 3; + bool required = 4; + bool optional = 5; + bool computed = 6; + bool sensitive = 7; + StringKind description_kind = 8; + bool deprecated = 9; + bool write_only = 11; + } + + message NestedBlock { + enum NestingMode { + INVALID = 0; + SINGLE = 1; + LIST = 2; + SET = 3; + MAP = 4; + GROUP = 5; + } + + string type_name = 1; + Block block = 2; + NestingMode nesting = 3; + int64 min_items = 4; + int64 max_items = 5; + } + + message Object { + enum NestingMode { + INVALID = 0; + SINGLE = 1; + LIST = 2; + SET = 3; + MAP = 4; + } + + repeated Attribute attributes = 1; + NestingMode nesting = 3; + + // MinItems and MaxItems were never used in the protocol, and have no + // effect on validation. + int64 min_items = 4 [deprecated = true]; + int64 max_items = 5 [deprecated = true]; + } + + // The version of the schema. + // Schemas are versioned, so that providers can upgrade a saved resource + // state when the schema is changed. + int64 version = 1; + + // Block is the top level configuration block for this schema. + Block block = 2; +} + +message Function { + // parameters is the ordered list of positional function parameters. + repeated Parameter parameters = 1; + + // variadic_parameter is an optional final parameter which accepts + // zero or more argument values, in which Terraform will send an + // ordered list of the parameter type. + Parameter variadic_parameter = 2; + + // Return is the function return parameter. + Return return = 3; + + // summary is the human-readable shortened documentation for the function. + string summary = 4; + + // description is human-readable documentation for the function. + string description = 5; + + // description_kind is the formatting of the description. + StringKind description_kind = 6; + + // deprecation_message is human-readable documentation if the + // function is deprecated. + string deprecation_message = 7; + + message Parameter { + // name is the human-readable display name for the parameter. + string name = 1; + + // type is the type constraint for the parameter. + bytes type = 2; + + // allow_null_value when enabled denotes that a null argument value can + // be passed to the provider. When disabled, Terraform returns an error + // if the argument value is null. + bool allow_null_value = 3; + + // allow_unknown_values when enabled denotes that only wholly known + // argument values will be passed to the provider. When disabled, + // Terraform skips the function call entirely and assumes an unknown + // value result from the function. + bool allow_unknown_values = 4; + + // description is human-readable documentation for the parameter. + string description = 5; + + // description_kind is the formatting of the description. + StringKind description_kind = 6; + } + + message Return { + // type is the type constraint for the function result. + bytes type = 1; + } +} + +// ServerCapabilities allows providers to communicate extra information +// regarding supported protocol features. This is used to indicate +// availability of certain forward-compatible changes which may be optional +// in a major protocol version, but cannot be tested for directly. +message ServerCapabilities { + // The plan_destroy capability signals that a provider expects a call + // to PlanResourceChange when a resource is going to be destroyed. + bool plan_destroy = 1; + + // The get_provider_schema_optional capability indicates that this + // provider does not require calling GetProviderSchema to operate + // normally, and the caller can used a cached copy of the provider's + // schema. + bool get_provider_schema_optional = 2; + + // The move_resource_state capability signals that a provider supports the + // MoveResourceState RPC. + bool move_resource_state = 3; +} + +// ClientCapabilities allows Terraform to publish information regarding +// supported protocol features. This is used to indicate availability of +// certain forward-compatible changes which may be optional in a major +// protocol version, but cannot be tested for directly. +message ClientCapabilities { + // The deferral_allowed capability signals that the client is able to + // handle deferred responses from the provider. + bool deferral_allowed = 1; +} + +// Deferred is a message that indicates that change is deferred for a reason. +message Deferred { + // Reason is the reason for deferring the change. + enum Reason { + // UNKNOWN is the default value, and should not be used. + UNKNOWN = 0; + // RESOURCE_CONFIG_UNKNOWN is used when the config is partially unknown and the real + // values need to be known before the change can be planned. + RESOURCE_CONFIG_UNKNOWN = 1; + // PROVIDER_CONFIG_UNKNOWN is used when parts of the provider configuration + // are unknown, e.g. the provider configuration is only known after the apply is done. + PROVIDER_CONFIG_UNKNOWN = 2; + // ABSENT_PREREQ is used when a hard dependency has not been satisfied. + ABSENT_PREREQ = 3; + } + + // reason is the reason for deferring the change. + Reason reason = 1; +} + +service Provider { + //////// Information about what a provider supports/expects + + // GetMetadata returns upfront information about server capabilities and + // supported resource types without requiring the server to instantiate all + // schema information, which may be memory intensive. This RPC is optional, + // where clients may receive an unimplemented RPC error. Clients should + // ignore the error and call the GetProviderSchema RPC as a fallback. + rpc GetMetadata(GetMetadata.Request) returns (GetMetadata.Response); + + // GetSchema returns schema information for the provider, data resources, + // and managed resources. + rpc GetProviderSchema(GetProviderSchema.Request) returns (GetProviderSchema.Response); + rpc ValidateProviderConfig(ValidateProviderConfig.Request) returns (ValidateProviderConfig.Response); + rpc ValidateResourceConfig(ValidateResourceConfig.Request) returns (ValidateResourceConfig.Response); + rpc ValidateDataResourceConfig(ValidateDataResourceConfig.Request) returns (ValidateDataResourceConfig.Response); + rpc UpgradeResourceState(UpgradeResourceState.Request) returns (UpgradeResourceState.Response); + + //////// One-time initialization, called before other functions below + rpc ConfigureProvider(ConfigureProvider.Request) returns (ConfigureProvider.Response); + + //////// Managed Resource Lifecycle + rpc ReadResource(ReadResource.Request) returns (ReadResource.Response); + rpc PlanResourceChange(PlanResourceChange.Request) returns (PlanResourceChange.Response); + rpc ApplyResourceChange(ApplyResourceChange.Request) returns (ApplyResourceChange.Response); + rpc ImportResourceState(ImportResourceState.Request) returns (ImportResourceState.Response); + rpc MoveResourceState(MoveResourceState.Request) returns (MoveResourceState.Response); + rpc ReadDataSource(ReadDataSource.Request) returns (ReadDataSource.Response); + + //////// Ephemeral Resource Lifecycle + rpc ValidateEphemeralResourceConfig(ValidateEphemeralResourceConfig.Request) returns (ValidateEphemeralResourceConfig.Response); + rpc OpenEphemeralResource(OpenEphemeralResource.Request) returns (OpenEphemeralResource.Response); + rpc RenewEphemeralResource(RenewEphemeralResource.Request) returns (RenewEphemeralResource.Response); + rpc CloseEphemeralResource(CloseEphemeralResource.Request) returns (CloseEphemeralResource.Response); + + // GetFunctions returns the definitions of all functions. + rpc GetFunctions(GetFunctions.Request) returns (GetFunctions.Response); + + //////// Provider-contributed Functions + rpc CallFunction(CallFunction.Request) returns (CallFunction.Response); + + //////// Graceful Shutdown + rpc StopProvider(StopProvider.Request) returns (StopProvider.Response); +} + +message GetMetadata { + message Request { + } + + message Response { + ServerCapabilities server_capabilities = 1; + repeated Diagnostic diagnostics = 2; + repeated DataSourceMetadata data_sources = 3; + repeated ResourceMetadata resources = 4; + // functions returns metadata for any functions. + repeated FunctionMetadata functions = 5; + repeated EphemeralMetadata ephemeral_resources = 6; + } + + message EphemeralMetadata { + string type_name = 1; + } + + message FunctionMetadata { + // name is the function name. + string name = 1; + } + + message DataSourceMetadata { + string type_name = 1; + } + + message ResourceMetadata { + string type_name = 1; + } +} + +message GetProviderSchema { + message Request { + } + message Response { + Schema provider = 1; + map resource_schemas = 2; + map data_source_schemas = 3; + map functions = 7; + map ephemeral_resource_schemas = 8; + repeated Diagnostic diagnostics = 4; + Schema provider_meta = 5; + ServerCapabilities server_capabilities = 6; + } +} + +message ValidateProviderConfig { + message Request { + DynamicValue config = 1; + } + message Response { + repeated Diagnostic diagnostics = 2; + } +} + +message UpgradeResourceState { + // Request is the message that is sent to the provider during the + // UpgradeResourceState RPC. + // + // This message intentionally does not include configuration data as any + // configuration-based or configuration-conditional changes should occur + // during the PlanResourceChange RPC. Additionally, the configuration is + // not guaranteed to exist (in the case of resource destruction), be wholly + // known, nor match the given prior state, which could lead to unexpected + // provider behaviors for practitioners. + message Request { + string type_name = 1; + + // version is the schema_version number recorded in the state file + int64 version = 2; + + // raw_state is the raw states as stored for the resource. Core does + // not have access to the schema of prior_version, so it's the + // provider's responsibility to interpret this value using the + // appropriate older schema. The raw_state will be the json encoded + // state, or a legacy flat-mapped format. + RawState raw_state = 3; + } + message Response { + // new_state is a msgpack-encoded data structure that, when interpreted with + // the _current_ schema for this resource type, is functionally equivalent to + // that which was given in prior_state_raw. + DynamicValue upgraded_state = 1; + + // diagnostics describes any errors encountered during migration that could not + // be safely resolved, and warnings about any possibly-risky assumptions made + // in the upgrade process. + repeated Diagnostic diagnostics = 2; + } +} + +message ValidateResourceConfig { + message Request { + string type_name = 1; + DynamicValue config = 2; + } + message Response { + repeated Diagnostic diagnostics = 1; + } +} + +message ValidateDataResourceConfig { + message Request { + string type_name = 1; + DynamicValue config = 2; + } + message Response { + repeated Diagnostic diagnostics = 1; + } +} + +message ValidateEphemeralResourceConfig { + message Request { + string type_name = 1; + DynamicValue config = 2; + } + message Response { + repeated Diagnostic diagnostics = 1; + } +} + +message ConfigureProvider { + message Request { + string terraform_version = 1; + DynamicValue config = 2; + ClientCapabilities client_capabilities = 3; + } + message Response { + repeated Diagnostic diagnostics = 1; + } +} + +message ReadResource { + // Request is the message that is sent to the provider during the + // ReadResource RPC. + // + // This message intentionally does not include configuration data as any + // configuration-based or configuration-conditional changes should occur + // during the PlanResourceChange RPC. Additionally, the configuration is + // not guaranteed to be wholly known nor match the given prior state, which + // could lead to unexpected provider behaviors for practitioners. + message Request { + string type_name = 1; + DynamicValue current_state = 2; + bytes private = 3; + DynamicValue provider_meta = 4; + ClientCapabilities client_capabilities = 5; + } + message Response { + DynamicValue new_state = 1; + repeated Diagnostic diagnostics = 2; + bytes private = 3; + // deferred is set if the provider is deferring the change. If set the caller + // needs to handle the deferral. + Deferred deferred = 4; + } +} + +message PlanResourceChange { + message Request { + string type_name = 1; + DynamicValue prior_state = 2; + DynamicValue proposed_new_state = 3; + DynamicValue config = 4; + bytes prior_private = 5; + DynamicValue provider_meta = 6; + ClientCapabilities client_capabilities = 7; + } + + message Response { + DynamicValue planned_state = 1; + repeated AttributePath requires_replace = 2; + bytes planned_private = 3; + repeated Diagnostic diagnostics = 4; + + // This may be set only by the helper/schema "SDK" in the main Terraform + // repository, to request that Terraform Core >=0.12 permit additional + // inconsistencies that can result from the legacy SDK type system + // and its imprecise mapping to the >=0.12 type system. + // The change in behavior implied by this flag makes sense only for the + // specific details of the legacy SDK type system, and are not a general + // mechanism to avoid proper type handling in providers. + // + // ==== DO NOT USE THIS ==== + // ==== THIS MUST BE LEFT UNSET IN ALL OTHER SDKS ==== + // ==== DO NOT USE THIS ==== + bool legacy_type_system = 5; + + // deferred is set if the provider is deferring the change. If set the caller + // needs to handle the deferral. + Deferred deferred = 6; + } +} + +message ApplyResourceChange { + message Request { + string type_name = 1; + DynamicValue prior_state = 2; + DynamicValue planned_state = 3; + DynamicValue config = 4; + bytes planned_private = 5; + DynamicValue provider_meta = 6; + } + message Response { + DynamicValue new_state = 1; + bytes private = 2; + repeated Diagnostic diagnostics = 3; + + // This may be set only by the helper/schema "SDK" in the main Terraform + // repository, to request that Terraform Core >=0.12 permit additional + // inconsistencies that can result from the legacy SDK type system + // and its imprecise mapping to the >=0.12 type system. + // The change in behavior implied by this flag makes sense only for the + // specific details of the legacy SDK type system, and are not a general + // mechanism to avoid proper type handling in providers. + // + // ==== DO NOT USE THIS ==== + // ==== THIS MUST BE LEFT UNSET IN ALL OTHER SDKS ==== + // ==== DO NOT USE THIS ==== + bool legacy_type_system = 4; + } +} + +message ImportResourceState { + message Request { + string type_name = 1; + string id = 2; + ClientCapabilities client_capabilities = 3; + } + + message ImportedResource { + string type_name = 1; + DynamicValue state = 2; + bytes private = 3; + } + + message Response { + repeated ImportedResource imported_resources = 1; + repeated Diagnostic diagnostics = 2; + // deferred is set if the provider is deferring the change. If set the caller + // needs to handle the deferral. + Deferred deferred = 3; + } +} + +message MoveResourceState { + message Request { + // The address of the provider the resource is being moved from. + string source_provider_address = 1; + + // The resource type that the resource is being moved from. + string source_type_name = 2; + + // The schema version of the resource type that the resource is being + // moved from. + int64 source_schema_version = 3; + + // The raw state of the resource being moved. Only the json field is + // populated, as there should be no legacy providers using the flatmap + // format that support newly introduced RPCs. + RawState source_state = 4; + + // The resource type that the resource is being moved to. + string target_type_name = 5; + + // The private state of the resource being moved. + bytes source_private = 6; + } + + message Response { + // The state of the resource after it has been moved. + DynamicValue target_state = 1; + + // Any diagnostics that occurred during the move. + repeated Diagnostic diagnostics = 2; + + // The private state of the resource after it has been moved. + bytes target_private = 3; + } +} + +message ReadDataSource { + message Request { + string type_name = 1; + DynamicValue config = 2; + DynamicValue provider_meta = 3; + ClientCapabilities client_capabilities = 4; + } + message Response { + DynamicValue state = 1; + repeated Diagnostic diagnostics = 2; + // deferred is set if the provider is deferring the change. If set the caller + // needs to handle the deferral. + Deferred deferred = 3; + } +} + +message OpenEphemeralResource { + message Request { + string type_name = 1; + DynamicValue config = 2; + ClientCapabilities client_capabilities = 3; + } + message Response { + repeated Diagnostic diagnostics = 1; + optional google.protobuf.Timestamp renew_at = 2; + DynamicValue result = 3; + optional bytes private = 4; + Deferred deferred = 5; + } +} + +message RenewEphemeralResource { + message Request { + string type_name = 1; + optional bytes private = 2; + } + message Response { + repeated Diagnostic diagnostics = 1; + optional google.protobuf.Timestamp renew_at = 2; + optional bytes private = 3; + } +} + +message CloseEphemeralResource { + message Request { + string type_name = 1; + optional bytes private = 2; + } + message Response { + repeated Diagnostic diagnostics = 1; + } +} + +message GetFunctions { + message Request {} + + message Response { + // functions is a mapping of function names to definitions. + map functions = 1; + + // diagnostics is any warnings or errors. + repeated Diagnostic diagnostics = 2; + } +} + +message CallFunction { + message Request { + string name = 1; + repeated DynamicValue arguments = 2; + } + message Response { + DynamicValue result = 1; + FunctionError error = 2; + } +} diff --git a/internal/configs/configschema/schema.go b/internal/configs/configschema/schema.go index a5c03579e708..5ce268fc55b8 100644 --- a/internal/configs/configschema/schema.go +++ b/internal/configs/configschema/schema.go @@ -78,6 +78,10 @@ type Attribute struct { Sensitive bool Deprecated bool + + // WriteOnly, if set to true, indicates that the attribute is not presisted + // in the state. + WriteOnly bool } // Object represents the embedding of a structural object inside an Attribute. diff --git a/internal/plugin/convert/schema.go b/internal/plugin/convert/schema.go index 3a4023cca308..41e48ba61806 100644 --- a/internal/plugin/convert/schema.go +++ b/internal/plugin/convert/schema.go @@ -34,6 +34,7 @@ func ConfigSchemaToProto(b *configschema.Block) *proto.Schema_Block { Required: a.Required, Sensitive: a.Sensitive, Deprecated: a.Deprecated, + WriteOnly: a.WriteOnly, } ty, err := json.Marshal(a.Type) diff --git a/internal/plugin6/convert/schema.go b/internal/plugin6/convert/schema.go index 64ea043b98ae..39c1ff62044b 100644 --- a/internal/plugin6/convert/schema.go +++ b/internal/plugin6/convert/schema.go @@ -35,6 +35,7 @@ func ConfigSchemaToProto(b *configschema.Block) *proto.Schema_Block { Required: a.Required, Sensitive: a.Sensitive, Deprecated: a.Deprecated, + WriteOnly: a.WriteOnly, } if a.Type != cty.NilType { diff --git a/internal/tfplugin5/tfplugin5.pb.go b/internal/tfplugin5/tfplugin5.pb.go index 2041ea244c0a..a157ec572a94 100644 --- a/internal/tfplugin5/tfplugin5.pb.go +++ b/internal/tfplugin5/tfplugin5.pb.go @@ -1,9 +1,9 @@ // Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: MPL-2.0 -// Terraform Plugin RPC protocol version 5.7 +// Terraform Plugin RPC protocol version 5.8 // -// This file defines version 5.7 of the RPC protocol. To implement a plugin +// This file defines version 5.8 of the RPC protocol. To implement a plugin // against this protocol, copy this definition into your own codebase and // use protoc to generate stubs for your target language. // @@ -2050,6 +2050,7 @@ type Schema_Attribute struct { Sensitive bool `protobuf:"varint,7,opt,name=sensitive,proto3" json:"sensitive,omitempty"` DescriptionKind StringKind `protobuf:"varint,8,opt,name=description_kind,json=descriptionKind,proto3,enum=tfplugin5.StringKind" json:"description_kind,omitempty"` Deprecated bool `protobuf:"varint,9,opt,name=deprecated,proto3" json:"deprecated,omitempty"` + WriteOnly bool `protobuf:"varint,10,opt,name=write_only,json=writeOnly,proto3" json:"write_only,omitempty"` } func (x *Schema_Attribute) Reset() { @@ -2147,6 +2148,13 @@ func (x *Schema_Attribute) GetDeprecated() bool { return false } +func (x *Schema_Attribute) GetWriteOnly() bool { + if x != nil { + return x.WriteOnly + } + return false +} + type Schema_NestedBlock struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5420,7 +5428,7 @@ var file_tfplugin5_proto_rawDesc = []byte{ 0x3a, 0x0a, 0x0c, 0x46, 0x6c, 0x61, 0x74, 0x6d, 0x61, 0x70, 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, 0x22, 0xcc, 0x07, 0x0a, 0x06, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xeb, 0x07, 0x0a, 0x06, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, @@ -5444,7 +5452,7 @@ var file_tfplugin5_proto_rawDesc = []byte{ 0x69, 0x6e, 0x64, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, - 0x61, 0x74, 0x65, 0x64, 0x1a, 0xa9, 0x02, 0x0a, 0x09, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x61, 0x74, 0x65, 0x64, 0x1a, 0xc8, 0x02, 0x0a, 0x09, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, @@ -5463,762 +5471,764 @@ var file_tfplugin5_proto_rawDesc = []byte{ 0x0f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, - 0x1a, 0xa7, 0x02, 0x0a, 0x0b, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, - 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x1a, + 0xa7, 0x02, 0x0a, 0x0b, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, + 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x43, 0x0a, 0x07, 0x6e, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x43, 0x0a, 0x07, - 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, - 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x4e, 0x65, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x07, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x1b, - 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x4d, 0x0a, 0x0b, 0x4e, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, - 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x49, 0x4e, 0x47, 0x4c, - 0x45, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x02, 0x12, 0x07, 0x0a, - 0x03, 0x53, 0x45, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x41, 0x50, 0x10, 0x04, 0x12, - 0x09, 0x0a, 0x05, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x05, 0x22, 0xa8, 0x01, 0x0a, 0x12, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x72, 0x6f, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x6c, 0x61, 0x6e, 0x44, 0x65, 0x73, - 0x74, 0x72, 0x6f, 0x79, 0x12, 0x3f, 0x0a, 0x1c, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x67, 0x65, 0x74, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x2e, 0x0a, 0x13, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x11, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3f, 0x0a, 0x12, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, - 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x64, - 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x41, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x22, 0x8e, 0x05, 0x0a, 0x08, 0x46, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x35, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x12, 0x4c, 0x0a, 0x12, 0x76, 0x61, 0x72, 0x69, 0x61, 0x64, 0x69, 0x63, 0x5f, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x11, 0x76, - 0x61, 0x72, 0x69, 0x61, 0x64, 0x69, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x12, 0x32, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x46, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x52, 0x06, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 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, 0x40, 0x0a, 0x10, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4b, 0x69, 0x6e, - 0x64, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x69, - 0x6e, 0x64, 0x12, 0x2f, 0x0a, 0x13, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x12, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x1a, 0xf3, 0x01, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x5f, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x75, 0x6e, 0x6b, - 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x12, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x73, 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, 0x40, 0x0a, 0x10, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x1a, 0x1c, 0x0a, 0x06, 0x52, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x08, 0x44, 0x65, 0x66, 0x65, - 0x72, 0x72, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, - 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, - 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x62, 0x0a, 0x06, 0x52, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, - 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, - 0x49, 0x47, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, - 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, - 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x41, 0x42, 0x53, - 0x45, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x45, 0x52, 0x45, 0x51, 0x10, 0x03, 0x22, 0xa3, 0x05, 0x0a, - 0x0b, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x09, 0x0a, 0x07, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0xca, 0x03, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x63, - 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x65, + 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x4e, 0x65, 0x73, 0x74, + 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x07, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x1b, 0x0a, + 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x08, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x4d, 0x0a, 0x0b, 0x4e, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, + 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, + 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, + 0x53, 0x45, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x41, 0x50, 0x10, 0x04, 0x12, 0x09, + 0x0a, 0x05, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x05, 0x22, 0xa8, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, - 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x69, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, - 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, - 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x4c, 0x0a, - 0x0c, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, - 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0b, - 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x09, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, - 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x73, 0x12, 0x45, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x35, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x09, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x59, 0x0a, 0x13, 0x65, 0x70, 0x68, - 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x35, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, - 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x52, 0x12, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x1a, 0x30, 0x0a, 0x11, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, - 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, - 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x26, 0x0a, 0x10, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x1a, 0x31, - 0x0a, 0x12, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x6c, 0x61, 0x6e, 0x44, 0x65, 0x73, 0x74, + 0x72, 0x6f, 0x79, 0x12, 0x3f, 0x0a, 0x1c, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x67, 0x65, 0x74, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x2e, 0x0a, 0x13, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x11, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x22, 0x3f, 0x0a, 0x12, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, + 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x65, + 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x41, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x22, 0x8e, 0x05, 0x0a, 0x08, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x35, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x12, 0x4c, 0x0a, 0x12, 0x76, 0x61, 0x72, 0x69, 0x61, 0x64, 0x69, 0x63, 0x5f, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x11, 0x76, 0x61, + 0x72, 0x69, 0x61, 0x64, 0x69, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, + 0x32, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x46, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 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, + 0x40, 0x0a, 0x10, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, + 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4b, 0x69, 0x6e, 0x64, + 0x52, 0x0f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x69, 0x6e, + 0x64, 0x12, 0x2f, 0x0a, 0x13, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, + 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x1a, 0xf3, 0x01, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x5f, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x75, 0x6e, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x12, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 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, 0x40, 0x0a, 0x10, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x1a, 0x1c, 0x0a, 0x06, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x08, 0x44, 0x65, 0x66, 0x65, 0x72, + 0x72, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, + 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, + 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x62, 0x0a, 0x06, 0x52, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x1b, + 0x0a, 0x17, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, + 0x47, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x50, + 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x55, + 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x41, 0x42, 0x53, 0x45, + 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x45, 0x52, 0x45, 0x51, 0x10, 0x03, 0x22, 0xa3, 0x05, 0x0a, 0x0b, + 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x09, 0x0a, 0x07, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0xca, 0x03, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x63, 0x61, + 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, + 0x12, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x69, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, + 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, + 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x4c, 0x0a, 0x0c, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x47, + 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0b, 0x64, + 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x09, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x12, 0x45, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, + 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x09, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x59, 0x0a, 0x13, 0x65, 0x70, 0x68, 0x65, + 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x35, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x70, + 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, + 0x12, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x1a, 0x30, 0x0a, 0x11, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x26, 0x0a, 0x10, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x1a, 0x31, 0x0a, + 0x12, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x1a, 0x2f, 0x0a, 0x10, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x1a, 0x2f, 0x0a, 0x10, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0xab, 0x08, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x1a, 0x09, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x8a, 0x08, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x2d, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, - 0x65, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x66, 0x70, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x6c, 0x0a, 0x13, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, - 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, + 0x65, 0x22, 0xab, 0x08, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x1a, 0x09, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x8a, 0x08, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x2d, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x65, + 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x6c, 0x0a, 0x13, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x47, + 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x11, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x12, 0x52, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x35, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x1a, 0x65, 0x70, 0x68, 0x65, + 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x74, + 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x11, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x73, 0x12, 0x52, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x35, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x1a, 0x65, 0x70, 0x68, - 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, - 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x18, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x37, 0x0a, 0x0b, - 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, - 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, - 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x36, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, - 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, - 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x4e, 0x0a, - 0x13, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x55, 0x0a, - 0x14, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 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, 0x27, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x35, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x57, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x79, 0x52, 0x18, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x37, 0x0a, 0x0b, 0x64, + 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, + 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x12, 0x36, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x66, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x0c, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x4e, 0x0a, 0x13, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x55, 0x0a, 0x14, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 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, 0x27, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x35, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x57, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 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, + 0x27, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x51, 0x0a, 0x0e, + 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 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, 0x27, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x51, 0x0a, - 0x0e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 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, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x46, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x1a, 0x5e, 0x0a, 0x1d, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 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, 0x27, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0xdb, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x3a, 0x0a, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x85, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x64, 0x5f, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, - 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x64, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, - 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, - 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x90, - 0x02, 0x0a, 0x14, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, 0x72, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x09, 0x72, 0x61, 0x77, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, - 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x52, 0x61, 0x77, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x08, 0x72, 0x61, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, 0x83, 0x01, 0x0a, 0x08, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0e, 0x75, 0x70, 0x67, 0x72, - 0x61, 0x64, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, - 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x75, 0x70, 0x67, 0x72, 0x61, - 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, - 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, - 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, - 0x73, 0x22, 0xba, 0x01, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x1a, 0x57, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, - 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x43, 0x0a, 0x08, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, - 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, - 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xb8, - 0x01, 0x0a, 0x18, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x57, 0x0a, 0x07, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, - 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x43, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, - 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xbf, 0x01, 0x0a, 0x1f, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x57, 0x0a, - 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x43, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, - 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x8a, 0x02, 0x0a, 0x09, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x1a, 0xb7, 0x01, 0x0a, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x10, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, + 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x46, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x5e, 0x0a, 0x1d, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 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, 0x27, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xdb, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x3a, 0x0a, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, + 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x85, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x64, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, + 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x90, 0x02, + 0x0a, 0x14, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, 0x72, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x09, 0x72, 0x61, 0x77, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x52, 0x61, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x08, 0x72, 0x61, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, 0x83, 0x01, 0x0a, 0x08, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0e, 0x75, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, + 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, + 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, + 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, + 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, + 0x22, 0xba, 0x01, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, + 0x57, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, + 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, + 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x43, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, + 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xb8, 0x01, + 0x0a, 0x18, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x57, 0x0a, 0x07, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x4e, 0x0a, 0x13, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, - 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x43, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, - 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, - 0x69, 0x65, 0x73, 0x1a, 0x43, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x66, 0x69, 0x67, 0x1a, 0x43, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, - 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xe4, 0x03, 0x0a, 0x0c, 0x52, 0x65, 0x61, - 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x8c, 0x02, 0x0a, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xbf, 0x01, 0x0a, 0x1f, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x57, 0x0a, 0x07, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, + 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x43, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, + 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x8a, 0x02, 0x0a, 0x09, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x1a, 0xb7, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, - 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x4e, 0x0a, 0x13, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x35, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x69, 0x65, 0x73, 0x52, 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, - 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0xc4, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, + 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x4e, 0x0a, 0x13, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x70, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x12, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x1a, 0x43, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, + 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, + 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, + 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xe4, 0x03, 0x0a, 0x0c, 0x52, 0x65, 0x61, 0x64, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x8c, 0x02, 0x0a, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, - 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, - 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, - 0x74, 0x69, 0x63, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x2f, - 0x0a, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x65, 0x66, - 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x22, - 0xf3, 0x05, 0x0a, 0x12, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x1a, 0x8b, 0x03, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x38, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, - 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x70, - 0x72, 0x69, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x45, 0x0a, 0x12, 0x70, 0x72, 0x6f, - 0x70, 0x6f, 0x73, 0x65, 0x64, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, - 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x4e, 0x65, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x65, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, - 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x50, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, - 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x4d, 0x65, 0x74, 0x61, 0x12, 0x4e, 0x0a, 0x13, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, - 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, - 0x52, 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x69, 0x65, 0x73, 0x1a, 0xce, 0x02, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x0c, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x43, 0x0a, 0x10, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x66, 0x70, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x50, - 0x61, 0x74, 0x68, 0x52, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, - 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, - 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, - 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, - 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, - 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x10, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x12, 0x2f, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x35, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x08, 0x64, 0x65, 0x66, - 0x65, 0x72, 0x72, 0x65, 0x64, 0x22, 0x92, 0x04, 0x0a, 0x13, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x1a, 0xb6, 0x02, - 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, - 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x3c, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, + 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x4e, 0x0a, 0x13, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, + 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0xc4, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x0c, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2f, - 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, - 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x27, 0x0a, 0x0f, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, - 0x64, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x52, 0x08, 0x6e, 0x65, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, + 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, + 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x2f, 0x0a, + 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x65, 0x66, 0x65, + 0x72, 0x72, 0x65, 0x64, 0x52, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x22, 0xf3, + 0x05, 0x0a, 0x12, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x1a, 0x8b, 0x03, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, + 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, + 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x70, 0x72, + 0x69, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x45, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x65, 0x64, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, + 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, 0x70, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x4e, 0x65, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, - 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0xc1, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x08, 0x6e, 0x65, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, - 0x76, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, - 0x63, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, - 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2c, 0x0a, 0x12, - 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, - 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x22, 0xef, 0x03, 0x0a, 0x13, 0x49, - 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x1a, 0x86, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x4e, 0x0a, 0x13, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, - 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, - 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x78, 0x0a, 0x10, 0x49, - 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x1a, 0xd4, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x12, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, - 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, - 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x49, - 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, - 0x11, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, - 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2f, 0x0a, 0x08, 0x64, - 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, - 0x65, 0x64, 0x52, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x22, 0xe7, 0x03, 0x0a, - 0x11, 0x4d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x1a, 0xa8, 0x02, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, - 0x0a, 0x17, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x15, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x13, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x52, 0x61, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x28, 0x0a, 0x10, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x1a, 0xa6, 0x01, - 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0c, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, - 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, - 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, - 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, - 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x22, 0x9e, 0x03, 0x0a, 0x0e, 0x52, 0x65, 0x61, 0x64, 0x44, - 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0xe5, 0x01, 0x0a, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, - 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x3c, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, - 0x6d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4d, 0x65, 0x74, - 0x61, 0x12, 0x4e, 0x0a, 0x13, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x70, 0x61, - 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x12, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x1a, 0xa3, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, - 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, - 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, - 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, - 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2f, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, - 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x08, 0x64, - 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x22, 0x9b, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x1a, 0x09, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x78, 0x0a, 0x08, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, - 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, - 0x0b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x0b, - 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x50, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, + 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4d, + 0x65, 0x74, 0x61, 0x12, 0x4e, 0x0a, 0x13, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, + 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, + 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x69, 0x65, 0x73, 0x1a, 0xce, 0x02, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3c, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x0c, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x43, + 0x0a, 0x10, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x50, 0x61, + 0x74, 0x68, 0x52, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x6c, + 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x0b, + 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, - 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x9c, 0x01, 0x0a, 0x19, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x1a, 0x3a, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, - 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x10, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x12, 0x2f, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x35, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x08, 0x64, 0x65, 0x66, 0x65, + 0x72, 0x72, 0x65, 0x64, 0x22, 0x92, 0x04, 0x0a, 0x13, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x1a, 0xb6, 0x02, 0x0a, + 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x3c, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x0c, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2f, 0x0a, + 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, + 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x27, + 0x0a, 0x0f, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, + 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, - 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, - 0x43, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, - 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, - 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, - 0x74, 0x69, 0x63, 0x73, 0x22, 0xe5, 0x01, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x73, 0x0a, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0xc1, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x34, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, + 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, + 0x6e, 0x65, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, + 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x6c, + 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x54, + 0x79, 0x70, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x22, 0xef, 0x03, 0x0a, 0x13, 0x49, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x1a, 0x86, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x4e, 0x0a, 0x13, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x35, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, + 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x78, 0x0a, 0x10, 0x49, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1b, + 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x1a, - 0x5b, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, - 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, - 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xdd, 0x03, 0x0a, - 0x15, 0x4f, 0x70, 0x65, 0x6e, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0xa7, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x1a, 0xd4, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x5e, 0x0a, 0x12, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, + 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x49, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x11, + 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, + 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2f, 0x0a, 0x08, 0x64, 0x65, + 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, + 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, + 0x64, 0x52, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x22, 0xe7, 0x03, 0x0a, 0x11, + 0x4d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x1a, 0xa8, 0x02, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, + 0x17, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x32, 0x0a, 0x15, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x52, 0x61, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0b, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x1a, 0xa6, 0x01, 0x0a, + 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0c, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, - 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, + 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x25, + 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x22, 0x9e, 0x03, 0x0a, 0x0e, 0x52, 0x65, 0x61, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0xe5, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, + 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x3c, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6d, + 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x4e, 0x0a, 0x13, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, - 0x1a, 0x99, 0x02, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, + 0x1a, 0xa3, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, + 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x0b, + 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, + 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, + 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2f, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x08, 0x64, 0x65, + 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x22, 0x9b, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x1a, + 0x09, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x78, 0x0a, 0x08, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x66, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x0b, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x0b, 0x64, + 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, + 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x22, 0x9c, 0x01, 0x0a, 0x19, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x1a, 0x3a, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, + 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, + 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x43, + 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, + 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, + 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x22, 0xe5, 0x01, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x73, 0x0a, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, + 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x5b, + 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, + 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xdd, 0x03, 0x0a, 0x15, + 0x4f, 0x70, 0x65, 0x6e, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0xa7, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, + 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, + 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x4e, 0x0a, 0x13, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, + 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, + 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x12, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, + 0x99, 0x02, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, + 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, + 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, + 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x3a, 0x0a, 0x08, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x5f, 0x61, + 0x74, 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, 0x07, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x41, 0x74, 0x88, 0x01, + 0x01, 0x12, 0x2f, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, + 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x1d, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0c, 0x48, 0x01, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x2f, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, + 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, + 0x65, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x74, 0x42, + 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x22, 0xa5, 0x02, 0x0a, 0x16, + 0x52, 0x65, 0x6e, 0x65, 0x77, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x51, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, + 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, + 0x00, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, + 0x08, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x1a, 0xb7, 0x01, 0x0a, 0x08, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, + 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, + 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, + 0x3a, 0x0a, 0x08, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x74, 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, + 0x07, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x41, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x01, 0x52, 0x07, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, + 0x65, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x74, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x22, 0xb0, 0x01, 0x0a, 0x16, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x45, 0x70, 0x68, + 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x51, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, + 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x1a, 0x43, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, - 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x3a, 0x0a, 0x08, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x5f, - 0x61, 0x74, 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, 0x07, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x41, 0x74, 0x88, - 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, - 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x12, 0x1d, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0c, 0x48, 0x01, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x88, - 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, - 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, - 0x72, 0x65, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x74, - 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x22, 0xa5, 0x02, 0x0a, - 0x16, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x51, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1d, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x48, 0x00, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0a, - 0x0a, 0x08, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x1a, 0xb7, 0x01, 0x0a, 0x08, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, - 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, - 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, - 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, - 0x12, 0x3a, 0x0a, 0x08, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x74, 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, 0x07, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x41, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, - 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x01, 0x52, - 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, - 0x72, 0x65, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x74, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x72, 0x69, - 0x76, 0x61, 0x74, 0x65, 0x22, 0xb0, 0x01, 0x0a, 0x16, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x45, 0x70, - 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, - 0x51, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, - 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, - 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x1a, 0x43, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, - 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, + 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x81, 0x02, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0xe5, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x4d, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x47, + 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, + 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, - 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x81, 0x02, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0xe5, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x4d, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, - 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, - 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, - 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x1a, 0x51, 0x0a, 0x0e, 0x46, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 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, 0x29, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, 0x0c, - 0x43, 0x61, 0x6c, 0x6c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x54, 0x0a, 0x07, - 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, 0x35, 0x0a, 0x09, 0x61, - 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, - 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x1a, 0x6b, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, - 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, - 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, - 0x2e, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2a, - 0x25, 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x09, 0x0a, - 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x4d, 0x41, 0x52, 0x4b, - 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x32, 0xcc, 0x0f, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x1e, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x47, - 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x47, - 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x12, 0x24, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x47, 0x65, 0x74, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x35, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6c, 0x0a, - 0x15, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x28, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x35, 0x2e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x29, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x50, 0x72, 0x65, - 0x70, 0x61, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7b, 0x0a, 0x1a, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2d, 0x2e, 0x74, 0x66, 0x70, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, + 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x1a, 0x51, 0x0a, 0x0e, 0x46, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 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, 0x29, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, 0x0c, 0x43, + 0x61, 0x6c, 0x6c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x54, 0x0a, 0x07, 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, 0x35, 0x0a, 0x09, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, + 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x1a, 0x6b, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, + 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, + 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2e, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2a, 0x25, + 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x09, 0x0a, 0x05, + 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x4d, 0x41, 0x52, 0x4b, 0x44, + 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x32, 0xcc, 0x0f, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x1e, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x47, 0x65, + 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x47, 0x65, + 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x58, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, + 0x24, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x47, 0x65, 0x74, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x35, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6c, 0x0a, 0x15, + 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x28, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x35, 0x2e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x29, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x50, 0x72, 0x65, 0x70, + 0x61, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7b, 0x0a, 0x1a, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, 0x18, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, - 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x69, 0x0a, 0x14, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x27, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x35, 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x28, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x55, 0x70, 0x67, - 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x09, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x1c, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x35, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x2e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x35, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x35, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, 0x18, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x2b, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2c, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x69, + 0x0a, 0x14, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x27, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x35, 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x28, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x55, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x09, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x1c, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x35, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, + 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, + 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x35, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x12, 0x50, 0x6c, 0x61, 0x6e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x25, 0x2e, - 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, - 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, 0x13, - 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x12, 0x26, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, - 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x66, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, 0x13, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, 0x2e, 0x74, 0x66, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, - 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x11, - 0x4d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x24, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x4d, 0x6f, - 0x76, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x35, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, - 0x0a, 0x0e, 0x52, 0x65, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x12, 0x21, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x52, 0x65, 0x61, - 0x64, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, - 0x52, 0x65, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x1f, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x2e, 0x74, 0x66, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x33, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6c, 0x0a, 0x15, 0x4f, 0x70, 0x65, 0x6e, 0x45, 0x70, 0x68, 0x65, - 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x28, 0x2e, - 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x45, 0x70, - 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x35, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x12, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x25, 0x2e, 0x74, + 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, + 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, 0x13, 0x41, + 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x12, 0x26, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x41, + 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x66, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, 0x13, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, 0x2e, 0x74, 0x66, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x49, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x11, 0x4d, + 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x24, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x4d, 0x6f, 0x76, + 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x35, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, + 0x0e, 0x52, 0x65, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, + 0x21, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x52, 0x65, 0x61, 0x64, + 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x52, + 0x65, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x1f, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x2e, 0x74, 0x66, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x45, + 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, + 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x6c, 0x0a, 0x15, 0x4f, 0x70, 0x65, 0x6e, 0x45, 0x70, 0x68, 0x65, 0x6d, + 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x28, 0x2e, 0x74, + 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x45, 0x70, 0x68, + 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x35, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x6f, 0x0a, 0x16, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, + 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x74, 0x66, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x45, 0x70, 0x68, + 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x35, 0x2e, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x6f, 0x0a, 0x16, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x45, 0x70, 0x68, 0x65, 0x6d, + 0x73, 0x65, 0x12, 0x6f, 0x0a, 0x16, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x74, - 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x45, 0x70, + 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x35, 0x2e, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, + 0x69, 0x6e, 0x35, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x6f, 0x0a, 0x16, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x45, 0x70, 0x68, 0x65, - 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x29, 0x2e, - 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x45, - 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, - 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, + 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, + 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x35, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x43, 0x61, 0x6c, 0x6c, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x43, 0x61, 0x6c, 0x6c, 0x46, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x35, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x04, 0x53, 0x74, - 0x6f, 0x70, 0x12, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, - 0x74, 0x6f, 0x70, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x74, 0x66, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x2e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x86, 0x03, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x5e, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x12, 0x27, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x47, - 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x66, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x78, 0x0a, 0x19, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x2c, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x62, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x12, 0x24, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, - 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x66, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x30, 0x01, 0x12, 0x39, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x17, 0x2e, 0x74, 0x66, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x2e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, - 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x33, - 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x35, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x04, 0x53, 0x74, 0x6f, + 0x70, 0x12, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x74, + 0x6f, 0x70, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x74, 0x66, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x2e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x86, 0x03, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x5e, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x12, 0x27, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x47, 0x65, + 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x66, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x78, 0x0a, 0x19, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x2c, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, + 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, + 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x24, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x66, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x30, 0x01, 0x12, 0x39, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x17, 0x2e, 0x74, 0x66, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x2e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x35, 0x2e, + 0x53, 0x74, 0x6f, 0x70, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x33, 0x5a, + 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x2f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x35, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/internal/tfplugin5/tfplugin5.proto b/internal/tfplugin5/tfplugin5.proto index 0f3ee9d2a398..42e74fd5608e 120000 --- a/internal/tfplugin5/tfplugin5.proto +++ b/internal/tfplugin5/tfplugin5.proto @@ -1 +1 @@ -../../docs/plugin-protocol/tfplugin5.7.proto \ No newline at end of file +../../docs/plugin-protocol/tfplugin5.8.proto \ No newline at end of file diff --git a/internal/tfplugin6/tfplugin6.pb.go b/internal/tfplugin6/tfplugin6.pb.go index a49bba7373b0..f3319246bfb6 100644 --- a/internal/tfplugin6/tfplugin6.pb.go +++ b/internal/tfplugin6/tfplugin6.pb.go @@ -1,9 +1,9 @@ // Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: MPL-2.0 -// Terraform Plugin RPC protocol version 6.7 +// Terraform Plugin RPC protocol version 6.8 // -// This file defines version 6.7 of the RPC protocol. To implement a plugin +// This file defines version 6.8 of the RPC protocol. To implement a plugin // against this protocol, copy this definition into your own codebase and // use protoc to generate stubs for your target language. // @@ -1992,6 +1992,7 @@ type Schema_Attribute struct { Sensitive bool `protobuf:"varint,7,opt,name=sensitive,proto3" json:"sensitive,omitempty"` DescriptionKind StringKind `protobuf:"varint,8,opt,name=description_kind,json=descriptionKind,proto3,enum=tfplugin6.StringKind" json:"description_kind,omitempty"` Deprecated bool `protobuf:"varint,9,opt,name=deprecated,proto3" json:"deprecated,omitempty"` + WriteOnly bool `protobuf:"varint,11,opt,name=write_only,json=writeOnly,proto3" json:"write_only,omitempty"` } func (x *Schema_Attribute) Reset() { @@ -2096,6 +2097,13 @@ func (x *Schema_Attribute) GetDeprecated() bool { return false } +func (x *Schema_Attribute) GetWriteOnly() bool { + if x != nil { + return x.WriteOnly + } + return false +} + type Schema_NestedBlock struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5143,7 +5151,7 @@ var file_tfplugin6_proto_rawDesc = []byte{ 0x61, 0x70, 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, 0x22, 0x95, 0x0a, 0x0a, 0x06, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x18, + 0x02, 0x38, 0x01, 0x22, 0xb4, 0x0a, 0x0a, 0x06, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, @@ -5166,7 +5174,7 @@ var file_tfplugin6_proto_rawDesc = []byte{ 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x1a, 0xe4, 0x02, 0x0a, + 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x1a, 0x83, 0x03, 0x0a, 0x09, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x74, 0x79, @@ -5189,269 +5197,247 @@ var file_tfplugin6_proto_rawDesc = []byte{ 0x6e, 0x64, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, - 0x74, 0x65, 0x64, 0x1a, 0xa7, 0x02, 0x0a, 0x0b, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x2d, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, - 0x43, 0x0a, 0x07, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x29, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x74, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, + 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, + 0x6c, 0x79, 0x1a, 0xa7, 0x02, 0x0a, 0x0b, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x2d, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x43, + 0x0a, 0x07, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x29, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x4e, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x07, 0x6e, 0x65, 0x73, 0x74, + 0x69, 0x6e, 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, + 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x4d, 0x0a, + 0x0b, 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, + 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x49, 0x4e, + 0x47, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x02, 0x12, + 0x07, 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x41, 0x50, 0x10, + 0x04, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x05, 0x1a, 0x8b, 0x02, 0x0a, + 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x3b, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x66, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x07, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x36, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x07, 0x6e, 0x65, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x69, 0x74, 0x65, 0x6d, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, - 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x4d, - 0x0a, 0x0b, 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, - 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x49, - 0x4e, 0x47, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x02, - 0x12, 0x07, 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x41, 0x50, - 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x05, 0x1a, 0x8b, 0x02, - 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x3b, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, - 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x07, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x36, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x07, 0x6e, 0x65, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x1f, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x69, 0x74, 0x65, - 0x6d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x6d, 0x69, - 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x1f, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x74, - 0x65, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x6d, - 0x61, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x42, 0x0a, 0x0b, 0x4e, 0x65, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x10, 0x01, 0x12, - 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x45, 0x54, - 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x41, 0x50, 0x10, 0x04, 0x22, 0x8e, 0x05, 0x0a, 0x08, - 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, - 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x0a, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x4c, 0x0a, 0x12, 0x76, 0x61, 0x72, 0x69, 0x61, - 0x64, 0x69, 0x63, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, - 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x52, 0x11, 0x76, 0x61, 0x72, 0x69, 0x61, 0x64, 0x69, 0x63, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x36, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, - 0x61, 0x72, 0x79, 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, 0x40, 0x0a, 0x10, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x2f, 0x0a, 0x13, 0x64, 0x65, 0x70, 0x72, 0x65, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0xf3, 0x01, 0x0a, 0x09, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x28, - 0x0a, 0x10, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4e, - 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x5f, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x55, 0x6e, 0x6b, - 0x6e, 0x6f, 0x77, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 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, 0x40, 0x0a, 0x10, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x69, 0x6e, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x36, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0f, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x1a, 0x1c, - 0x0a, 0x06, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xa8, 0x01, 0x0a, - 0x12, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, - 0x69, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x64, 0x65, 0x73, 0x74, - 0x72, 0x6f, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x6c, 0x61, 0x6e, 0x44, - 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x12, 0x3f, 0x0a, 0x1c, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x67, 0x65, - 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x2e, 0x0a, 0x13, 0x6d, 0x6f, 0x76, 0x65, 0x5f, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3f, 0x0a, 0x12, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x29, 0x0a, - 0x10, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, - 0x6c, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x22, 0xa2, 0x01, 0x0a, 0x08, 0x44, 0x65, 0x66, - 0x65, 0x72, 0x72, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x36, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x62, 0x0a, 0x06, 0x52, 0x65, 0x61, - 0x73, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, - 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, - 0x46, 0x49, 0x47, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, 0x1b, 0x0a, - 0x17, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, - 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x41, 0x42, - 0x53, 0x45, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x45, 0x52, 0x45, 0x51, 0x10, 0x03, 0x22, 0xa3, 0x05, - 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x09, 0x0a, - 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0xca, 0x03, 0x0a, 0x08, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, - 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, - 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x4c, - 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, - 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, - 0x0b, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x09, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x27, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x47, 0x65, 0x74, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x36, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, - 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x59, 0x0a, 0x13, 0x65, 0x70, - 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x36, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x52, 0x12, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x1a, 0x30, 0x0a, 0x11, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, - 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, - 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, - 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x26, 0x0a, 0x10, 0x46, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x1a, - 0x31, 0x0a, 0x12, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x12, 0x1f, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x6d, 0x69, 0x6e, + 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x1f, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x6d, 0x61, + 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x42, 0x0a, 0x0b, 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, + 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x08, + 0x0a, 0x04, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, + 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x41, 0x50, 0x10, 0x04, 0x22, 0x8e, 0x05, 0x0a, 0x08, 0x46, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x4c, 0x0a, 0x12, 0x76, 0x61, 0x72, 0x69, 0x61, 0x64, + 0x69, 0x63, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x46, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x52, 0x11, 0x76, 0x61, 0x72, 0x69, 0x61, 0x64, 0x69, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, + 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 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, 0x40, 0x0a, 0x10, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, + 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x2f, 0x0a, 0x13, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x12, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0xf3, 0x01, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, + 0x10, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4e, 0x75, + 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x5f, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x55, 0x6e, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 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, 0x40, 0x0a, 0x10, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x36, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0f, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x1a, 0x1c, 0x0a, + 0x06, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xa8, 0x01, 0x0a, 0x12, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x72, + 0x6f, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x6c, 0x61, 0x6e, 0x44, 0x65, + 0x73, 0x74, 0x72, 0x6f, 0x79, 0x12, 0x3f, 0x0a, 0x1c, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x67, 0x65, 0x74, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x2e, 0x0a, 0x13, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x11, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3f, 0x0a, 0x12, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, + 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, + 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x22, 0xa2, 0x01, 0x0a, 0x08, 0x44, 0x65, 0x66, 0x65, + 0x72, 0x72, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, + 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x62, 0x0a, 0x06, 0x52, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, + 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, + 0x49, 0x47, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, + 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, + 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x41, 0x42, 0x53, + 0x45, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x45, 0x52, 0x45, 0x51, 0x10, 0x03, 0x22, 0xa3, 0x05, 0x0a, + 0x0b, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x09, 0x0a, 0x07, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0xca, 0x03, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x63, + 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, + 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, + 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x4c, 0x0a, + 0x0c, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, + 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0b, + 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x09, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, + 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x12, 0x45, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x36, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x09, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x59, 0x0a, 0x13, 0x65, 0x70, 0x68, + 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x36, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, + 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x52, 0x12, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x1a, 0x30, 0x0a, 0x11, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, + 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, + 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x26, 0x0a, 0x10, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x1a, 0x31, + 0x0a, 0x12, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x1a, 0x2f, 0x0a, 0x10, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x1a, 0x2f, 0x0a, 0x10, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0xab, 0x08, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x1a, 0x09, 0x0a, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x8a, 0x08, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x2d, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x12, 0x65, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x66, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x6c, 0x0a, 0x13, 0x64, 0x61, 0x74, 0x61, 0x5f, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, - 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x11, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x52, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x1a, 0x65, 0x70, - 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, - 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x18, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x37, 0x0a, - 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, - 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, - 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x36, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x4e, - 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, - 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x55, - 0x0a, 0x14, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 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, 0x27, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x36, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x57, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 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, 0x27, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x51, - 0x0a, 0x0e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 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, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x46, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x5e, 0x0a, 0x1d, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, + 0x6d, 0x65, 0x22, 0xab, 0x08, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x1a, 0x09, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x8a, 0x08, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x2d, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, + 0x65, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x66, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x6c, 0x0a, 0x13, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, + 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x11, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x12, 0x52, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x36, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x1a, 0x65, 0x70, 0x68, + 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, + 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 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, 0x27, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x99, 0x01, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x3a, 0x0a, 0x07, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x43, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, - 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, - 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x90, 0x02, - 0x0a, 0x14, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, 0x72, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x09, 0x72, 0x61, 0x77, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x52, 0x61, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x08, 0x72, 0x61, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, 0x83, 0x01, 0x0a, 0x08, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0e, 0x75, 0x70, 0x67, 0x72, 0x61, - 0x64, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, - 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, - 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, - 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, - 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, - 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, - 0x22, 0xb6, 0x01, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x57, 0x0a, 0x07, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, - 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x43, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x36, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, - 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xba, 0x01, 0x0a, 0x1a, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x57, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, - 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x1a, 0x43, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, - 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, - 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, - 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xbf, 0x01, 0x0a, 0x1f, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, + 0x72, 0x79, 0x52, 0x18, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x37, 0x0a, 0x0b, + 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x69, + 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, + 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x36, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, + 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, + 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x4e, 0x0a, + 0x13, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x55, 0x0a, + 0x14, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 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, 0x27, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x36, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x57, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 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, 0x27, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x51, 0x0a, + 0x0e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 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, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x46, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x5e, 0x0a, 0x1d, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 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, 0x27, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x99, 0x01, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x3a, 0x0a, 0x07, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x43, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, + 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, + 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x90, 0x02, 0x0a, + 0x14, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, 0x72, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x09, 0x72, 0x61, 0x77, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x52, 0x61, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x08, 0x72, 0x61, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, 0x83, 0x01, 0x0a, 0x08, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0e, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, + 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, + 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, + 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, + 0xb6, 0x01, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x57, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, @@ -5462,447 +5448,471 @@ var file_tfplugin6_proto_rawDesc = []byte{ 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, - 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x92, 0x02, 0x0a, 0x11, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x1a, 0xb7, - 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4e, 0x0a, 0x13, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x36, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x69, 0x65, 0x73, 0x52, 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, - 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x43, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, - 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, - 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xe4, 0x03, - 0x0a, 0x0c, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x8c, - 0x02, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, - 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, - 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, - 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, - 0x3c, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x61, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xba, 0x01, 0x0a, 0x1a, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x57, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, + 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x1a, 0x43, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, + 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x69, + 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, + 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xbf, 0x01, 0x0a, 0x1f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x57, 0x0a, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, + 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x1a, 0x43, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, + 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, + 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, + 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x92, 0x02, 0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x1a, 0xb7, 0x01, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x4e, 0x0a, - 0x13, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0xc4, 0x01, - 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x09, 0x6e, 0x65, - 0x77, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4e, 0x0a, 0x13, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, + 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x43, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, + 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, + 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xe4, 0x03, 0x0a, + 0x0c, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x8c, 0x02, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, + 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, - 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x36, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, - 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, - 0x76, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x36, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x08, 0x64, 0x65, 0x66, 0x65, - 0x72, 0x72, 0x65, 0x64, 0x22, 0xf3, 0x05, 0x0a, 0x12, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x1a, 0x8b, 0x03, 0x0a, 0x07, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x45, - 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x4e, 0x65, 0x77, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x3c, + 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x5f, - 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x70, - 0x72, 0x69, 0x6f, 0x72, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, - 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x4e, 0x0a, 0x13, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x36, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0xce, 0x02, 0x0a, 0x08, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, - 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, - 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x10, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, - 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x6c, 0x61, - 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x50, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, - 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x6c, - 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, - 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x54, - 0x79, 0x70, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x2f, 0x0a, 0x08, 0x64, 0x65, 0x66, - 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, - 0x52, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x22, 0x92, 0x04, 0x0a, 0x13, 0x41, - 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x1a, 0xb6, 0x02, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x70, - 0x72, 0x69, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, - 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6f, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, + 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x4e, 0x0a, 0x13, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0xc4, 0x01, 0x0a, + 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x09, 0x6e, 0x65, 0x77, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, - 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, - 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, - 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, - 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x06, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, + 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, + 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, + 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, + 0x72, 0x65, 0x64, 0x22, 0xf3, 0x05, 0x0a, 0x12, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x1a, 0x8b, 0x03, 0x0a, 0x07, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x45, 0x0a, + 0x12, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x4e, 0x65, 0x77, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, - 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0xc1, 0x01, 0x0a, 0x08, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, + 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x5f, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x70, 0x72, + 0x69, 0x6f, 0x72, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, + 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x4e, 0x0a, 0x13, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x36, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0xce, 0x02, 0x0a, 0x08, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, + 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x10, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x5f, + 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x6c, 0x61, 0x6e, + 0x6e, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0e, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x36, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, + 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x6c, 0x65, + 0x67, 0x61, 0x63, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x54, 0x79, + 0x70, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x2f, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x65, + 0x72, 0x72, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, + 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x22, 0x92, 0x04, 0x0a, 0x13, 0x41, 0x70, + 0x70, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x1a, 0xb6, 0x02, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x70, 0x72, + 0x69, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, + 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, - 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, - 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, - 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6c, - 0x65, 0x67, 0x61, 0x63, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x22, - 0xef, 0x03, 0x0a, 0x13, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, 0x86, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x4e, 0x0a, 0x13, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x12, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, - 0x1a, 0x78, 0x0a, 0x10, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, - 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x1a, 0xd4, 0x01, 0x0a, 0x08, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x12, 0x69, 0x6d, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, - 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x52, 0x11, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, - 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, + 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x6c, + 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x0d, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, + 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0xc1, 0x01, 0x0a, 0x08, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, + 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, - 0x12, 0x2f, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, - 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, - 0x64, 0x22, 0xe7, 0x03, 0x0a, 0x11, 0x4d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, 0xa8, 0x02, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x17, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x0c, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x52, 0x61, 0x77, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x1a, 0xa6, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3a, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, - 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x69, 0x61, - 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, - 0x74, 0x69, 0x63, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x22, 0x9e, 0x03, 0x0a, 0x0e, - 0x52, 0x65, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0xe5, - 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, - 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, - 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3c, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, - 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x4e, 0x0a, 0x13, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, - 0x65, 0x73, 0x52, 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0xa3, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, - 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, - 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2f, 0x0a, 0x08, 0x64, - 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, - 0x65, 0x64, 0x52, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x22, 0xdd, 0x03, 0x0a, - 0x15, 0x4f, 0x70, 0x65, 0x6e, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0xa7, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x12, 0x2c, 0x0a, 0x12, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, + 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6c, 0x65, + 0x67, 0x61, 0x63, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x22, 0xef, + 0x03, 0x0a, 0x13, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, 0x86, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x4e, 0x0a, 0x13, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, + 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, + 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x12, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, + 0x78, 0x0a, 0x10, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x2d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, - 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x4e, 0x0a, 0x13, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x12, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, - 0x1a, 0x99, 0x02, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, + 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x1a, 0xd4, 0x01, 0x0a, 0x08, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x12, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x49, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x11, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, + 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, + 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, + 0x2f, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x65, + 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, + 0x22, 0xe7, 0x03, 0x0a, 0x11, 0x4d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, 0xa8, 0x02, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x36, 0x0a, 0x17, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x15, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x13, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x52, 0x61, 0x77, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x28, 0x0a, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x1a, 0xa6, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, + 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, + 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, + 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x69, 0x61, 0x67, + 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x22, 0x9e, 0x03, 0x0a, 0x0e, 0x52, + 0x65, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0xe5, 0x01, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, + 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3c, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, + 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x4e, 0x0a, 0x13, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, + 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0xa3, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, + 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x36, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, + 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2f, 0x0a, 0x08, 0x64, 0x65, + 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, + 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, + 0x64, 0x52, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x22, 0xdd, 0x03, 0x0a, 0x15, + 0x4f, 0x70, 0x65, 0x6e, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0xa7, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, + 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, + 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x4e, 0x0a, 0x13, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, + 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, + 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x12, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, + 0x99, 0x02, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, + 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x69, + 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, + 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x3a, 0x0a, 0x08, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x5f, 0x61, + 0x74, 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, 0x07, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x41, 0x74, 0x88, 0x01, + 0x01, 0x12, 0x2f, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, + 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x1d, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0c, 0x48, 0x01, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x2f, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, + 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, + 0x65, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x74, 0x42, + 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x22, 0xa5, 0x02, 0x0a, 0x16, + 0x52, 0x65, 0x6e, 0x65, 0x77, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x51, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, + 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, + 0x00, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, + 0x08, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x1a, 0xb7, 0x01, 0x0a, 0x08, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, + 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, + 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, + 0x3a, 0x0a, 0x08, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x74, 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, + 0x07, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x41, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x01, 0x52, 0x07, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, + 0x65, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x74, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x22, 0xb0, 0x01, 0x0a, 0x16, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x45, 0x70, 0x68, + 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x51, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, + 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x1a, 0x43, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, - 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x3a, 0x0a, 0x08, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x5f, - 0x61, 0x74, 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, 0x07, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x41, 0x74, 0x88, - 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, - 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x12, 0x1d, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0c, 0x48, 0x01, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x88, - 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, - 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, - 0x72, 0x65, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x74, - 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x22, 0xa5, 0x02, 0x0a, - 0x16, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x51, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1d, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x48, 0x00, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0a, - 0x0a, 0x08, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x1a, 0xb7, 0x01, 0x0a, 0x08, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, - 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, - 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, - 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, - 0x12, 0x3a, 0x0a, 0x08, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x74, 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, 0x07, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x41, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, - 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x01, 0x52, - 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, - 0x72, 0x65, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x74, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x72, 0x69, - 0x76, 0x61, 0x74, 0x65, 0x22, 0xb0, 0x01, 0x0a, 0x16, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x45, 0x70, - 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, - 0x51, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, - 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, - 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x1a, 0x43, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, - 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, + 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x81, 0x02, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0xe5, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x4d, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x47, + 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, + 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, - 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x81, 0x02, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0xe5, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x4d, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, - 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, - 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, - 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x1a, 0x51, 0x0a, 0x0e, 0x46, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 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, 0x29, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, 0x0c, - 0x43, 0x61, 0x6c, 0x6c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x54, 0x0a, 0x07, - 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, 0x35, 0x0a, 0x09, 0x61, - 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, - 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x1a, 0x6b, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, - 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, - 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, - 0x2e, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2a, - 0x25, 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x09, 0x0a, - 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x4d, 0x41, 0x52, 0x4b, - 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x32, 0x81, 0x10, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x1e, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x47, - 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x47, - 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x24, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, - 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, + 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x1a, 0x51, 0x0a, 0x0e, 0x46, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 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, 0x29, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x66, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, 0x0c, 0x43, + 0x61, 0x6c, 0x6c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x54, 0x0a, 0x07, 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, 0x35, 0x0a, 0x09, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, + 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x1a, 0x6b, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, + 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, + 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2e, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2a, 0x25, + 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x09, 0x0a, 0x05, + 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x4d, 0x41, 0x52, 0x4b, 0x44, + 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x32, 0x81, 0x10, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x1e, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x47, 0x65, + 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x47, 0x65, + 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x60, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x24, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x36, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, + 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x29, + 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x66, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x29, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x66, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x29, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x66, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7b, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x36, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7b, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2d, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x69, 0x0a, 0x14, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x27, 0x2e, 0x74, - 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x36, 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x60, 0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x12, 0x24, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, - 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x66, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x1f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x52, 0x65, - 0x61, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x52, - 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x12, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x25, 0x2e, 0x74, 0x66, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x50, 0x6c, - 0x61, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, 0x13, 0x41, 0x70, 0x70, - 0x6c, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x12, 0x26, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x41, 0x70, 0x70, - 0x6c, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x66, 0x0a, 0x13, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x27, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x49, 0x6d, 0x70, - 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x11, 0x4d, 0x6f, 0x76, - 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x24, - 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x52, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x69, 0x0a, 0x14, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x27, 0x2e, 0x74, 0x66, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, - 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, 0x0e, 0x52, - 0x65, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x21, 0x2e, - 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x44, 0x61, - 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x22, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x52, 0x65, 0x61, - 0x64, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x1f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x45, 0x70, 0x68, - 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x74, - 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x6c, 0x0a, 0x15, 0x4f, 0x70, 0x65, 0x6e, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, - 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x28, 0x2e, 0x74, 0x66, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x45, 0x70, 0x68, 0x65, 0x6d, - 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, - 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, + 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, + 0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x12, 0x24, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x66, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x51, 0x0a, 0x0c, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x12, 0x1f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x52, 0x65, 0x61, + 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x20, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x52, 0x65, + 0x61, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x12, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x25, 0x2e, 0x74, 0x66, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x50, 0x6c, 0x61, + 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, 0x13, 0x41, 0x70, 0x70, 0x6c, + 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, + 0x26, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x41, 0x70, 0x70, 0x6c, + 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x36, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x66, 0x0a, 0x13, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x36, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x27, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x49, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x11, 0x4d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x24, 0x2e, + 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, + 0x4d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, 0x0e, 0x52, 0x65, + 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x21, 0x2e, 0x74, + 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x44, 0x61, 0x74, + 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x52, 0x65, 0x61, 0x64, + 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x1f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x36, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x45, 0x70, 0x68, 0x65, + 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x74, 0x66, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x6c, 0x0a, 0x15, 0x4f, 0x70, 0x65, 0x6e, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, + 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x28, 0x2e, 0x74, 0x66, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, + 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, + 0x4f, 0x70, 0x65, 0x6e, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, + 0x0a, 0x16, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, + 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, + 0x52, 0x65, 0x6e, 0x65, 0x77, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x6f, 0x0a, 0x16, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, + 0x6f, 0x0a, 0x16, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x74, 0x66, 0x70, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x45, 0x70, 0x68, 0x65, 0x6d, + 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, - 0x2e, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, + 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x6f, 0x0a, 0x16, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, - 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x74, 0x66, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x45, 0x70, 0x68, 0x65, - 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x36, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x1f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x47, 0x65, - 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x47, - 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x43, 0x61, 0x6c, 0x6c, 0x46, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, + 0x12, 0x51, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x1f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x47, 0x65, 0x74, + 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x20, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x47, 0x65, + 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x43, 0x61, 0x6c, 0x6c, 0x46, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, + 0x43, 0x61, 0x6c, 0x6c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x36, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x53, 0x74, 0x6f, 0x70, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x53, 0x74, 0x6f, 0x70, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x36, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x36, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2f, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2f, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x66, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x36, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/internal/tfplugin6/tfplugin6.proto b/internal/tfplugin6/tfplugin6.proto index 891939767e79..e0a23e43b077 120000 --- a/internal/tfplugin6/tfplugin6.proto +++ b/internal/tfplugin6/tfplugin6.proto @@ -1 +1 @@ -../../docs/plugin-protocol/tfplugin6.7.proto \ No newline at end of file +../../docs/plugin-protocol/tfplugin6.8.proto \ No newline at end of file From 6f58dbe75c33cf947e0421c61a1f4cd0bea10e15 Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Tue, 12 Nov 2024 14:06:16 +0100 Subject: [PATCH 35/50] write-only attributes: emit structural data on schema rendering --- internal/command/jsonprovider/attribute.go | 2 ++ internal/command/jsonprovider/attribute_test.go | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/internal/command/jsonprovider/attribute.go b/internal/command/jsonprovider/attribute.go index f444efec0dc2..3058feb0c263 100644 --- a/internal/command/jsonprovider/attribute.go +++ b/internal/command/jsonprovider/attribute.go @@ -20,6 +20,7 @@ type Attribute struct { Optional bool `json:"optional,omitempty"` Computed bool `json:"computed,omitempty"` Sensitive bool `json:"sensitive,omitempty"` + WriteOnly bool `json:"write_only,omitempty"` } type NestedType struct { @@ -45,6 +46,7 @@ func marshalAttribute(attr *configschema.Attribute) *Attribute { Computed: attr.Computed, Sensitive: attr.Sensitive, Deprecated: attr.Deprecated, + WriteOnly: attr.WriteOnly, } // we're not concerned about errors because at this point the schema has diff --git a/internal/command/jsonprovider/attribute_test.go b/internal/command/jsonprovider/attribute_test.go index d8c07929a9e9..4bee578f6689 100644 --- a/internal/command/jsonprovider/attribute_test.go +++ b/internal/command/jsonprovider/attribute_test.go @@ -28,11 +28,12 @@ func TestMarshalAttribute(t *testing.T) { }, }, { // collection types look a little odd. - &configschema.Attribute{Type: cty.Map(cty.String), Optional: true, Computed: true}, + &configschema.Attribute{Type: cty.Map(cty.String), Optional: true, Computed: true, WriteOnly: true}, &Attribute{ AttributeType: json.RawMessage(`["map","string"]`), Optional: true, Computed: true, + WriteOnly: true, DescriptionKind: "plain", }, }, From b358e333ee32de5eb5fd87088c73117f427106ed Mon Sep 17 00:00:00 2001 From: Bruno Schaatsbergen Date: Tue, 12 Nov 2024 18:36:43 -0700 Subject: [PATCH 36/50] refactor: make methods private --- internal/command/views/cloud.go | 29 +++++++++++++----------- internal/command/views/cloud_test.go | 34 ++++++++++++---------------- 2 files changed, 30 insertions(+), 33 deletions(-) diff --git a/internal/command/views/cloud.go b/internal/command/views/cloud.go index 057e9fa6c1ea..73d68884f525 100644 --- a/internal/command/views/cloud.go +++ b/internal/command/views/cloud.go @@ -18,8 +18,6 @@ import ( type Cloud interface { RetryLog(attemptNum int, resp *http.Response) Diagnostics(diags tfdiags.Diagnostics) - Output(messageCode CloudMessageCode, params ...any) - PrepareMessage(messageCode CloudMessageCode, params ...any) string } // NewCloud returns Cloud implementation for the given ViewType. @@ -57,19 +55,19 @@ func (v *CloudHuman) RetryLog(attemptNum int, resp *http.Response) { // retryLogMessage returns an empty string for the first attempt or for rate-limited responses (HTTP 429) if msg != "" { if elapsed != nil { - v.Output(msg, elapsed) // subsequent retry message + v.output(msg, elapsed) // subsequent retry message } else { - v.Output(msg) // initial retry message + v.output(msg) // initial retry message v.view.streams.Println() // ensures a newline between messages } } } -func (v *CloudHuman) Output(messageCode CloudMessageCode, params ...any) { - v.view.streams.Println(v.PrepareMessage(messageCode, params...)) +func (v *CloudHuman) output(messageCode CloudMessageCode, params ...any) { + v.view.streams.Println(v.prepareMessage(messageCode, params...)) } -func (v *CloudHuman) PrepareMessage(messageCode CloudMessageCode, params ...any) string { +func (v *CloudHuman) prepareMessage(messageCode CloudMessageCode, params ...any) string { message, ok := CloudMessageRegistry[messageCode] if !ok { // display the message code as fallback if not found in the message registry @@ -81,7 +79,12 @@ func (v *CloudHuman) PrepareMessage(messageCode CloudMessageCode, params ...any) return message.HumanValue } - return v.view.colorize.Color(strings.TrimSpace(fmt.Sprintf(message.HumanValue, params...))) + output := strings.TrimSpace(fmt.Sprintf(message.HumanValue, params...)) + if v.view.colorize != nil { + return v.view.colorize.Color(output) + } + + return output } // The CloudJSON implementation renders streaming JSON logs, suitable for @@ -103,16 +106,16 @@ func (v *CloudJSON) RetryLog(attemptNum int, resp *http.Response) { // retryLogMessage returns an empty string for the first attempt or for rate-limited responses (HTTP 429) if msg != "" { if elapsed != nil { - v.Output(msg, elapsed) // subsequent retry message + v.output(msg, elapsed) // subsequent retry message } else { - v.Output(msg) // initial retry message + v.output(msg) // initial retry message } } } -func (v *CloudJSON) Output(messageCode CloudMessageCode, params ...any) { +func (v *CloudJSON) output(messageCode CloudMessageCode, params ...any) { // don't add empty messages to json output - preppedMessage := v.PrepareMessage(messageCode, params...) + preppedMessage := v.prepareMessage(messageCode, params...) if preppedMessage == "" { return } @@ -131,7 +134,7 @@ func (v *CloudJSON) Output(messageCode CloudMessageCode, params ...any) { v.view.view.streams.Println(string(cloud_output)) } -func (v *CloudJSON) PrepareMessage(messageCode CloudMessageCode, params ...any) string { +func (v *CloudJSON) prepareMessage(messageCode CloudMessageCode, params ...any) string { message, ok := CloudMessageRegistry[messageCode] if !ok { // display the message code as fallback if not found in the message registry diff --git a/internal/command/views/cloud_test.go b/internal/command/views/cloud_test.go index 3eb44d3cfdb5..28a8a15dbee6 100644 --- a/internal/command/views/cloud_test.go +++ b/internal/command/views/cloud_test.go @@ -102,12 +102,11 @@ func TestNewCloud_humanViewOutput(t *testing.T) { t.Run("no param", func(t *testing.T) { streams, done := terminal.StreamsForTesting(t) - newCloud := NewCloud(arguments.ViewHuman, NewView(streams).SetRunningInAutomation(true)) - if _, ok := newCloud.(*CloudHuman); !ok { - t.Fatalf("unexpected return type %t", newCloud) + human := CloudHuman{ + view: NewView(streams).SetRunningInAutomation(true), } - newCloud.Output(InitialRetryErrorMessage) + human.output(InitialRetryErrorMessage) actual := done(t).All() expected := "There was an error connecting to HCP Terraform. Please do not exit\nTerraform to prevent data loss! Trying to restore the connection..." @@ -119,13 +118,12 @@ func TestNewCloud_humanViewOutput(t *testing.T) { t.Run("single param", func(t *testing.T) { streams, done := terminal.StreamsForTesting(t) - newCloud := NewCloud(arguments.ViewHuman, NewView(streams).SetRunningInAutomation(true)) - if _, ok := newCloud.(*CloudHuman); !ok { - t.Fatalf("unexpected return type %t", newCloud) + duration := 5 * time.Second + human := CloudHuman{ + view: NewView(streams).SetRunningInAutomation(true), } - duration := 5 * time.Second - newCloud.Output(RepeatedRetryErrorMessage, duration) + human.output(RepeatedRetryErrorMessage, duration) actual := done(t).All() expected := fmt.Sprintf("Still trying to restore the connection... (%s elapsed)", duration) @@ -277,12 +275,10 @@ func TestNewCloud_jsonViewOutput(t *testing.T) { t.Run("no param", func(t *testing.T) { streams, done := terminal.StreamsForTesting(t) - newCloud := NewCloud(arguments.ViewJSON, NewView(streams).SetRunningInAutomation(true)) - if _, ok := newCloud.(*CloudJSON); !ok { - t.Fatalf("unexpected return type %t", newCloud) + json := CloudJSON{ + view: NewJSONView(NewView(streams).SetRunningInAutomation(true)), } - - newCloud.Output(InitialRetryErrorMessage) + json.output(InitialRetryErrorMessage) version := tfversion.String() want := []map[string]interface{}{ @@ -310,13 +306,11 @@ func TestNewCloud_jsonViewOutput(t *testing.T) { t.Run("single param", func(t *testing.T) { streams, done := terminal.StreamsForTesting(t) - newCloud := NewCloud(arguments.ViewJSON, NewView(streams).SetRunningInAutomation(true)) - if _, ok := newCloud.(*CloudJSON); !ok { - t.Fatalf("unexpected return type %t", newCloud) - } - duration := 5 * time.Second - newCloud.Output(RepeatedRetryErrorMessage, duration) + json := CloudJSON{ + view: NewJSONView(NewView(streams).SetRunningInAutomation(true)), + } + json.output(RepeatedRetryErrorMessage, duration) version := tfversion.String() want := []map[string]interface{}{ From 6b0ba4d20d2ec0ff5f79fe3b9ab65665369d77c9 Mon Sep 17 00:00:00 2001 From: Bruno Schaatsbergen Date: Tue, 12 Nov 2024 18:46:53 -0700 Subject: [PATCH 37/50] refactor: gracefully handle marshalling error with empty output --- internal/command/views/cloud.go | 6 +++++- internal/command/views/cloud_test.go | 2 -- internal/command/views/init.go | 6 +++++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/internal/command/views/cloud.go b/internal/command/views/cloud.go index 73d68884f525..e11eaab1c0b2 100644 --- a/internal/command/views/cloud.go +++ b/internal/command/views/cloud.go @@ -130,7 +130,11 @@ func (v *CloudJSON) output(messageCode CloudMessageCode, params ...any) { "message_code": string(messageCode), } - cloud_output, _ := json.Marshal(json_data) + cloud_output, err := json.Marshal(json_data) + if err != nil { + // Handle marshalling error with empty output + cloud_output = []byte{} + } v.view.view.streams.Println(string(cloud_output)) } diff --git a/internal/command/views/cloud_test.go b/internal/command/views/cloud_test.go index 28a8a15dbee6..17b5ffdbfdfa 100644 --- a/internal/command/views/cloud_test.go +++ b/internal/command/views/cloud_test.go @@ -105,7 +105,6 @@ func TestNewCloud_humanViewOutput(t *testing.T) { human := CloudHuman{ view: NewView(streams).SetRunningInAutomation(true), } - human.output(InitialRetryErrorMessage) actual := done(t).All() @@ -122,7 +121,6 @@ func TestNewCloud_humanViewOutput(t *testing.T) { human := CloudHuman{ view: NewView(streams).SetRunningInAutomation(true), } - human.output(RepeatedRetryErrorMessage, duration) actual := done(t).All() diff --git a/internal/command/views/init.go b/internal/command/views/init.go index 92868d11615f..b82c722225d4 100644 --- a/internal/command/views/init.go +++ b/internal/command/views/init.go @@ -107,7 +107,11 @@ func (v *InitJSON) Output(messageCode InitMessageCode, params ...any) { "message_code": string(messageCode), } - init_output, _ := json.Marshal(json_data) + init_output, err := json.Marshal(json_data) + if err != nil { + // Handle marshalling error with empty output + init_output = []byte{} + } v.view.view.streams.Println(string(init_output)) } From f57c3c768abd6cb06a6048fce7b23c56b8f9a85b Mon Sep 17 00:00:00 2001 From: Radek Simko Date: Wed, 13 Nov 2024 09:33:37 +0000 Subject: [PATCH 38/50] docs: Add notes about debugging (#35714) --- docs/debugging.md | 33 +++++++++++++++++++++++++++++++ docs/images/vscode-debugging.png | Bin 0 -> 391938 bytes 2 files changed, 33 insertions(+) create mode 100644 docs/debugging.md create mode 100644 docs/images/vscode-debugging.png diff --git a/docs/debugging.md b/docs/debugging.md new file mode 100644 index 000000000000..bab763067322 --- /dev/null +++ b/docs/debugging.md @@ -0,0 +1,33 @@ +# How to Debug Terraform + +As Terraform is written in Go you may use [delve](https://github.com/go-delve/delve) to debug it. + +## 1. Compile & Start Debug Server + +One way to do it is to compile a binary with the [appropriate compiler flags](https://pkg.go.dev/cmd/compile#hdr-Command_Line): + +```sh +go install -gcflags="all=-N -l" +``` + +This enables you to then execute the compiled binary via delve, pass any arguments as spin up a debug server which you can then connect to: + +```sh +dlv exec $GOBIN/terraform --headless --listen :2345 --log -- apply +``` + +## 2a. Connect via CLI + +You may connect to the headless debug server via delve CLI + +```sh +dlv connect :2345 +``` + +## 2b. Connect from VS Code + +The repository provides a launch configuration, making it possible to use VS Code's native debugging integration: + +![vscode debugger](./images/vscode-debugging.png) + +Note that this debugging workflow is different from the test-based one, which itself shouldn't require any of the above steps above nor the mentioned launch configuration. Meaning, that if you already have a test that hits the right lines of code you want to be debugging, or you can write one, then that may be an easier workflow. diff --git a/docs/images/vscode-debugging.png b/docs/images/vscode-debugging.png new file mode 100644 index 0000000000000000000000000000000000000000..c8e6f27f7153d015ce9c40f4a625068dcb893cf0 GIT binary patch literal 391938 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%0DftgQ1Rnf(d``7+H~5U09`z=k_)u>Q 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

M`37L+LneW-M(wWBWH-E;zMW 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

9^>%y4R3pA&A_8W#WD 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

Date: Wed, 13 Nov 2024 20:05:17 +0800 Subject: [PATCH 39/50] Add new auth for tencentcloud cos backend (#35888) * add new auth for tencentcloud cos backend * add new auth for tencentcloud cos backend * add --- internal/backend/remote-state/cos/backend.go | 285 ++++++++++++++++++- internal/backend/remote-state/cos/go.mod | 1 + website/docs/language/backend/cos.mdx | 102 ++++++- 3 files changed, 375 insertions(+), 13 deletions(-) diff --git a/internal/backend/remote-state/cos/backend.go b/internal/backend/remote-state/cos/backend.go index 5e4716dbe5c9..fe5fab41b899 100644 --- a/internal/backend/remote-state/cos/backend.go +++ b/internal/backend/remote-state/cos/backend.go @@ -5,18 +5,23 @@ package cos import ( "context" + "encoding/json" "fmt" + "io" + "io/ioutil" "log" "net/http" "net/url" "os" "regexp" + "runtime" "strconv" "strings" "time" "github.com/hashicorp/terraform/internal/backend" "github.com/hashicorp/terraform/internal/legacy/helper/schema" + "github.com/mitchellh/go-homedir" "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile" sts "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sts/v20180813" @@ -35,6 +40,14 @@ const ( PROVIDER_ASSUME_ROLE_ARN = "TENCENTCLOUD_ASSUME_ROLE_ARN" PROVIDER_ASSUME_ROLE_SESSION_NAME = "TENCENTCLOUD_ASSUME_ROLE_SESSION_NAME" PROVIDER_ASSUME_ROLE_SESSION_DURATION = "TENCENTCLOUD_ASSUME_ROLE_SESSION_DURATION" + PROVIDER_ASSUME_ROLE_EXTERNAL_ID = "TENCENTCLOUD_ASSUME_ROLE_EXTERNAL_ID" + PROVIDER_SHARED_CREDENTIALS_DIR = "TENCENTCLOUD_SHARED_CREDENTIALS_DIR" + PROVIDER_PROFILE = "TENCENTCLOUD_PROFILE" + PROVIDER_CAM_ROLE_NAME = "TENCENTCLOUD_CAM_ROLE_NAME" +) + +const ( + DEFAULT_PROFILE = "default" ) // Backend implements "backend".Backend for tencentCloud cos @@ -56,6 +69,15 @@ type Backend struct { domain string } +type CAMResponse struct { + TmpSecretId string `json:"TmpSecretId"` + TmpSecretKey string `json:"TmpSecretKey"` + ExpiredTime int64 `json:"ExpiredTime"` + Expiration string `json:"Expiration"` + Token string `json:"Token"` + Code string `json:"Code"` +} + // New creates a new backend for TencentCloud cos remote state. func New() backend.Backend { s := &schema.Backend{ @@ -191,9 +213,33 @@ func New() backend.Backend { Optional: true, Description: "A more restrictive policy when making the AssumeRole call. Its content must not contains `principal` elements. Notice: more syntax references, please refer to: [policies syntax logic](https://intl.cloud.tencent.com/document/product/598/10603).", }, + "external_id": { + Type: schema.TypeString, + Optional: true, + DefaultFunc: schema.EnvDefaultFunc(PROVIDER_ASSUME_ROLE_EXTERNAL_ID, nil), + Description: "External role ID, which can be obtained by clicking the role name in the CAM console. It can contain 2-128 letters, digits, and symbols (=,.@:/-). Regex: [\\w+=,.@:/-]*. It can be sourced from the `TENCENTCLOUD_ASSUME_ROLE_EXTERNAL_ID`.", + }, }, }, }, + "shared_credentials_dir": { + Type: schema.TypeString, + Optional: true, + DefaultFunc: schema.EnvDefaultFunc(PROVIDER_SHARED_CREDENTIALS_DIR, nil), + Description: "The directory of the shared credentials. It can also be sourced from the `TENCENTCLOUD_SHARED_CREDENTIALS_DIR` environment variable. If not set this defaults to ~/.tccli.", + }, + "profile": { + Type: schema.TypeString, + Optional: true, + DefaultFunc: schema.EnvDefaultFunc(PROVIDER_PROFILE, nil), + Description: "The profile name as set in the shared credentials. It can also be sourced from the `TENCENTCLOUD_PROFILE` environment variable. If not set, the default profile created with `tccli configure` will be used.", + }, + "cam_role_name": { + Type: schema.TypeString, + Optional: true, + DefaultFunc: schema.EnvDefaultFunc(PROVIDER_CAM_ROLE_NAME, nil), + Description: "The name of the CVM instance CAM role. It can be sourced from the `TENCENTCLOUD_CAM_ROLE_NAME` environment variable.", + }, }, } @@ -275,9 +321,56 @@ func (b *Backend) configure(ctx context.Context) error { return err } - secretId := data.Get("secret_id").(string) - secretKey := data.Get("secret_key").(string) - securityToken := data.Get("security_token").(string) + var getProviderConfig = func(key string) string { + var str string + value, err := getConfigFromProfile(data, key) + if err == nil && value != nil { + str = value.(string) + } + + return str + } + + var ( + secretId string + secretKey string + securityToken string + ) + + // get auth from tf/env + if v, ok := data.GetOk("secret_id"); ok { + secretId = v.(string) + } + + if v, ok := data.GetOk("secret_key"); ok { + secretKey = v.(string) + } + + if v, ok := data.GetOk("security_token"); ok { + securityToken = v.(string) + } + + // get auth from tccli + if secretId == "" && secretKey == "" && securityToken == "" { + secretId = getProviderConfig("secretId") + secretKey = getProviderConfig("secretKey") + securityToken = getProviderConfig("token") + } + + // get auth from CAM role name + if v, ok := data.GetOk("cam_role_name"); ok { + camRoleName := v.(string) + if camRoleName != "" { + camResp, err := getAuthFromCAM(camRoleName) + if err != nil { + return err + } + + secretId = camResp.TmpSecretId + secretKey = camResp.TmpSecretKey + securityToken = camResp.Token + } + } // init credential by AKSK & TOKEN b.credential = common.NewTokenCredential(secretId, secretKey, securityToken) @@ -304,23 +397,70 @@ func (b *Backend) configure(ctx context.Context) error { } func handleAssumeRole(data *schema.ResourceData, b *Backend) error { + var ( + assumeRoleArn string + assumeRoleSessionName string + assumeRoleSessionDuration int + assumeRolePolicy string + assumeRoleExternalId string + ) + + // get assume role from credential + if providerConfig["role-arn"] != nil { + assumeRoleArn = providerConfig["role-arn"].(string) + } + + if providerConfig["role-session-name"] != nil { + assumeRoleSessionName = providerConfig["role-session-name"].(string) + } + + if assumeRoleArn != "" && assumeRoleSessionName != "" { + assumeRoleSessionDuration = 7200 + } + + // get assume role from env + envRoleArn := os.Getenv(PROVIDER_ASSUME_ROLE_ARN) + envSessionName := os.Getenv(PROVIDER_ASSUME_ROLE_SESSION_NAME) + if envRoleArn != "" && envSessionName != "" { + assumeRoleArn = envRoleArn + assumeRoleSessionName = envSessionName + if envSessionDuration := os.Getenv(PROVIDER_ASSUME_ROLE_SESSION_DURATION); envSessionDuration != "" { + var err error + assumeRoleSessionDuration, err = strconv.Atoi(envSessionDuration) + if err != nil { + return err + } + } + + if assumeRoleSessionDuration == 0 { + assumeRoleSessionDuration = 7200 + } + + assumeRoleExternalId = os.Getenv(PROVIDER_ASSUME_ROLE_EXTERNAL_ID) + } + + // get assume role from tf assumeRoleList := data.Get("assume_role").(*schema.Set).List() if len(assumeRoleList) == 1 { assumeRole := assumeRoleList[0].(map[string]interface{}) - assumeRoleArn := assumeRole["role_arn"].(string) - assumeRoleSessionName := assumeRole["session_name"].(string) - assumeRoleSessionDuration := assumeRole["session_duration"].(int) - assumeRolePolicy := assumeRole["policy"].(string) + assumeRoleArn = assumeRole["role_arn"].(string) + assumeRoleSessionName = assumeRole["session_name"].(string) + assumeRoleSessionDuration = assumeRole["session_duration"].(int) + assumeRolePolicy = assumeRole["policy"].(string) + assumeRoleExternalId = assumeRole["external_id"].(string) + } - err := b.updateCredentialWithSTS(assumeRoleArn, assumeRoleSessionName, assumeRoleSessionDuration, assumeRolePolicy) + if assumeRoleArn != "" && assumeRoleSessionName != "" { + err := b.updateCredentialWithSTS(assumeRoleArn, assumeRoleSessionName, assumeRoleSessionDuration, assumeRolePolicy, assumeRoleExternalId) if err != nil { return err } } + return nil } -func (b *Backend) updateCredentialWithSTS(assumeRoleArn, assumeRoleSessionName string, assumeRoleSessionDuration int, assumeRolePolicy string) error { +func (b *Backend) updateCredentialWithSTS(assumeRoleArn, assumeRoleSessionName string, assumeRoleSessionDuration int, assumeRolePolicy string, assumeRoleExternalId string) error { // assume role by STS request := sts.NewAssumeRoleRequest() request.RoleArn = &assumeRoleArn @@ -332,6 +472,10 @@ func (b *Backend) updateCredentialWithSTS(assumeRoleArn, assumeRoleSessionName s request.Policy = &policy } + if assumeRoleExternalId != "" { + request.ExternalId = &assumeRoleExternalId + } + response, err := b.UseStsClient().AssumeRole(request) if err != nil { return err @@ -382,3 +526,126 @@ func (b *Backend) NewClientProfile(timeout int) *profile.ClientProfile { return cpf } + +func getAuthFromCAM(roleName string) (camResp *CAMResponse, err error) { + url := fmt.Sprintf("http://metadata.tencentyun.com/latest/meta-data/cam/security-credentials/%s", roleName) + log.Printf("[CRITAL] Request CAM security credentials url: %s\n", url) + // maximum waiting time + client := &http.Client{Timeout: 2 * time.Second} + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return + } + + resp, err := client.Do(req) + if err != nil { + log.Printf("[CRITAL] Request CAM security credentials resp err: %s", err.Error()) + return + } + + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + log.Printf("[CRITAL] Request CAM security credentials body read err: %s", err.Error()) + return + } + + err = json.Unmarshal(body, &camResp) + if err != nil { + log.Printf("[CRITAL] Request CAM security credentials resp json err: %s", err.Error()) + return + } + + return +} + +var providerConfig map[string]interface{} + +func getConfigFromProfile(d *schema.ResourceData, ProfileKey string) (interface{}, error) { + if providerConfig == nil { + var ( + profile string + sharedCredentialsDir string + credentialPath string + configurePath string + ) + + if v, ok := d.GetOk("profile"); ok { + profile = v.(string) + } else { + profile = DEFAULT_PROFILE + } + + if v, ok := d.GetOk("shared_credentials_dir"); ok { + sharedCredentialsDir = v.(string) + } + + tmpSharedCredentialsDir, err := homedir.Expand(sharedCredentialsDir) + if err != nil { + return nil, err + } + + if tmpSharedCredentialsDir == "" { + credentialPath = fmt.Sprintf("%s/.tccli/%s.credential", os.Getenv("HOME"), profile) + configurePath = fmt.Sprintf("%s/.tccli/%s.configure", os.Getenv("HOME"), profile) + if runtime.GOOS == "windows" { + credentialPath = fmt.Sprintf("%s/.tccli/%s.credential", os.Getenv("USERPROFILE"), profile) + configurePath = fmt.Sprintf("%s/.tccli/%s.configure", os.Getenv("USERPROFILE"), profile) + } + } else { + credentialPath = fmt.Sprintf("%s/%s.credential", tmpSharedCredentialsDir, profile) + configurePath = fmt.Sprintf("%s/%s.configure", tmpSharedCredentialsDir, profile) + } + + providerConfig = make(map[string]interface{}) + _, err = os.Stat(credentialPath) + if !os.IsNotExist(err) { + data, err := ioutil.ReadFile(credentialPath) + if err != nil { + return nil, err + } + + config := map[string]interface{}{} + err = json.Unmarshal(data, &config) + if err != nil { + return nil, err + } + + for k, v := range config { + if strValue, ok := v.(string); ok { + providerConfig[k] = strings.TrimSpace(strValue) + } + } + } + + _, err = os.Stat(configurePath) + if !os.IsNotExist(err) { + data, err := ioutil.ReadFile(configurePath) + if err != nil { + return nil, err + } + + config := map[string]interface{}{} + err = json.Unmarshal(data, &config) + if err != nil { + return nil, err + } + + outerLoop: + for k, v := range config { + if k == "_sys_param" { + tmpMap := v.(map[string]interface{}) + for tmpK, tmpV := range tmpMap { + if tmpK == "region" { + providerConfig[tmpK] = strings.TrimSpace(tmpV.(string)) + break outerLoop + } + } + } + } + } + } + + return providerConfig[ProfileKey], nil +} diff --git a/internal/backend/remote-state/cos/go.mod b/internal/backend/remote-state/cos/go.mod index 6b0ac26465f5..a04913a72297 100644 --- a/internal/backend/remote-state/cos/go.mod +++ b/internal/backend/remote-state/cos/go.mod @@ -5,6 +5,7 @@ go 1.23.3 require ( github.com/hashicorp/terraform v0.0.0-00010101000000-000000000000 github.com/hashicorp/terraform/internal/legacy v0.0.0-00010101000000-000000000000 + github.com/mitchellh/go-homedir v1.1.0 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.588 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sts v1.0.588 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tag v1.0.233 diff --git a/website/docs/language/backend/cos.mdx b/website/docs/language/backend/cos.mdx index feaf2361362a..80551ad7ab14 100644 --- a/website/docs/language/backend/cos.mdx +++ b/website/docs/language/backend/cos.mdx @@ -88,9 +88,9 @@ terraform { bucket = "bucket-for-terraform-state-{appid}" prefix = "terraform/state" assume_role { - role_arn = "qcs::cam::uin/xxx:roleName/yyy" - session_name = "my-session-name" - session_duration = 3600 + role_arn = "qcs::cam::uin/xxx:roleName/yyy" + session_name = "my-session-name" + session_duration = 7200 } } } @@ -106,7 +106,101 @@ $ export TENCENTCLOUD_SECRET_KEY="my-secret-key" $ export TENCENTCLOUD_REGION="ap-guangzhou" $ export TENCENTCLOUD_ASSUME_ROLE_ARN="qcs::cam::uin/xxx:roleName/yyy" $ export TENCENTCLOUD_ASSUME_ROLE_SESSION_NAME="my-session-name" -$ export TENCENTCLOUD_ASSUME_ROLE_SESSION_DURATION=3600 +$ export TENCENTCLOUD_ASSUME_ROLE_SESSION_DURATION=7200 +$ terraform plan +``` + +### Shared credentials +You can use [Tencent Cloud credentials](https://www.tencentcloud.com/document/product/1013/33464) to specify your credentials. The default location is `$HOME/.tccli` on Linux and macOS, And `"%USERPROFILE%\.tccli"` on Windows. You can optionally specify a different location in the Terraform configuration by providing the `shared_credentials_dir` argument or using the `TENCENTCLOUD_SHARED_CREDENTIALS_DIR` environment variable. This method also supports a `profile` configuration and matching `TENCENTCLOUD_PROFILE` environment variable: + +- `shared_credentials_dir` - (Optional) The directory of the shared credentials. It can also be sourced from the `TENCENTCLOUD_SHARED_CREDENTIALS_DIR` environment variable. If not set this defaults to ~/.tccli. +- `profile` - (Optional) The profile name as set in the shared credentials. It can also be sourced from the `TENCENTCLOUD_PROFILE` environment variable. If not set, the default profile created with `tccli configure` will be used. + +Usage: + +On Linux/MacOS + +```hcl +terraform { + backend "cos" { + region = "ap-guangzhou" + bucket = "bucket-for-terraform-state-{appid}" + prefix = "terraform/state" + shared_credentials_dir = "/Users/tf_user/.tccli" + profile = "default" + } +} +``` + +On Windows + +```hcl +terraform { + backend "cos" { + region = "ap-guangzhou" + bucket = "bucket-for-terraform-state-{appid}" + prefix = "terraform/state" + shared_credentials_dir = "C:\\Users\\tf_user\\.tccli" + profile = "default" + } +} +``` + +In addition, these `shared_credentials_dir`, `profile` configurations can also be provided by environment variables. + +Usage: + +```shell +$ export PROVIDER_SHARED_CREDENTIALS_DIR="/Users/tf_user/.tccli" +$ export PROVIDER_PROFILE="default" +$ terraform plan +``` + +### Cam role name +If provided with a Cam role name, Terraform will just access the metadata URL: `http://metadata.tencentyun.com/latest/meta-data/cam/security-credentials/` to obtain the STS credential. The CVM Instance Role also can be set using the `TENCENTCLOUD_CAM_ROLE_NAME` environment variables. + +- `cam_role_name` - (Optional) The name of the CVM instance CAM role. It can be sourced from the `TENCENTCLOUD_CAM_ROLE_NAME` environment variable. + +Usage: + +```hcl +terraform { + backend "cos" { + region = "ap-guangzhou" + bucket = "bucket-for-terraform-state-{appid}" + prefix = "terraform/state" + cam_role_name = "my-cam-role-name" + } +} +``` + +It can also be authenticated together with method Assume role. Authentication process: Perform CAM authentication first, then proceed with Assume role authentication. + +Usage: + +```hcl +terraform { + backend "cos" { + region = "ap-guangzhou" + bucket = "bucket-for-terraform-state-{appid}" + prefix = "terraform/state" + cam_role_name = "my-cam-role-name" + assume_role { + role_arn = "qcs::cam::uin/xxx:roleName/yyy" + session_name = "my-session-name" + session_duration = 7200 + external_id = "my-external-id" + } + } +} +``` + +In addition, these `cam_role_name` configurations can also be provided by environment variables. + +Usage: + +```shell +$ export PROVIDER_CAM_ROLE_NAME="my-cam-role-name" $ terraform plan ``` From c67b22a38c7cd84ed7fbeeafd04327d7c0fcb9c9 Mon Sep 17 00:00:00 2001 From: Radek Simko Date: Wed, 13 Nov 2024 12:17:17 +0000 Subject: [PATCH 40/50] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ae928c8fffae..999c80aa60ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ Experiments are only enabled in alpha releases of Terraform CLI. The following f - The new command `terraform rpcapi` exposes some Terraform Core functionality through an RPC interface compatible with [`go-plugin`](https://github.com/hashicorp/go-plugin). The exact RPC API exposed here is currently subject to change at any time, because it's here primarily as a vehicle to support the [Terraform Stacks](https://www.hashicorp.com/blog/terraform-stacks-explained) private preview and so will be broken if necessary to respond to feedback from private preview participants, or possibly for other reasons. Do not use this mechanism yet outside of Terraform Stacks private preview. - The experimental "deferred actions" feature, enabled by passing the `-allow-deferral` option to `terraform plan`, permits `count` and `for_each` arguments in `module`, `resource`, and `data` blocks to have unknown values and allows providers to react more flexibly to unknown values. This experiment is under active development, and so it's not yet useful to participate in this experiment +ENHANCEMENTS: + +- backend/cos: Add new auth for Tencent Cloud backend ([#35888](https://github.com/hashicorp/terraform/pull/35888)) + ## Previous Releases For information on prior major and minor releases, refer to their changelogs: From effa87e05ad20c895162a0e3ac3a034a14ee3297 Mon Sep 17 00:00:00 2001 From: Radek Simko Date: Wed, 13 Nov 2024 12:52:37 +0000 Subject: [PATCH 41/50] github: Enable backporting closed PRs (#35993) --- .github/workflows/main.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a49376c475a8..56bc2659b903 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -5,6 +5,9 @@ on: pull_request_target: types: - closed + pull_request: + types: + - labeled permissions: contents: write # to push to a new branch From 0d39334aa13b68119f641c95e8ce86e8adb9839b Mon Sep 17 00:00:00 2001 From: Radek Simko Date: Wed, 13 Nov 2024 13:08:03 +0000 Subject: [PATCH 42/50] github: Update condition in backport-assistant workflow (#35994) --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 56bc2659b903..a3bb89406ff0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -15,7 +15,7 @@ permissions: jobs: backport: - if: github.event.pull_request.merged + if: github.event.pull_request runs-on: ubuntu-latest container: hashicorpdev/backport-assistant:0.4.7@sha256:36f9d4fba82b9454f1f62bf76c8078fafe3ab0be71356cb96af6d56ac4482cd8 steps: From ca35e204eef230ce75d43cb7db358a063e20fc92 Mon Sep 17 00:00:00 2001 From: djschnei21 <32646250+djschnei21@users.noreply.github.com> Date: Wed, 13 Nov 2024 08:54:57 -0500 Subject: [PATCH 43/50] fix incorrect syntax (#35878) from should be a direct component reference, not a string --- website/docs/language/stacks/reference/tfstack.mdx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/website/docs/language/stacks/reference/tfstack.mdx b/website/docs/language/stacks/reference/tfstack.mdx index 8a404d711cde..b9769d89bfd2 100644 --- a/website/docs/language/stacks/reference/tfstack.mdx +++ b/website/docs/language/stacks/reference/tfstack.mdx @@ -205,8 +205,7 @@ When every field is defined, a `removed` block has the following form: removed { source = "" - - from = "component.component_name"" + from = component.component_name providers = { aws = provider.aws.this } From 2b2b636d73121cf4bafc1427bdbc0ff1c622ed4d Mon Sep 17 00:00:00 2001 From: henryk-rychlik <157070992+henryk-rychlik@users.noreply.github.com> Date: Wed, 13 Nov 2024 08:45:17 -0600 Subject: [PATCH 44/50] Warning about Structured Run Output not working with remote backend (#35986) * Added a warning about Structured Run Output not working with remote backend * Update website/docs/language/backend/remote.mdx Co-authored-by: Rose M Koron <32436232+rkoron007@users.noreply.github.com> --------- Co-authored-by: Rose M Koron <32436232+rkoron007@users.noreply.github.com> --- website/docs/language/backend/remote.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/language/backend/remote.mdx b/website/docs/language/backend/remote.mdx index 0e09dc87de4b..e9ea55281a4c 100644 --- a/website/docs/language/backend/remote.mdx +++ b/website/docs/language/backend/remote.mdx @@ -7,7 +7,7 @@ description: >- # remote --> **Note:** We introduced the remote backend in Terraform v0.11.13 and Terraform Enterprise v201809-1. As of Terraform v1.1.0 and Terraform Enterprise v202201-1, **we recommend using the HCP Terraform's built-in [`cloud` integration](/terraform/cli/cloud/settings)** instead of this backend. The `cloud` option includes an improved user experience and more features. +-> **Note:** We introduced the remote backend in Terraform v0.11.13 and Terraform Enterprise v201809-1. As of Terraform v1.1.0 and Terraform Enterprise v202201-1, we recommend using HCP Terraform's built-in [`cloud` integration](/terraform/cli/cloud/settings) instead. The `cloud` option supports an improved user experience and more features, such as [structured run output mode](/terraform/cloud-docs/workspaces/settings#user-interface), which displays your plan and apply results in a human-readable format. The remote backend is unique among all other Terraform backends because it can both store state snapshots and execute operations for HCP Terraform's [CLI-driven run workflow](/terraform/cloud-docs/run/cli). It used to be called an "enhanced" backend. From de69c2285f6f2f54b7aab0a1dc14bceb786128f5 Mon Sep 17 00:00:00 2001 From: Ben Plotnick Date: Wed, 13 Nov 2024 10:46:19 -0500 Subject: [PATCH 45/50] Fix overly-eager jsonencode (#35984) * Fix overly-eager jsonencode * Update internal/genconfig/generate_config_test.go --------- Co-authored-by: Radek Simko --- internal/genconfig/generate_config.go | 52 +++++++++++++--------- internal/genconfig/generate_config_test.go | 42 +++++++++++++++++ 2 files changed, 73 insertions(+), 21 deletions(-) diff --git a/internal/genconfig/generate_config.go b/internal/genconfig/generate_config.go index 5843c88b3e37..87507048b94e 100644 --- a/internal/genconfig/generate_config.go +++ b/internal/genconfig/generate_config.go @@ -169,8 +169,6 @@ func writeConfigAttributesFromExisting(addr addrs.AbsResourceInstance, buf *stri // If the value is a string storing a JSON value we want to represent it in a terraform native way // and encapsulate it in `jsonencode` as it is the idiomatic representation if val.IsKnown() && !val.IsNull() && val.Type() == cty.String && json.Valid([]byte(val.AsString())) { - buf.WriteString("jsonencode(") - var ctyValue ctyjson.SimpleJSONValue err := ctyValue.UnmarshalJSON([]byte(val.AsString())) if err != nil { @@ -183,27 +181,25 @@ func writeConfigAttributesFromExisting(addr addrs.AbsResourceInstance, buf *stri continue } - tok := hclwrite.TokensForValue(ctyValue.Value) - if _, err := tok.WriteTo(buf); err != nil { - diags = diags.Append(&hcl.Diagnostic{ - Severity: hcl.DiagWarning, - Summary: "Skipped part of config generation", - Detail: fmt.Sprintf("Could not create attribute %s in %s when generating import configuration. The plan will likely report the missing attribute as being deleted.", name, addr), - Extra: err, - }) - continue + // Lone deserializable primitive types are valid json, but should be treated as strings + if ctyValue.Type().IsPrimitiveType() { + if d := writeTokens(val, buf); d != nil { + diags = diags.Append(d) + continue + } + } else { + buf.WriteString("jsonencode(") + + if d := writeTokens(ctyValue.Value, buf); d != nil { + diags = diags.Append(d) + continue + } + + buf.WriteString(")") } - - buf.WriteString(")") } else { - tok := hclwrite.TokensForValue(val) - if _, err := tok.WriteTo(buf); err != nil { - diags = diags.Append(&hcl.Diagnostic{ - Severity: hcl.DiagWarning, - Summary: "Skipped part of config generation", - Detail: fmt.Sprintf("Could not create attribute %s in %s when generating import configuration. The plan will likely report the missing attribute as being deleted.", name, addr), - Extra: err, - }) + if d := writeTokens(val, buf); d != nil { + diags = diags.Append(d) continue } } @@ -215,6 +211,20 @@ func writeConfigAttributesFromExisting(addr addrs.AbsResourceInstance, buf *stri return diags } +func writeTokens(val cty.Value, buf *strings.Builder) tfdiags.Diagnostics { + var diags tfdiags.Diagnostics + tok := hclwrite.TokensForValue(val) + if _, err := tok.WriteTo(buf); err != nil { + return diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagWarning, + Summary: "Skipped part of config generation", + Detail: "Could not create attribute in import configuration. The plan will likely report the missing attribute as being deleted.", + Extra: err, + }) + } + return diags +} + func writeConfigBlocks(addr addrs.AbsResourceInstance, buf *strings.Builder, blocks map[string]*configschema.NestedBlock, indent int) tfdiags.Diagnostics { var diags tfdiags.Diagnostics diff --git a/internal/genconfig/generate_config_test.go b/internal/genconfig/generate_config_test.go index a1392326773a..87d3fb778f85 100644 --- a/internal/genconfig/generate_config_test.go +++ b/internal/genconfig/generate_config_test.go @@ -500,6 +500,48 @@ resource "tfcoremock_simple_resource" "empty" { expected: ` resource "tfcoremock_simple_resource" "empty" { value = jsonencode(["Hello", "World"]) +}`, + }, + "simple_resource_with_json_primitive_strings": { + schema: &configschema.Block{ + Attributes: map[string]*configschema.Attribute{ + "id": { + Type: cty.String, + Computed: true, + }, + "value_string_number": { + Type: cty.String, + Optional: true, + }, + "value_string_bool": { + Type: cty.String, + Optional: true, + }, + }, + }, + addr: addrs.AbsResourceInstance{ + Module: nil, + Resource: addrs.ResourceInstance{ + Resource: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "tfcoremock_simple_resource", + Name: "empty", + }, + Key: nil, + }, + }, + provider: addrs.LocalProviderConfig{ + LocalName: "tfcoremock", + }, + value: cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("D2320658"), + "value_string_number": cty.StringVal("42"), + "value_string_bool": cty.StringVal("true"), + }), + expected: ` +resource "tfcoremock_simple_resource" "empty" { + value_string_bool = "true" + value_string_number = "42" }`, }, "simple_resource_with_malformed_json": { From 1d71a6dc9be67d66a7c7d208fa090f56b3d9b9a2 Mon Sep 17 00:00:00 2001 From: Radek Simko Date: Wed, 13 Nov 2024 15:48:52 +0000 Subject: [PATCH 46/50] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 999c80aa60ed..181ec2a254b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ ENHANCEMENTS: - backend/cos: Add new auth for Tencent Cloud backend ([#35888](https://github.com/hashicorp/terraform/pull/35888)) +BUG FIXES: + +- Simplify config generation (`plan -generate-config-out`) for string attributes that contain primitive types (e.g. numbers or booleans) ([#35984](https://github.com/hashicorp/terraform/pull/35984)) + ## Previous Releases For information on prior major and minor releases, refer to their changelogs: From a25831d6ef835e56c628e4fb9dd6c8ce09ff6688 Mon Sep 17 00:00:00 2001 From: Radek Simko Date: Wed, 13 Nov 2024 15:51:17 +0000 Subject: [PATCH 47/50] Update CHANGELOG.md Theses changes are being backported to 1.10 so they do not need to be marketed in the 1.11 changelog as it's not a change between 1.10 and 1.11 --- CHANGELOG.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 181ec2a254b2..ae928c8fffae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,14 +8,6 @@ Experiments are only enabled in alpha releases of Terraform CLI. The following f - The new command `terraform rpcapi` exposes some Terraform Core functionality through an RPC interface compatible with [`go-plugin`](https://github.com/hashicorp/go-plugin). The exact RPC API exposed here is currently subject to change at any time, because it's here primarily as a vehicle to support the [Terraform Stacks](https://www.hashicorp.com/blog/terraform-stacks-explained) private preview and so will be broken if necessary to respond to feedback from private preview participants, or possibly for other reasons. Do not use this mechanism yet outside of Terraform Stacks private preview. - The experimental "deferred actions" feature, enabled by passing the `-allow-deferral` option to `terraform plan`, permits `count` and `for_each` arguments in `module`, `resource`, and `data` blocks to have unknown values and allows providers to react more flexibly to unknown values. This experiment is under active development, and so it's not yet useful to participate in this experiment -ENHANCEMENTS: - -- backend/cos: Add new auth for Tencent Cloud backend ([#35888](https://github.com/hashicorp/terraform/pull/35888)) - -BUG FIXES: - -- Simplify config generation (`plan -generate-config-out`) for string attributes that contain primitive types (e.g. numbers or booleans) ([#35984](https://github.com/hashicorp/terraform/pull/35984)) - ## Previous Releases For information on prior major and minor releases, refer to their changelogs: From dc948f6c363001565f950fd1fd7fd7bd33b60eca Mon Sep 17 00:00:00 2001 From: Rose M Koron <32436232+rkoron007@users.noreply.github.com> Date: Wed, 13 Nov 2024 13:54:56 -0800 Subject: [PATCH 48/50] Fix to include private registry modules (#36001) --- website/docs/language/stacks/reference/tfstack.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/language/stacks/reference/tfstack.mdx b/website/docs/language/stacks/reference/tfstack.mdx index b9769d89bfd2..b576df58ed69 100644 --- a/website/docs/language/stacks/reference/tfstack.mdx +++ b/website/docs/language/stacks/reference/tfstack.mdx @@ -37,7 +37,7 @@ Each Stack must have at least one `component` block, and the label of the compon | Field | Description | Type | Required | | :---- | :---- | :---- | :---- | -| `source` | The Terraform module to [source](https://developer.hashicorp.com/terraform/language/modules/sources) for this component. Stacks do not support sourcing modules from the private registry. | string | Required | +| `source` | The Terraform module to [source](https://developer.hashicorp.com/terraform/language/modules/sources) for this component. | string | Required | | `version` | If you declare a module from the public Terraform registry in the source field, you can define which module version to use. | string | Optional | | `inputs` | A mapping of module input variable names to values. The keys of this map must correspond to the variable names defined by the `source` module. The values can be one of three types: A variable reference such as `var.variable_name`, a component output such as `component.component_name.output_name`, or a literal valid HCL value such as "string value". | map | Required | | `providers` | A mapping of provider names to providers declared in your Stack configuration. Modules cannot configure their own providers. You must [declare providers](/terraform/language/stacks/create/declare-providers) in the top level of the Stack and pass them into each module in the Stack. | map | Required | From a5d8673a418dda89ddb44ad5a875b49f5eead81c Mon Sep 17 00:00:00 2001 From: Bruno Schaatsbergen Date: Wed, 13 Nov 2024 18:22:26 -0700 Subject: [PATCH 49/50] Revert "Merge pull request #35929 from bschaatsbergen/b/fix-retry-messages-in-cloud-backend-json" This reverts commit f8cb25a24661b1f049a6789f2270104a8712295a, reversing changes made to a25831d6ef835e56c628e4fb9dd6c8ce09ff6688. --- internal/backend/backendrun/cli.go | 8 - internal/cloud/backend.go | 16 +- internal/cloud/backend_cli.go | 2 - internal/command/meta_backend.go | 6 - internal/command/views/cloud.go | 206 ++------------ internal/command/views/cloud_test.go | 406 --------------------------- internal/command/views/init.go | 6 +- internal/command/views/test.go | 11 +- 8 files changed, 44 insertions(+), 617 deletions(-) delete mode 100644 internal/command/views/cloud_test.go diff --git a/internal/backend/backendrun/cli.go b/internal/backend/backendrun/cli.go index 659ed3be8004..01fd90b0d004 100644 --- a/internal/backend/backendrun/cli.go +++ b/internal/backend/backendrun/cli.go @@ -8,8 +8,6 @@ import ( "github.com/mitchellh/colorstring" "github.com/hashicorp/terraform/internal/backend" - "github.com/hashicorp/terraform/internal/command/arguments" - "github.com/hashicorp/terraform/internal/command/views" "github.com/hashicorp/terraform/internal/terminal" "github.com/hashicorp/terraform/internal/terraform" ) @@ -62,12 +60,6 @@ type CLIOpts struct { // for tailoring the output to fit the attached terminal, for example. Streams *terminal.Streams - // FIXME: Temporarily exposing ViewType and View to the backend. - // This is a workaround until the backend is refactored to support - // native View handling. - ViewType arguments.ViewType - View *views.View - // StatePath is the local path where state is read from. // // StateOutPath is the local path where the state will be written. diff --git a/internal/cloud/backend.go b/internal/cloud/backend.go index 2b44582d4c76..546f1139a6bc 100644 --- a/internal/cloud/backend.go +++ b/internal/cloud/backend.go @@ -66,8 +66,9 @@ type Cloud struct { // client is the HCP Terraform or Terraform Enterprise API client. client *tfe.Client - // View handles rendering output in human-readable or machine-readable format from cloud-specific operations. - View views.Cloud + // viewHooks implements functions integrating the tfe.Client with the CLI + // output. + viewHooks views.CloudHooks // Hostname of HCP Terraform or Terraform Enterprise Hostname string @@ -606,15 +607,10 @@ func cliConfigToken(hostname svchost.Hostname, services *disco.Disco) (string, e // retryLogHook is invoked each time a request is retried allowing the // backend to log any connection issues to prevent data loss. func (b *Cloud) retryLogHook(attemptNum int, resp *http.Response) { - // FIXME: This guard statement prevents a potential nil error - // due to the way the backend is initialized and the context from which - // this function is called. - // - // In a future refactor, we should ensure that views are natively supported - // in backends and allow for calling a View directly within the - // backend.Configure method. if b.CLI != nil { - b.View.RetryLog(attemptNum, resp) + if output := b.viewHooks.RetryLogHook(attemptNum, resp, true); len(output) > 0 { + b.CLI.Output(b.Colorize().Color(output)) + } } } diff --git a/internal/cloud/backend_cli.go b/internal/cloud/backend_cli.go index b1c63962b50a..c63746ec037d 100644 --- a/internal/cloud/backend_cli.go +++ b/internal/cloud/backend_cli.go @@ -6,7 +6,6 @@ package cloud import ( "github.com/hashicorp/terraform/internal/backend/backendrun" "github.com/hashicorp/terraform/internal/command/jsonformat" - "github.com/hashicorp/terraform/internal/command/views" ) // CLIInit implements backendrun.CLI @@ -26,7 +25,6 @@ func (b *Cloud) CLIInit(opts *backendrun.CLIOpts) error { Streams: opts.Streams, Colorize: opts.CLIColor, } - b.View = views.NewCloud(opts.ViewType, opts.View) return nil } diff --git a/internal/command/meta_backend.go b/internal/command/meta_backend.go index 0113eed31b53..de9c8772820c 100644 --- a/internal/command/meta_backend.go +++ b/internal/command/meta_backend.go @@ -151,12 +151,6 @@ func (m *Meta) Backend(opts *BackendOpts) (backendrun.OperationsBackend, tfdiags } cliOpts.Validation = true - // FIXME: Temporarily exposing ViewType and View to the backend. - // This is a workaround until the backend is refactored to support - // native View handling. - cliOpts.ViewType = opts.ViewType - cliOpts.View = m.View - // If the backend supports CLI initialization, do it. if cli, ok := b.(backendrun.CLI); ok { if err := cli.CLIInit(cliOpts); err != nil { diff --git a/internal/command/views/cloud.go b/internal/command/views/cloud.go index e11eaab1c0b2..4842360507c8 100644 --- a/internal/command/views/cloud.go +++ b/internal/command/views/cloud.go @@ -4,199 +4,53 @@ package views import ( - "encoding/json" "fmt" "net/http" "strings" "time" - - "github.com/hashicorp/terraform/internal/command/arguments" - "github.com/hashicorp/terraform/internal/tfdiags" ) -// The Cloud view is used for operations that are specific to cloud operations. -type Cloud interface { - RetryLog(attemptNum int, resp *http.Response) - Diagnostics(diags tfdiags.Diagnostics) -} - -// NewCloud returns Cloud implementation for the given ViewType. -func NewCloud(vt arguments.ViewType, view *View) Cloud { - switch vt { - case arguments.ViewJSON: - return &CloudJSON{ - view: NewJSONView(view), - } - case arguments.ViewHuman: - return &CloudHuman{ - view: view, - } - default: - panic(fmt.Sprintf("unknown view type %v", vt)) - } -} - -// The CloudHuman implementation renders human-readable text logs, suitable for -// a scrolling terminal. -type CloudHuman struct { - view *View - - lastRetry time.Time -} - -var _ Cloud = (*CloudHuman)(nil) - -func (v *CloudHuman) Diagnostics(diags tfdiags.Diagnostics) { - v.view.Diagnostics(diags) -} - -func (v *CloudHuman) RetryLog(attemptNum int, resp *http.Response) { - msg, elapsed := retryLogMessage(attemptNum, resp, &v.lastRetry) - // retryLogMessage returns an empty string for the first attempt or for rate-limited responses (HTTP 429) - if msg != "" { - if elapsed != nil { - v.output(msg, elapsed) // subsequent retry message - } else { - v.output(msg) // initial retry message - v.view.streams.Println() // ensures a newline between messages - } - } -} - -func (v *CloudHuman) output(messageCode CloudMessageCode, params ...any) { - v.view.streams.Println(v.prepareMessage(messageCode, params...)) -} - -func (v *CloudHuman) prepareMessage(messageCode CloudMessageCode, params ...any) string { - message, ok := CloudMessageRegistry[messageCode] - if !ok { - // display the message code as fallback if not found in the message registry - return string(messageCode) - } - - if message.HumanValue == "" { - // no need to apply colorization if the message is empty - return message.HumanValue - } - - output := strings.TrimSpace(fmt.Sprintf(message.HumanValue, params...)) - if v.view.colorize != nil { - return v.view.colorize.Color(output) - } - - return output -} - -// The CloudJSON implementation renders streaming JSON logs, suitable for -// integrating with other software. -type CloudJSON struct { - view *JSONView - +// CloudHooks provides functions that help with integrating directly into +// the go-tfe tfe.Client struct. +type CloudHooks struct { + // lastRetry is set to the last time a request was retried. lastRetry time.Time } -var _ Cloud = (*CloudJSON)(nil) - -func (v *CloudJSON) Diagnostics(diags tfdiags.Diagnostics) { - v.view.Diagnostics(diags) -} - -func (v *CloudJSON) RetryLog(attemptNum int, resp *http.Response) { - msg, elapsed := retryLogMessage(attemptNum, resp, &v.lastRetry) - // retryLogMessage returns an empty string for the first attempt or for rate-limited responses (HTTP 429) - if msg != "" { - if elapsed != nil { - v.output(msg, elapsed) // subsequent retry message - } else { - v.output(msg) // initial retry message - } - } -} - -func (v *CloudJSON) output(messageCode CloudMessageCode, params ...any) { - // don't add empty messages to json output - preppedMessage := v.prepareMessage(messageCode, params...) - if preppedMessage == "" { - return - } - - current_timestamp := time.Now().UTC().Format(time.RFC3339) - json_data := map[string]string{ - "@level": "info", - "@message": preppedMessage, - "@module": "terraform.ui", - "@timestamp": current_timestamp, - "type": "cloud_output", - "message_code": string(messageCode), +// RetryLogHook returns a string providing an update about a request from the +// client being retried. +// +// If colorize is true, then the value returned by this function should be +// processed by a colorizer. +func (hooks *CloudHooks) RetryLogHook(attemptNum int, resp *http.Response, colorize bool) string { + // Ignore the first retry to make sure any delayed output will + // be written to the console before we start logging retries. + // + // The retry logic in the TFE client will retry both rate limited + // requests and server errors, but in the cloud backend we only + // care about server errors so we ignore rate limit (429) errors. + if attemptNum == 0 || (resp != nil && resp.StatusCode == 429) { + hooks.lastRetry = time.Now() + return "" } - cloud_output, err := json.Marshal(json_data) - if err != nil { - // Handle marshalling error with empty output - cloud_output = []byte{} + var msg string + if attemptNum == 1 { + msg = initialRetryError + } else { + msg = fmt.Sprintf(repeatedRetryError, time.Since(hooks.lastRetry).Round(time.Second)) } - v.view.view.streams.Println(string(cloud_output)) -} -func (v *CloudJSON) prepareMessage(messageCode CloudMessageCode, params ...any) string { - message, ok := CloudMessageRegistry[messageCode] - if !ok { - // display the message code as fallback if not found in the message registry - return string(messageCode) + if colorize { + return strings.TrimSpace(fmt.Sprintf("[reset][yellow]%s[reset]", msg)) } - - return strings.TrimSpace(fmt.Sprintf(message.JSONValue, params...)) -} - -// CloudMessage represents a message string in both json and human decorated text format. -type CloudMessage struct { - HumanValue string - JSONValue string -} - -var CloudMessageRegistry map[CloudMessageCode]CloudMessage = map[CloudMessageCode]CloudMessage{ - "initial_retry_error_message": { - HumanValue: initialRetryError, - JSONValue: initialRetryErrorJSON, - }, - "repeated_retry_error_message": { - HumanValue: repeatedRetryError, - JSONValue: repeatedRetryErrorJSON, - }, + return strings.TrimSpace(msg) } -type CloudMessageCode string - -const ( - InitialRetryErrorMessage CloudMessageCode = "initial_retry_error_message" - RepeatedRetryErrorMessage CloudMessageCode = "repeated_retry_error_message" -) - -const initialRetryError = `[reset][yellow] -There was an error connecting to HCP Terraform. Please do not exit -Terraform to prevent data loss! Trying to restore the connection...[reset] -` -const initialRetryErrorJSON = ` +// The newline in this error is to make it look good in the CLI! +const initialRetryError = ` There was an error connecting to HCP Terraform. Please do not exit Terraform to prevent data loss! Trying to restore the connection... ` -const repeatedRetryError = `[reset][yellow]Still trying to restore the connection... (%s elapsed)[reset]` -const repeatedRetryErrorJSON = `Still trying to restore the connection... (%s elapsed)` - -func retryLogMessage(attemptNum int, resp *http.Response, lastRetry *time.Time) (CloudMessageCode, *time.Duration) { - // Skips logging for the first attempt or for rate-limited requests (HTTP 429) - if attemptNum == 0 || (resp != nil && resp.StatusCode == 429) { - *lastRetry = time.Now() // Update the retry timestamp for subsequent attempts - return "", nil - } - - // Logs initial retry message on the first retry attempt - if attemptNum == 1 { - return InitialRetryErrorMessage, nil - } - - // Logs repeated retry message on subsequent attempts with elapsed time - elapsed := time.Since(*lastRetry).Round(time.Second) - return RepeatedRetryErrorMessage, &elapsed -} +const repeatedRetryError = "Still trying to restore the connection... (%s elapsed)" diff --git a/internal/command/views/cloud_test.go b/internal/command/views/cloud_test.go deleted file mode 100644 index 17b5ffdbfdfa..000000000000 --- a/internal/command/views/cloud_test.go +++ /dev/null @@ -1,406 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: BUSL-1.1 - -package views - -import ( - "fmt" - "net/http" - "strings" - "testing" - "time" - - "github.com/hashicorp/hcl/v2" - "github.com/hashicorp/terraform/internal/command/arguments" - "github.com/hashicorp/terraform/internal/terminal" - "github.com/hashicorp/terraform/internal/tfdiags" - tfversion "github.com/hashicorp/terraform/version" -) - -func TestNewCloudHuman_RetryLog(t *testing.T) { - t.Run("first retry, no output", func(t *testing.T) { - streams, done := terminal.StreamsForTesting(t) - newCloud := NewCloud(arguments.ViewHuman, NewView(streams).SetRunningInAutomation(true)) - cloudHuman, ok := newCloud.(*CloudHuman) - if !ok { - t.Fatalf("unexpected return type %T", newCloud) - } - - cloudHuman.RetryLog(0, nil) - output := done(t).All() - if output != "" { - t.Fatalf("expected no output for the first retry attempt, but got: %s", output) - } - }) - - t.Run("second retry, server error", func(t *testing.T) { - streams, done := terminal.StreamsForTesting(t) - newCloud := NewCloud(arguments.ViewHuman, NewView(streams).SetRunningInAutomation(true)) - cloudHuman, ok := newCloud.(*CloudHuman) - if !ok { - t.Fatalf("unexpected return type %T", newCloud) - } - - cloudHuman.RetryLog(1, &http.Response{StatusCode: 500}) - output := done(t).All() - expected := "There was an error connecting to HCP Terraform. Please do not exit\nTerraform to prevent data loss! Trying to restore the connection..." - if !strings.Contains(output, expected) { - t.Fatalf("expected output to contain: %s, but got %s", expected, output) - } - }) - - t.Run("subsequent retry with elapsed time", func(t *testing.T) { - streams, done := terminal.StreamsForTesting(t) - newCloud := NewCloud(arguments.ViewHuman, NewView(streams).SetRunningInAutomation(true)) - cloudHuman, ok := newCloud.(*CloudHuman) - if !ok { - t.Fatalf("unexpected return type %T", newCloud) - } - - cloudHuman.lastRetry = time.Now().Add(-2 * time.Second) // Simulate a delay of 2 seconds - cloudHuman.RetryLog(2, &http.Response{StatusCode: 500}) - output := done(t).All() - expected := "Still trying to restore the connection... (2s elapsed)" - if !strings.Contains(output, expected) { - t.Fatalf("expected output to contain: %s, but got %s", expected, output) - } - }) - - t.Run("retry with 429 status, no output", func(t *testing.T) { - streams, done := terminal.StreamsForTesting(t) - newCloud := NewCloud(arguments.ViewHuman, NewView(streams).SetRunningInAutomation(true)) - cloudHuman, ok := newCloud.(*CloudHuman) - if !ok { - t.Fatalf("unexpected return type %T", newCloud) - } - - cloudHuman.RetryLog(2, &http.Response{StatusCode: 429}) - output := done(t).All() - if output != "" { - t.Fatalf("expected no output for status code 429, but got: %s", output) - } - }) -} - -func TestNewCloud_unsupportedViewDiagnostics(t *testing.T) { - defer func() { - r := recover() - if r == nil { - t.Fatalf("should panic with unsupported view type raw") - } else if r != "unknown view type raw" { - t.Fatalf("unexpected panic message: %v", r) - } - }() - - streams, done := terminal.StreamsForTesting(t) - defer done(t) - - NewCloud(arguments.ViewRaw, NewView(streams).SetRunningInAutomation(true)) -} - -func TestNewCloud_humanViewOutput(t *testing.T) { - t.Run("no param", func(t *testing.T) { - streams, done := terminal.StreamsForTesting(t) - - human := CloudHuman{ - view: NewView(streams).SetRunningInAutomation(true), - } - human.output(InitialRetryErrorMessage) - - actual := done(t).All() - expected := "There was an error connecting to HCP Terraform. Please do not exit\nTerraform to prevent data loss! Trying to restore the connection..." - if !strings.Contains(actual, expected) { - t.Fatalf("expected output to contain: %s, but got %s", expected, actual) - } - }) - - t.Run("single param", func(t *testing.T) { - streams, done := terminal.StreamsForTesting(t) - - duration := 5 * time.Second - human := CloudHuman{ - view: NewView(streams).SetRunningInAutomation(true), - } - human.output(RepeatedRetryErrorMessage, duration) - - actual := done(t).All() - expected := fmt.Sprintf("Still trying to restore the connection... (%s elapsed)", duration) - if !strings.Contains(actual, expected) { - t.Fatalf("expected output to contain: %s, but got %s", expected, actual) - } - }) -} - -func TestNewCloud_humanViewDiagnostics(t *testing.T) { - streams, done := terminal.StreamsForTesting(t) - - newCloud := NewCloud(arguments.ViewHuman, NewView(streams).SetRunningInAutomation(true)) - if _, ok := newCloud.(*CloudHuman); !ok { - t.Fatalf("unexpected return type %t", newCloud) - } - - diags := getHCPDiags(t) - newCloud.Diagnostics(diags) - - actual := done(t).All() - expected := "\nError: Error connecting to HCP\n\nCould not connect to HCP Terraform. Check your network.\n\nError: Network Timeout\n\nConnection to HCP timed out. Check your network.\n" - if !strings.Contains(actual, expected) { - t.Fatalf("expected output to contain: %s, but got %s", expected, actual) - } -} - -func TestNewCloudJSON_RetryLog(t *testing.T) { - t.Run("attempt 0, no output", func(t *testing.T) { - streams, done := terminal.StreamsForTesting(t) - newCloud := NewCloud(arguments.ViewJSON, NewView(streams).SetRunningInAutomation(true)) - cloudJSON, ok := newCloud.(*CloudJSON) - if !ok { - t.Fatalf("unexpected return type %T", newCloud) - } - - cloudJSON.RetryLog(0, nil) - - version := tfversion.String() - want := []map[string]interface{}{ - { - "@level": "info", - "@message": fmt.Sprintf("Terraform %s", version), - "@module": "terraform.ui", - "terraform": version, - "type": "version", - "ui": JSON_UI_VERSION, - }, - } - actual := done(t).Stdout() - testJSONViewOutputEqualsFull(t, actual, want) - }) - - t.Run("attempt 1, server error", func(t *testing.T) { - streams, done := terminal.StreamsForTesting(t) - newCloud := NewCloud(arguments.ViewJSON, NewView(streams).SetRunningInAutomation(true)) - cloudJSON, ok := newCloud.(*CloudJSON) - if !ok { - t.Fatalf("unexpected return type %T", newCloud) - } - - cloudJSON.RetryLog(1, &http.Response{StatusCode: 500}) - - version := tfversion.String() - want := []map[string]interface{}{ - { - "@level": "info", - "@message": fmt.Sprintf("Terraform %s", version), - "@module": "terraform.ui", - "terraform": version, - "type": "version", - "ui": JSON_UI_VERSION, - }, - { - "@level": "info", - "@message": "There was an error connecting to HCP Terraform. Please do not exit\nTerraform to prevent data loss! Trying to restore the connection...", - "message_code": "initial_retry_error_message", - "@module": "terraform.ui", - "type": "cloud_output", - }, - } - actual := done(t).Stdout() - testJSONViewOutputEqualsFull(t, actual, want) - }) - - t.Run("subsequent retry with elapsed time", func(t *testing.T) { - streams, done := terminal.StreamsForTesting(t) - newCloud := NewCloud(arguments.ViewJSON, NewView(streams).SetRunningInAutomation(true)) - cloudJSON, ok := newCloud.(*CloudJSON) - if !ok { - t.Fatalf("unexpected return type %T", newCloud) - } - - cloudJSON.lastRetry = time.Now().Add(-2 * time.Second) // Simulate a delay of 2 seconds - cloudJSON.RetryLog(2, &http.Response{StatusCode: 500}) - - version := tfversion.String() - want := []map[string]interface{}{ - { - "@level": "info", - "@message": fmt.Sprintf("Terraform %s", version), - "@module": "terraform.ui", - "terraform": version, - "type": "version", - "ui": JSON_UI_VERSION, - }, - { - "@level": "info", - "@message": "Still trying to restore the connection... (2s elapsed)", - "message_code": "repeated_retry_error_message", - "@module": "terraform.ui", - "type": "cloud_output", - }, - } - - actual := done(t).Stdout() - testJSONViewOutputEqualsFull(t, actual, want) - }) - - t.Run("retry with 429 status, no output", func(t *testing.T) { - streams, done := terminal.StreamsForTesting(t) - newCloud := NewCloud(arguments.ViewJSON, NewView(streams).SetRunningInAutomation(true)) - cloudJSON, ok := newCloud.(*CloudJSON) - if !ok { - t.Fatalf("unexpected return type %T", newCloud) - } - - cloudJSON.RetryLog(0, &http.Response{ - StatusCode: http.StatusTooManyRequests, // HTTP: 429 - }) - - version := tfversion.String() - want := []map[string]interface{}{ - { - "@level": "info", - "@message": fmt.Sprintf("Terraform %s", version), - "@module": "terraform.ui", - "terraform": version, - "type": "version", - "ui": JSON_UI_VERSION, - }, - } - actual := done(t).Stdout() - testJSONViewOutputEqualsFull(t, actual, want) - }) -} - -func TestNewCloud_jsonViewOutput(t *testing.T) { - t.Run("no param", func(t *testing.T) { - streams, done := terminal.StreamsForTesting(t) - - json := CloudJSON{ - view: NewJSONView(NewView(streams).SetRunningInAutomation(true)), - } - json.output(InitialRetryErrorMessage) - - version := tfversion.String() - want := []map[string]interface{}{ - { - "@level": "info", - "@message": fmt.Sprintf("Terraform %s", version), - "@module": "terraform.ui", - "terraform": version, - "type": "version", - "ui": JSON_UI_VERSION, - }, - { - "@level": "info", - "@message": "There was an error connecting to HCP Terraform. Please do not exit\nTerraform to prevent data loss! Trying to restore the connection...", - "message_code": "initial_retry_error_message", - "@module": "terraform.ui", - "type": "cloud_output", - }, - } - - actual := done(t).Stdout() - testJSONViewOutputEqualsFull(t, actual, want) - }) - - t.Run("single param", func(t *testing.T) { - streams, done := terminal.StreamsForTesting(t) - - duration := 5 * time.Second - json := CloudJSON{ - view: NewJSONView(NewView(streams).SetRunningInAutomation(true)), - } - json.output(RepeatedRetryErrorMessage, duration) - - version := tfversion.String() - want := []map[string]interface{}{ - { - "@level": "info", - "@message": fmt.Sprintf("Terraform %s", version), - "@module": "terraform.ui", - "terraform": version, - "type": "version", - "ui": JSON_UI_VERSION, - }, - { - "@level": "info", - "@message": fmt.Sprintf("Still trying to restore the connection... (%s elapsed)", duration), - "@module": "terraform.ui", - "message_code": "repeated_retry_error_message", - "type": "cloud_output", - }, - } - - actual := done(t).Stdout() - testJSONViewOutputEqualsFull(t, actual, want) - }) -} - -func TestNewCloud_jsonViewDiagnostics(t *testing.T) { - streams, done := terminal.StreamsForTesting(t) - - newCloud := NewCloud(arguments.ViewJSON, NewView(streams).SetRunningInAutomation(true)) - if _, ok := newCloud.(*CloudJSON); !ok { - t.Fatalf("unexpected return type %t", newCloud) - } - - diags := getHCPDiags(t) // Assuming you want to use the HCP diagnostics here - newCloud.Diagnostics(diags) - - version := tfversion.String() - want := []map[string]interface{}{ - { - "@level": "info", - "@message": fmt.Sprintf("Terraform %s", version), - "@module": "terraform.ui", - "terraform": version, - "type": "version", - "ui": JSON_UI_VERSION, - }, - { - "@level": "error", - "@message": "Error: Error connecting to HCP", - "@module": "terraform.ui", - "diagnostic": map[string]interface{}{ - "severity": "error", - "summary": "Error connecting to HCP", - "detail": "Could not connect to HCP Terraform. Check your network.", - }, - "type": "diagnostic", - }, - { - "@level": "error", - "@message": "Error: Network Timeout", - "@module": "terraform.ui", - "diagnostic": map[string]interface{}{ - "severity": "error", - "summary": "Network Timeout", - "detail": "Connection to HCP timed out. Check your network.", - }, - "type": "diagnostic", - }, - } - - actual := done(t).Stdout() - testJSONViewOutputEqualsFull(t, actual, want) -} - -// These are mock error messages created solely for testing connectivity issues. -func getHCPDiags(t *testing.T) tfdiags.Diagnostics { - t.Helper() - - var diags tfdiags.Diagnostics - diags = diags.Append( - tfdiags.Sourceless( - tfdiags.Error, - "Error connecting to HCP", - "Could not connect to HCP Terraform. Check your network.", - ), - &hcl.Diagnostic{ - Severity: hcl.DiagError, - Summary: "Network Timeout", - Detail: "Connection to HCP timed out. Check your network.", - Subject: nil, - }, - ) - - return diags -} diff --git a/internal/command/views/init.go b/internal/command/views/init.go index b82c722225d4..92868d11615f 100644 --- a/internal/command/views/init.go +++ b/internal/command/views/init.go @@ -107,11 +107,7 @@ func (v *InitJSON) Output(messageCode InitMessageCode, params ...any) { "message_code": string(messageCode), } - init_output, err := json.Marshal(json_data) - if err != nil { - // Handle marshalling error with empty output - init_output = []byte{} - } + init_output, _ := json.Marshal(json_data) v.view.view.streams.Println(string(init_output)) } diff --git a/internal/command/views/test.go b/internal/command/views/test.go index 742df1887dd8..2fbb85a56318 100644 --- a/internal/command/views/test.go +++ b/internal/command/views/test.go @@ -101,7 +101,7 @@ func NewTest(vt arguments.ViewType, view *View) Test { } type TestHuman struct { - Cloud + CloudHooks view *View } @@ -371,11 +371,11 @@ func (t *TestHuman) TFCStatusUpdate(status tfe.TestRunStatus, elapsed time.Durat } func (t *TestHuman) TFCRetryHook(attemptNum int, resp *http.Response) { - t.Cloud.RetryLog(attemptNum, resp) + t.view.streams.Println(t.view.colorize.Color(t.RetryLogHook(attemptNum, resp, true))) } type TestJSON struct { - Cloud + CloudHooks view *JSONView } @@ -729,7 +729,10 @@ func (t *TestJSON) TFCStatusUpdate(status tfe.TestRunStatus, elapsed time.Durati } func (t *TestJSON) TFCRetryHook(attemptNum int, resp *http.Response) { - t.Cloud.RetryLog(attemptNum, resp) + t.view.log.Error( + t.RetryLogHook(attemptNum, resp, false), + "type", json.MessageTestRetry, + ) } // TestJUnitXMLFile produces a JUnit XML file at the conclusion of a test From dda25d1bd6b27f5900c0d144990de191bba5a01e Mon Sep 17 00:00:00 2001 From: Nara Kasbergen Kwon <855115+xiehan@users.noreply.github.com> Date: Thu, 14 Nov 2024 16:26:31 +0100 Subject: [PATCH 50/50] github: Update CODEOWNERS (#36000) --- CODEOWNERS | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 14ac082e5992..45df4db8d5ba 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -13,15 +13,15 @@ # make GitHub consider this file invalid if not commented. # Remote-state backend # Maintainer -/internal/backend/remote-state/azure @hashicorp/terraform-azure +/internal/backend/remote-state/azure @hashicorp/terraform-core @hashicorp/terraform-azure #/internal/backend/remote-state/consul Unmaintained #/internal/backend/remote-state/cos @likexian -/internal/backend/remote-state/gcs @hashicorp/tf-eco-hybrid-cloud +/internal/backend/remote-state/gcs @hashicorp/terraform-core @hashicorp/tf-eco-hybrid-cloud /internal/backend/remote-state/http @hashicorp/terraform-core #/internal/backend/remote-state/oss @xiaozhu36 #/internal/backend/remote-state/pg @remilapeyre -/internal/backend/remote-state/s3 @hashicorp/terraform-aws -/internal/backend/remote-state/kubernetes @hashicorp/tf-eco-hybrid-cloud +/internal/backend/remote-state/s3 @hashicorp/terraform-core @hashicorp/terraform-aws +/internal/backend/remote-state/kubernetes @hashicorp/terraform-core @hashicorp/tf-eco-hybrid-cloud # Provisioners builtin/provisioners/file @hashicorp/terraform-core