From 85fcdbe54ee720e4c3e7d33035fa4e161b72de94 Mon Sep 17 00:00:00 2001 From: Sandipan Panda Date: Tue, 23 Dec 2025 21:45:34 +0530 Subject: [PATCH 1/9] add sparkapp collection support --- api/v1/collectionpolicy_types.go | 46 + config/rbac/role.yaml | 9 + dist/backend-install.yaml | 9 + dist/install.yaml | 9 + dist/installer_updater.yaml | 9 + dist/zxporter.yaml | 9 + gen/api/v1/common.pb.go | 1003 +++++++++++++---- gen/api/v1/metrics_collector.pb.go | 861 +++++++------- .../zxporter/templates/zxporter-rbac.yaml | 9 + internal/collector/interface.go | 106 +- .../scheduled_spark_application_collector.go | 403 +++++++ .../collector/spark_application_collector.go | 403 +++++++ internal/collector/types.go | 20 +- .../controller/collectionpolicy_controller.go | 195 +++- proto/dakr_proto_descriptor.bin | Bin 307833 -> 311027 bytes 15 files changed, 2372 insertions(+), 719 deletions(-) create mode 100644 internal/collector/scheduled_spark_application_collector.go create mode 100644 internal/collector/spark_application_collector.go diff --git a/api/v1/collectionpolicy_types.go b/api/v1/collectionpolicy_types.go index 5ea83385..dae7747b 100644 --- a/api/v1/collectionpolicy_types.go +++ b/api/v1/collectionpolicy_types.go @@ -93,6 +93,16 @@ type Exclusions struct { ExcludedCSIDrivers []string `json:"excludedCSIDrivers,omitempty"` ExcludedCSIStorageCapacities []ExcludedCSIStorageCapacity `json:"excludedCSIStorageCapacities,omitempty"` ExcludedVolumeAttachments []string `json:"excludedVolumeAttachments,omitempty"` + + // Kubeflow Notebooks Exclusions + ExcludedKubeflowNotebooks []ExcludedKubeflowNotebook `json:"excludedKubeflowNotebooks,omitempty"` + + // VolcanoJobs Exclusions + ExcludedVolcanoJobs []ExcludedVolcanoJob `json:"excludedVolcanoJobs,omitempty"` + + // Spark Applications Exclusions + ExcludedSparkApplications []ExcludedSparkApplication `json:"excludedSparkApplications,omitempty"` + ExcludedScheduledSparkApplications []ExcludedScheduledSparkApplication `json:"excludedScheduledSparkApplications,omitempty"` } // Common exclusion patterns @@ -376,6 +386,42 @@ type ExcludedCSIStorageCapacity struct { Name string `json:"name"` } +// ExcludedKubeflowNotebook identifies a Kubeflow Notebook to exclude +type ExcludedKubeflowNotebook struct { + // Namespace is the Kubeflow Notebook's namespace + Namespace string `json:"namespace"` + + // Name is the Kubeflow Notebook's name + Name string `json:"name"` +} + +// ExcludedVolcanoJob identifies a Volcano Job to exclude +type ExcludedVolcanoJob struct { + // Namespace is the Volcano Job's namespace + Namespace string `json:"namespace"` + + // Name is the Volcano Job's name + Name string `json:"name"` +} + +// ExcludedSparkApplication identifies a Spark Application to exclude +type ExcludedSparkApplication struct { + // Namespace is the Spark Application's namespace + Namespace string `json:"namespace"` + + // Name is the Spark Application's name + Name string `json:"name"` +} + +// ExcludedScheduledSparkApplication identifies a Scheduled Spark Application to exclude +type ExcludedScheduledSparkApplication struct { + // Namespace is the Scheduled Spark Application's namespace + Namespace string `json:"namespace"` + + // Name is the Scheduled Spark Application's name + Name string `json:"name"` +} + // Policies defines collection behavior type Policies struct { // KubeContextName is the name of the current context being used to apply the installation yaml diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index 7336761f..018f7a79 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -305,3 +305,12 @@ rules: - get - list - watch +- apiGroups: + - sparkoperator.k8s.io + resources: + - sparkapplications + - scheduledsparkapplications + verbs: + - get + - list + - watch diff --git a/dist/backend-install.yaml b/dist/backend-install.yaml index 740f11b0..eed02f20 100644 --- a/dist/backend-install.yaml +++ b/dist/backend-install.yaml @@ -1259,6 +1259,15 @@ rules: - get - list - watch + - apiGroups: + - sparkoperator.k8s.io + resources: + - sparkapplications + - scheduledsparkapplications + verbs: + - get + - list + - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole diff --git a/dist/install.yaml b/dist/install.yaml index f0d7ee73..206742e3 100644 --- a/dist/install.yaml +++ b/dist/install.yaml @@ -1264,6 +1264,15 @@ rules: - get - list - watch +- apiGroups: + - sparkoperator.k8s.io + resources: + - sparkapplications + - scheduledsparkapplications + verbs: + - get + - list + - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole diff --git a/dist/installer_updater.yaml b/dist/installer_updater.yaml index 1a97a68f..4c49d970 100644 --- a/dist/installer_updater.yaml +++ b/dist/installer_updater.yaml @@ -1259,6 +1259,15 @@ rules: - get - list - watch + - apiGroups: + - sparkoperator.k8s.io + resources: + - sparkapplications + - scheduledsparkapplications + verbs: + - get + - list + - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole diff --git a/dist/zxporter.yaml b/dist/zxporter.yaml index a16a7568..0a03010f 100644 --- a/dist/zxporter.yaml +++ b/dist/zxporter.yaml @@ -443,6 +443,15 @@ rules: - get - list - watch +- apiGroups: + - sparkoperator.k8s.io + resources: + - sparkapplications + - scheduledsparkapplications + verbs: + - get + - list + - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole diff --git a/gen/api/v1/common.pb.go b/gen/api/v1/common.pb.go index b60662d9..bd57117c 100644 --- a/gen/api/v1/common.pb.go +++ b/gen/api/v1/common.pb.go @@ -7,12 +7,13 @@ package apiv1 import ( + reflect "reflect" + sync "sync" + money "google.golang.org/genproto/googleapis/type/money" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" ) const ( @@ -62,6 +63,7 @@ const ( K8SObjectKind_K8S_OBJECT_KIND_CLUSTER_ROLE_BINDING K8SObjectKind = 33 K8SObjectKind_K8S_OBJECT_KIND_NETWORK_POLICY K8SObjectKind = 34 K8SObjectKind_K8S_OBJECT_KIND_CLUSTER K8SObjectKind = 35 + K8SObjectKind_K8S_OBJECT_KIND_SPARK_APPLICATION K8SObjectKind = 36 ) // Enum value maps for K8SObjectKind. @@ -103,6 +105,7 @@ var ( 33: "K8S_OBJECT_KIND_CLUSTER_ROLE_BINDING", 34: "K8S_OBJECT_KIND_NETWORK_POLICY", 35: "K8S_OBJECT_KIND_CLUSTER", + 36: "K8S_OBJECT_KIND_SPARK_APPLICATION", } K8SObjectKind_value = map[string]int32{ "K8S_OBJECT_KIND_UNSPECIFIED": 0, @@ -141,6 +144,7 @@ var ( "K8S_OBJECT_KIND_CLUSTER_ROLE_BINDING": 33, "K8S_OBJECT_KIND_NETWORK_POLICY": 34, "K8S_OBJECT_KIND_CLUSTER": 35, + "K8S_OBJECT_KIND_SPARK_APPLICATION": 36, } ) @@ -3619,6 +3623,7 @@ type ResourceDetails struct { // *ResourceDetails_PodDisruptionBudgetDetails // *ResourceDetails_ResourceQuotaDetails // *ResourceDetails_VolcanoJobDetails + // *ResourceDetails_SparkApplicationDetails Details isResourceDetails_Details `protobuf_oneof:"details"` // Common fields that can be flattened at this level for easier access // These are populated based on the resource type @@ -4005,6 +4010,13 @@ func (x *ResourceDetails) GetVolcanoJobDetails() *VolcanoJobDetails { return nil } +func (x *ResourceDetails) GetSparkApplicationDetails() *SparkApplicationDetails { + if x, ok := x.GetDetails().(*ResourceDetails_SparkApplicationDetails); ok { + return x.SparkApplicationDetails + } + return nil +} + func (x *ResourceDetails) GetPhase() string { if x != nil { return x.Phase @@ -5191,6 +5203,11 @@ type ResourceDetails_VolcanoJobDetails struct { VolcanoJobDetails *VolcanoJobDetails `protobuf:"bytes,239,opt,name=volcano_job_details,json=volcanoJobDetails,proto3,oneof"` } +type ResourceDetails_SparkApplicationDetails struct { + // SparkApplication-specific fields + SparkApplicationDetails *SparkApplicationDetails `protobuf:"bytes,242,opt,name=spark_application_details,json=sparkApplicationDetails,proto3,oneof"` +} + func (*ResourceDetails_PodDetails) isResourceDetails_Details() {} func (*ResourceDetails_DeploymentDetails) isResourceDetails_Details() {} @@ -5241,6 +5258,8 @@ func (*ResourceDetails_ResourceQuotaDetails) isResourceDetails_Details() {} func (*ResourceDetails_VolcanoJobDetails) isResourceDetails_Details() {} +func (*ResourceDetails_SparkApplicationDetails) isResourceDetails_Details() {} + // PodDetails contains detailed Pod information (for the oneof, if we need nested data later) type PodDetails struct { state protoimpl.MessageState @@ -12052,6 +12071,446 @@ func (x *VolcanoTask) GetContainers() []*ContainerTemplate { return nil } +// SparkApplicationDetails contains detailed SparkApplication information for drill-down +type SparkApplicationDetails struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates from driver/executor specs + SparkVersion string `protobuf:"bytes,2,opt,name=spark_version,json=sparkVersion,proto3" json:"spark_version,omitempty"` // Spark version + ApplicationType string `protobuf:"bytes,3,opt,name=application_type,json=applicationType,proto3" json:"application_type,omitempty"` // Java, Scala, Python, R + DeployMode string `protobuf:"bytes,4,opt,name=deploy_mode,json=deployMode,proto3" json:"deploy_mode,omitempty"` // cluster, client, in-cluster-client + MainClass string `protobuf:"bytes,5,opt,name=main_class,json=mainClass,proto3" json:"main_class,omitempty"` // Main class for Java/Scala applications + MainApplicationFile string `protobuf:"bytes,6,opt,name=main_application_file,json=mainApplicationFile,proto3" json:"main_application_file,omitempty"` // Main application file path + Arguments []string `protobuf:"bytes,7,rep,name=arguments,proto3" json:"arguments,omitempty"` // Application arguments + SparkDriverInfo *SparkDriverInfo `protobuf:"bytes,8,opt,name=spark_driver_info,json=sparkDriverInfo,proto3" json:"spark_driver_info,omitempty"` // Driver information + ExecutorInstances int32 `protobuf:"varint,9,opt,name=executor_instances,json=executorInstances,proto3" json:"executor_instances,omitempty"` // Number of executor instances + ApplicationState string `protobuf:"bytes,10,opt,name=application_state,json=applicationState,proto3" json:"application_state,omitempty"` // Application state: SUBMITTED, RUNNING, COMPLETED, FAILED, etc. + SparkApplicationId string `protobuf:"bytes,11,opt,name=spark_application_id,json=sparkApplicationId,proto3" json:"spark_application_id,omitempty"` // Spark application ID + SubmissionId string `protobuf:"bytes,12,opt,name=submission_id,json=submissionId,proto3" json:"submission_id,omitempty"` // Submission ID + Suspended bool `protobuf:"varint,13,opt,name=suspended,proto3" json:"suspended,omitempty"` // Whether application is suspended + RestartPolicy *SparkRestartPolicyInfo `protobuf:"bytes,14,opt,name=restart_policy,json=restartPolicy,proto3" json:"restart_policy,omitempty"` // Restart policy information + DynamicAllocation *SparkDynamicAllocationInfo `protobuf:"bytes,15,opt,name=dynamic_allocation,json=dynamicAllocation,proto3" json:"dynamic_allocation,omitempty"` // Dynamic allocation configuration +} + +func (x *SparkApplicationDetails) Reset() { + *x = SparkApplicationDetails{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[118] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SparkApplicationDetails) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SparkApplicationDetails) ProtoMessage() {} + +func (x *SparkApplicationDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[118] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SparkApplicationDetails.ProtoReflect.Descriptor instead. +func (*SparkApplicationDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{118} +} + +func (x *SparkApplicationDetails) GetContainers() []*ContainerTemplate { + if x != nil { + return x.Containers + } + return nil +} + +func (x *SparkApplicationDetails) GetSparkVersion() string { + if x != nil { + return x.SparkVersion + } + return "" +} + +func (x *SparkApplicationDetails) GetApplicationType() string { + if x != nil { + return x.ApplicationType + } + return "" +} + +func (x *SparkApplicationDetails) GetDeployMode() string { + if x != nil { + return x.DeployMode + } + return "" +} + +func (x *SparkApplicationDetails) GetMainClass() string { + if x != nil { + return x.MainClass + } + return "" +} + +func (x *SparkApplicationDetails) GetMainApplicationFile() string { + if x != nil { + return x.MainApplicationFile + } + return "" +} + +func (x *SparkApplicationDetails) GetArguments() []string { + if x != nil { + return x.Arguments + } + return nil +} + +func (x *SparkApplicationDetails) GetSparkDriverInfo() *SparkDriverInfo { + if x != nil { + return x.SparkDriverInfo + } + return nil +} + +func (x *SparkApplicationDetails) GetExecutorInstances() int32 { + if x != nil { + return x.ExecutorInstances + } + return 0 +} + +func (x *SparkApplicationDetails) GetApplicationState() string { + if x != nil { + return x.ApplicationState + } + return "" +} + +func (x *SparkApplicationDetails) GetSparkApplicationId() string { + if x != nil { + return x.SparkApplicationId + } + return "" +} + +func (x *SparkApplicationDetails) GetSubmissionId() string { + if x != nil { + return x.SubmissionId + } + return "" +} + +func (x *SparkApplicationDetails) GetSuspended() bool { + if x != nil { + return x.Suspended + } + return false +} + +func (x *SparkApplicationDetails) GetRestartPolicy() *SparkRestartPolicyInfo { + if x != nil { + return x.RestartPolicy + } + return nil +} + +func (x *SparkApplicationDetails) GetDynamicAllocation() *SparkDynamicAllocationInfo { + if x != nil { + return x.DynamicAllocation + } + return nil +} + +// SparkDriverInfo represents information about the Spark driver +type SparkDriverInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PodName string `protobuf:"bytes,1,opt,name=pod_name,json=podName,proto3" json:"pod_name,omitempty"` // Driver pod name + WebUiServiceName string `protobuf:"bytes,2,opt,name=web_ui_service_name,json=webUiServiceName,proto3" json:"web_ui_service_name,omitempty"` // Web UI service name + WebUiAddress string `protobuf:"bytes,3,opt,name=web_ui_address,json=webUiAddress,proto3" json:"web_ui_address,omitempty"` // Web UI address + WebUiPort int32 `protobuf:"varint,4,opt,name=web_ui_port,json=webUiPort,proto3" json:"web_ui_port,omitempty"` // Web UI port + WebUiIngressName string `protobuf:"bytes,5,opt,name=web_ui_ingress_name,json=webUiIngressName,proto3" json:"web_ui_ingress_name,omitempty"` // Web UI ingress name (if configured) + WebUiIngressAddress string `protobuf:"bytes,6,opt,name=web_ui_ingress_address,json=webUiIngressAddress,proto3" json:"web_ui_ingress_address,omitempty"` // Web UI ingress address (if configured) + Cores string `protobuf:"bytes,7,opt,name=cores,proto3" json:"cores,omitempty"` // Driver cores + Memory string `protobuf:"bytes,8,opt,name=memory,proto3" json:"memory,omitempty"` // Driver memory + ServiceAccount string `protobuf:"bytes,9,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"` // Service account used by driver +} + +func (x *SparkDriverInfo) Reset() { + *x = SparkDriverInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[119] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SparkDriverInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SparkDriverInfo) ProtoMessage() {} + +func (x *SparkDriverInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[119] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SparkDriverInfo.ProtoReflect.Descriptor instead. +func (*SparkDriverInfo) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{119} +} + +func (x *SparkDriverInfo) GetPodName() string { + if x != nil { + return x.PodName + } + return "" +} + +func (x *SparkDriverInfo) GetWebUiServiceName() string { + if x != nil { + return x.WebUiServiceName + } + return "" +} + +func (x *SparkDriverInfo) GetWebUiAddress() string { + if x != nil { + return x.WebUiAddress + } + return "" +} + +func (x *SparkDriverInfo) GetWebUiPort() int32 { + if x != nil { + return x.WebUiPort + } + return 0 +} + +func (x *SparkDriverInfo) GetWebUiIngressName() string { + if x != nil { + return x.WebUiIngressName + } + return "" +} + +func (x *SparkDriverInfo) GetWebUiIngressAddress() string { + if x != nil { + return x.WebUiIngressAddress + } + return "" +} + +func (x *SparkDriverInfo) GetCores() string { + if x != nil { + return x.Cores + } + return "" +} + +func (x *SparkDriverInfo) GetMemory() string { + if x != nil { + return x.Memory + } + return "" +} + +func (x *SparkDriverInfo) GetServiceAccount() string { + if x != nil { + return x.ServiceAccount + } + return "" +} + +// SparkRestartPolicyInfo represents restart policy information +type SparkRestartPolicyInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Always, OnFailure, Never + OnFailureRetries int32 `protobuf:"varint,2,opt,name=on_failure_retries,json=onFailureRetries,proto3" json:"on_failure_retries,omitempty"` // Number of retries on failure + OnFailureRetryInterval int64 `protobuf:"varint,3,opt,name=on_failure_retry_interval,json=onFailureRetryInterval,proto3" json:"on_failure_retry_interval,omitempty"` // Retry interval in seconds + OnSubmissionFailureRetries int32 `protobuf:"varint,4,opt,name=on_submission_failure_retries,json=onSubmissionFailureRetries,proto3" json:"on_submission_failure_retries,omitempty"` // Number of retries on submission failure + OnSubmissionFailureRetryInterval int64 `protobuf:"varint,5,opt,name=on_submission_failure_retry_interval,json=onSubmissionFailureRetryInterval,proto3" json:"on_submission_failure_retry_interval,omitempty"` // Submission retry interval in seconds +} + +func (x *SparkRestartPolicyInfo) Reset() { + *x = SparkRestartPolicyInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[120] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SparkRestartPolicyInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SparkRestartPolicyInfo) ProtoMessage() {} + +func (x *SparkRestartPolicyInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[120] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SparkRestartPolicyInfo.ProtoReflect.Descriptor instead. +func (*SparkRestartPolicyInfo) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{120} +} + +func (x *SparkRestartPolicyInfo) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *SparkRestartPolicyInfo) GetOnFailureRetries() int32 { + if x != nil { + return x.OnFailureRetries + } + return 0 +} + +func (x *SparkRestartPolicyInfo) GetOnFailureRetryInterval() int64 { + if x != nil { + return x.OnFailureRetryInterval + } + return 0 +} + +func (x *SparkRestartPolicyInfo) GetOnSubmissionFailureRetries() int32 { + if x != nil { + return x.OnSubmissionFailureRetries + } + return 0 +} + +func (x *SparkRestartPolicyInfo) GetOnSubmissionFailureRetryInterval() int64 { + if x != nil { + return x.OnSubmissionFailureRetryInterval + } + return 0 +} + +// SparkDynamicAllocationInfo represents dynamic allocation configuration +type SparkDynamicAllocationInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` // Whether dynamic allocation is enabled + InitialExecutors int32 `protobuf:"varint,2,opt,name=initial_executors,json=initialExecutors,proto3" json:"initial_executors,omitempty"` // Initial number of executors + MinExecutors int32 `protobuf:"varint,3,opt,name=min_executors,json=minExecutors,proto3" json:"min_executors,omitempty"` // Minimum number of executors + MaxExecutors int32 `protobuf:"varint,4,opt,name=max_executors,json=maxExecutors,proto3" json:"max_executors,omitempty"` // Maximum number of executors + ShuffleTrackingEnabled bool `protobuf:"varint,5,opt,name=shuffle_tracking_enabled,json=shuffleTrackingEnabled,proto3" json:"shuffle_tracking_enabled,omitempty"` // Whether shuffle tracking is enabled + ShuffleTrackingTimeout int64 `protobuf:"varint,6,opt,name=shuffle_tracking_timeout,json=shuffleTrackingTimeout,proto3" json:"shuffle_tracking_timeout,omitempty"` // Shuffle tracking timeout in milliseconds +} + +func (x *SparkDynamicAllocationInfo) Reset() { + *x = SparkDynamicAllocationInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[121] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SparkDynamicAllocationInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SparkDynamicAllocationInfo) ProtoMessage() {} + +func (x *SparkDynamicAllocationInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[121] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SparkDynamicAllocationInfo.ProtoReflect.Descriptor instead. +func (*SparkDynamicAllocationInfo) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{121} +} + +func (x *SparkDynamicAllocationInfo) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *SparkDynamicAllocationInfo) GetInitialExecutors() int32 { + if x != nil { + return x.InitialExecutors + } + return 0 +} + +func (x *SparkDynamicAllocationInfo) GetMinExecutors() int32 { + if x != nil { + return x.MinExecutors + } + return 0 +} + +func (x *SparkDynamicAllocationInfo) GetMaxExecutors() int32 { + if x != nil { + return x.MaxExecutors + } + return 0 +} + +func (x *SparkDynamicAllocationInfo) GetShuffleTrackingEnabled() bool { + if x != nil { + return x.ShuffleTrackingEnabled + } + return false +} + +func (x *SparkDynamicAllocationInfo) GetShuffleTrackingTimeout() int64 { + if x != nil { + return x.ShuffleTrackingTimeout + } + return 0 +} + type Event struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -12090,7 +12549,7 @@ type Event struct { func (x *Event) Reset() { *x = Event{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[118] + mi := &file_api_v1_common_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12103,7 +12562,7 @@ func (x *Event) String() string { func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[118] + mi := &file_api_v1_common_proto_msgTypes[122] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12116,7 +12575,7 @@ func (x *Event) ProtoReflect() protoreflect.Message { // Deprecated: Use Event.ProtoReflect.Descriptor instead. func (*Event) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{118} + return file_api_v1_common_proto_rawDescGZIP(), []int{122} } func (x *Event) GetId() string { @@ -12332,7 +12791,7 @@ type EventDatapointInfo struct { func (x *EventDatapointInfo) Reset() { *x = EventDatapointInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[119] + mi := &file_api_v1_common_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12345,7 +12804,7 @@ func (x *EventDatapointInfo) String() string { func (*EventDatapointInfo) ProtoMessage() {} func (x *EventDatapointInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[119] + mi := &file_api_v1_common_proto_msgTypes[123] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12358,7 +12817,7 @@ func (x *EventDatapointInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use EventDatapointInfo.ProtoReflect.Descriptor instead. func (*EventDatapointInfo) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{119} + return file_api_v1_common_proto_rawDescGZIP(), []int{123} } func (x *EventDatapointInfo) GetName() string { @@ -12423,7 +12882,7 @@ type EventDatapoint struct { func (x *EventDatapoint) Reset() { *x = EventDatapoint{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[120] + mi := &file_api_v1_common_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12436,7 +12895,7 @@ func (x *EventDatapoint) String() string { func (*EventDatapoint) ProtoMessage() {} func (x *EventDatapoint) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[120] + mi := &file_api_v1_common_proto_msgTypes[124] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12449,7 +12908,7 @@ func (x *EventDatapoint) ProtoReflect() protoreflect.Message { // Deprecated: Use EventDatapoint.ProtoReflect.Descriptor instead. func (*EventDatapoint) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{120} + return file_api_v1_common_proto_rawDescGZIP(), []int{124} } func (x *EventDatapoint) GetUtcTime() string { @@ -15488,7 +15947,7 @@ func file_api_v1_common_proto_rawDescGZIP() []byte { } var file_api_v1_common_proto_enumTypes = make([]protoimpl.EnumInfo, 4) -var file_api_v1_common_proto_msgTypes = make([]protoimpl.MessageInfo, 158) +var file_api_v1_common_proto_msgTypes = make([]protoimpl.MessageInfo, 162) var file_api_v1_common_proto_goTypes = []interface{}{ (K8SObjectKind)(0), // 0: api.v1.K8sObjectKind (OrderByEnum)(0), // 1: api.v1.OrderByEnum @@ -15612,107 +16071,111 @@ var file_api_v1_common_proto_goTypes = []interface{}{ (*VolcanoJobDetails)(nil), // 119: api.v1.VolcanoJobDetails (*VolcanoJobCondition)(nil), // 120: api.v1.VolcanoJobCondition (*VolcanoTask)(nil), // 121: api.v1.VolcanoTask - (*Event)(nil), // 122: api.v1.Event - (*EventDatapointInfo)(nil), // 123: api.v1.EventDatapointInfo - (*EventDatapoint)(nil), // 124: api.v1.EventDatapoint - nil, // 125: api.v1.WorkloadItem.LabelsEntry - nil, // 126: api.v1.WorkloadItem.AnnotationsEntry - nil, // 127: api.v1.Node.LabelsEntry - nil, // 128: api.v1.Node.AnnotationsEntry - nil, // 129: api.v1.LabelSelector.MatchLabelsEntry - nil, // 130: api.v1.ResourceDetails.ServiceSelectorEntry - nil, // 131: api.v1.ResourceDetails.ScParametersEntry - nil, // 132: api.v1.ServiceDetails.SelectorEntry - nil, // 133: api.v1.ResourceRequirements.RequestsEntry - nil, // 134: api.v1.ResourceRequirements.LimitsEntry - nil, // 135: api.v1.PersistentVolumeDetails.CapacityEntry - nil, // 136: api.v1.PVVolumeSource.VolumeAttributesEntry - nil, // 137: api.v1.CSIVolumeSource.VolumeAttributesEntry - nil, // 138: api.v1.StorageClassDetails.ParametersEntry - nil, // 139: api.v1.NamespaceDetails.ConditionsEntry - nil, // 140: api.v1.NodeDetails.CapacityEntry - nil, // 141: api.v1.NodeDetails.AllocatableEntry - nil, // 142: api.v1.TopologySelectorTerm.MatchLabelsEntry - nil, // 143: api.v1.HPAMetricSelector.SelectorEntry - nil, // 144: api.v1.VPAContainerResourcePolicy.MinAllowedEntry - nil, // 145: api.v1.VPAContainerResourcePolicy.MaxAllowedEntry - nil, // 146: api.v1.VPAContainerRecommendation.TargetEntry - nil, // 147: api.v1.VPAContainerRecommendation.LowerBoundEntry - nil, // 148: api.v1.VPAContainerRecommendation.UpperBoundEntry - nil, // 149: api.v1.VPAContainerRecommendation.UncappedTargetEntry - nil, // 150: api.v1.LimitRangeItem.DefaultLimitsEntry - nil, // 151: api.v1.LimitRangeItem.DefaultRequestEntry - nil, // 152: api.v1.LimitRangeItem.MaxEntry - nil, // 153: api.v1.LimitRangeItem.MinEntry - nil, // 154: api.v1.LimitRangeItem.MaxLimitRequestRatioEntry - nil, // 155: api.v1.KedaScaledObjectTrigger.MetadataEntry - nil, // 156: api.v1.KarpenterResourceDetails.LimitsEntry - nil, // 157: api.v1.KarpenterCapacity.OtherEntry - nil, // 158: api.v1.PodDisruptionBudgetDetails.SelectorLabelsEntry - nil, // 159: api.v1.ResourceQuotaDetails.HardLimitsEntry - nil, // 160: api.v1.ResourceQuotaDetails.UsedEntry - nil, // 161: api.v1.ResourceQuotaDetails.ScopeSelectorEntry - (*timestamppb.Timestamp)(nil), // 162: google.protobuf.Timestamp - (*money.Money)(nil), // 163: google.type.Money + (*SparkApplicationDetails)(nil), // 122: api.v1.SparkApplicationDetails + (*SparkDriverInfo)(nil), // 123: api.v1.SparkDriverInfo + (*SparkRestartPolicyInfo)(nil), // 124: api.v1.SparkRestartPolicyInfo + (*SparkDynamicAllocationInfo)(nil), // 125: api.v1.SparkDynamicAllocationInfo + (*Event)(nil), // 126: api.v1.Event + (*EventDatapointInfo)(nil), // 127: api.v1.EventDatapointInfo + (*EventDatapoint)(nil), // 128: api.v1.EventDatapoint + nil, // 129: api.v1.WorkloadItem.LabelsEntry + nil, // 130: api.v1.WorkloadItem.AnnotationsEntry + nil, // 131: api.v1.Node.LabelsEntry + nil, // 132: api.v1.Node.AnnotationsEntry + nil, // 133: api.v1.LabelSelector.MatchLabelsEntry + nil, // 134: api.v1.ResourceDetails.ServiceSelectorEntry + nil, // 135: api.v1.ResourceDetails.ScParametersEntry + nil, // 136: api.v1.ServiceDetails.SelectorEntry + nil, // 137: api.v1.ResourceRequirements.RequestsEntry + nil, // 138: api.v1.ResourceRequirements.LimitsEntry + nil, // 139: api.v1.PersistentVolumeDetails.CapacityEntry + nil, // 140: api.v1.PVVolumeSource.VolumeAttributesEntry + nil, // 141: api.v1.CSIVolumeSource.VolumeAttributesEntry + nil, // 142: api.v1.StorageClassDetails.ParametersEntry + nil, // 143: api.v1.NamespaceDetails.ConditionsEntry + nil, // 144: api.v1.NodeDetails.CapacityEntry + nil, // 145: api.v1.NodeDetails.AllocatableEntry + nil, // 146: api.v1.TopologySelectorTerm.MatchLabelsEntry + nil, // 147: api.v1.HPAMetricSelector.SelectorEntry + nil, // 148: api.v1.VPAContainerResourcePolicy.MinAllowedEntry + nil, // 149: api.v1.VPAContainerResourcePolicy.MaxAllowedEntry + nil, // 150: api.v1.VPAContainerRecommendation.TargetEntry + nil, // 151: api.v1.VPAContainerRecommendation.LowerBoundEntry + nil, // 152: api.v1.VPAContainerRecommendation.UpperBoundEntry + nil, // 153: api.v1.VPAContainerRecommendation.UncappedTargetEntry + nil, // 154: api.v1.LimitRangeItem.DefaultLimitsEntry + nil, // 155: api.v1.LimitRangeItem.DefaultRequestEntry + nil, // 156: api.v1.LimitRangeItem.MaxEntry + nil, // 157: api.v1.LimitRangeItem.MinEntry + nil, // 158: api.v1.LimitRangeItem.MaxLimitRequestRatioEntry + nil, // 159: api.v1.KedaScaledObjectTrigger.MetadataEntry + nil, // 160: api.v1.KarpenterResourceDetails.LimitsEntry + nil, // 161: api.v1.KarpenterCapacity.OtherEntry + nil, // 162: api.v1.PodDisruptionBudgetDetails.SelectorLabelsEntry + nil, // 163: api.v1.ResourceQuotaDetails.HardLimitsEntry + nil, // 164: api.v1.ResourceQuotaDetails.UsedEntry + nil, // 165: api.v1.ResourceQuotaDetails.ScopeSelectorEntry + (*timestamppb.Timestamp)(nil), // 166: google.protobuf.Timestamp + (*money.Money)(nil), // 167: google.type.Money } var file_api_v1_common_proto_depIdxs = []int32{ 0, // 0: api.v1.AuditLogEntry.workload_type:type_name -> api.v1.K8sObjectKind - 162, // 1: api.v1.AuditLogEntry.created_at:type_name -> google.protobuf.Timestamp - 162, // 2: api.v1.AuditLogEntry.updated_at:type_name -> google.protobuf.Timestamp + 166, // 1: api.v1.AuditLogEntry.created_at:type_name -> google.protobuf.Timestamp + 166, // 2: api.v1.AuditLogEntry.updated_at:type_name -> google.protobuf.Timestamp 1, // 3: api.v1.Pagination.order_by:type_name -> api.v1.OrderByEnum - 163, // 4: api.v1.CostInfo.node_recommendation_saved_cost_last_month:type_name -> google.type.Money - 163, // 5: api.v1.CostInfo.money_cpu_cost_per_hour:type_name -> google.type.Money - 163, // 6: api.v1.CostInfo.money_memory_cost_per_hour:type_name -> google.type.Money - 163, // 7: api.v1.CostInfo.money_total_cost_per_hour:type_name -> google.type.Money - 163, // 8: api.v1.CostInfo.money_total_cost_per_month:type_name -> google.type.Money - 163, // 9: api.v1.CostInfo.money_total_cost_per_year:type_name -> google.type.Money - 163, // 10: api.v1.CostInfo.money_optimized_cpu_cost_per_hour:type_name -> google.type.Money - 163, // 11: api.v1.CostInfo.money_optimized_memory_cost_per_hour:type_name -> google.type.Money - 163, // 12: api.v1.CostInfo.money_optimized_total_cost_per_hour:type_name -> google.type.Money - 163, // 13: api.v1.CostInfo.money_optimized_total_cost_per_month:type_name -> google.type.Money - 163, // 14: api.v1.CostInfo.money_optimized_total_cost_per_year:type_name -> google.type.Money - 163, // 15: api.v1.CostInfo.money_cpu_cost_for_time_period:type_name -> google.type.Money - 163, // 16: api.v1.CostInfo.money_memory_cost_for_time_period:type_name -> google.type.Money - 163, // 17: api.v1.CostInfo.money_total_cost_for_time_period:type_name -> google.type.Money - 163, // 18: api.v1.CostInfo.money_optimized_cpu_cost_for_time_period:type_name -> google.type.Money - 163, // 19: api.v1.CostInfo.money_optimized_memory_cost_for_time_period:type_name -> google.type.Money - 163, // 20: api.v1.CostInfo.money_optimized_total_cost_for_time_period:type_name -> google.type.Money - 163, // 21: api.v1.CostInfo.money_optimized_gpu_cost_for_time_period:type_name -> google.type.Money - 163, // 22: api.v1.CostInfo.money_gpu_cost_for_time_period:type_name -> google.type.Money - 163, // 23: api.v1.CostInfo.money_gpu_cost_per_hour:type_name -> google.type.Money - 163, // 24: api.v1.CostInfo.money_optimized_gpu_cost_per_hour:type_name -> google.type.Money - 163, // 25: api.v1.CostInfo.money_cpu_cost_per_vcpu_per_hour:type_name -> google.type.Money - 163, // 26: api.v1.CostInfo.money_memory_cost_per_gib_per_hour:type_name -> google.type.Money - 162, // 27: api.v1.ForecastResourceMetrics.timestamp:type_name -> google.protobuf.Timestamp + 167, // 4: api.v1.CostInfo.node_recommendation_saved_cost_last_month:type_name -> google.type.Money + 167, // 5: api.v1.CostInfo.money_cpu_cost_per_hour:type_name -> google.type.Money + 167, // 6: api.v1.CostInfo.money_memory_cost_per_hour:type_name -> google.type.Money + 167, // 7: api.v1.CostInfo.money_total_cost_per_hour:type_name -> google.type.Money + 167, // 8: api.v1.CostInfo.money_total_cost_per_month:type_name -> google.type.Money + 167, // 9: api.v1.CostInfo.money_total_cost_per_year:type_name -> google.type.Money + 167, // 10: api.v1.CostInfo.money_optimized_cpu_cost_per_hour:type_name -> google.type.Money + 167, // 11: api.v1.CostInfo.money_optimized_memory_cost_per_hour:type_name -> google.type.Money + 167, // 12: api.v1.CostInfo.money_optimized_total_cost_per_hour:type_name -> google.type.Money + 167, // 13: api.v1.CostInfo.money_optimized_total_cost_per_month:type_name -> google.type.Money + 167, // 14: api.v1.CostInfo.money_optimized_total_cost_per_year:type_name -> google.type.Money + 167, // 15: api.v1.CostInfo.money_cpu_cost_for_time_period:type_name -> google.type.Money + 167, // 16: api.v1.CostInfo.money_memory_cost_for_time_period:type_name -> google.type.Money + 167, // 17: api.v1.CostInfo.money_total_cost_for_time_period:type_name -> google.type.Money + 167, // 18: api.v1.CostInfo.money_optimized_cpu_cost_for_time_period:type_name -> google.type.Money + 167, // 19: api.v1.CostInfo.money_optimized_memory_cost_for_time_period:type_name -> google.type.Money + 167, // 20: api.v1.CostInfo.money_optimized_total_cost_for_time_period:type_name -> google.type.Money + 167, // 21: api.v1.CostInfo.money_optimized_gpu_cost_for_time_period:type_name -> google.type.Money + 167, // 22: api.v1.CostInfo.money_gpu_cost_for_time_period:type_name -> google.type.Money + 167, // 23: api.v1.CostInfo.money_gpu_cost_per_hour:type_name -> google.type.Money + 167, // 24: api.v1.CostInfo.money_optimized_gpu_cost_per_hour:type_name -> google.type.Money + 167, // 25: api.v1.CostInfo.money_cpu_cost_per_vcpu_per_hour:type_name -> google.type.Money + 167, // 26: api.v1.CostInfo.money_memory_cost_per_gib_per_hour:type_name -> google.type.Money + 166, // 27: api.v1.ForecastResourceMetrics.timestamp:type_name -> google.protobuf.Timestamp 10, // 28: api.v1.WorkloadItem.children:type_name -> api.v1.WorkloadItem - 125, // 29: api.v1.WorkloadItem.labels:type_name -> api.v1.WorkloadItem.LabelsEntry - 126, // 30: api.v1.WorkloadItem.annotations:type_name -> api.v1.WorkloadItem.AnnotationsEntry + 129, // 29: api.v1.WorkloadItem.labels:type_name -> api.v1.WorkloadItem.LabelsEntry + 130, // 30: api.v1.WorkloadItem.annotations:type_name -> api.v1.WorkloadItem.AnnotationsEntry 7, // 31: api.v1.WorkloadItem.resource_metrics:type_name -> api.v1.ResourceMetrics 6, // 32: api.v1.WorkloadItem.cost_info:type_name -> api.v1.CostInfo 17, // 33: api.v1.WorkloadItem.cost_data_points:type_name -> api.v1.CostDataPoint 18, // 34: api.v1.WorkloadItem.resource_data_points:type_name -> api.v1.ResourceDataPoint - 162, // 35: api.v1.WorkloadItem.created_at:type_name -> google.protobuf.Timestamp - 162, // 36: api.v1.WorkloadItem.deleted_at:type_name -> google.protobuf.Timestamp + 166, // 35: api.v1.WorkloadItem.created_at:type_name -> google.protobuf.Timestamp + 166, // 36: api.v1.WorkloadItem.deleted_at:type_name -> google.protobuf.Timestamp 26, // 37: api.v1.WorkloadItem.resource_details:type_name -> api.v1.ResourceDetails 7, // 38: api.v1.Node.resource_metrics:type_name -> api.v1.ResourceMetrics 6, // 39: api.v1.Node.cost_info:type_name -> api.v1.CostInfo 11, // 40: api.v1.Node.container_runtime:type_name -> api.v1.ContainerRuntimeInfo 26, // 41: api.v1.Node.resource_details:type_name -> api.v1.ResourceDetails 10, // 42: api.v1.Node.children:type_name -> api.v1.WorkloadItem - 127, // 43: api.v1.Node.labels:type_name -> api.v1.Node.LabelsEntry - 128, // 44: api.v1.Node.annotations:type_name -> api.v1.Node.AnnotationsEntry - 163, // 45: api.v1.Node.money_price_per_hour:type_name -> google.type.Money - 163, // 46: api.v1.Node.money_eff_period_total_cost:type_name -> google.type.Money - 163, // 47: api.v1.Node.money_price_per_vcpu:type_name -> google.type.Money - 163, // 48: api.v1.Node.money_price_per_gib:type_name -> google.type.Money - 163, // 49: api.v1.Node.money_price_per_gpu:type_name -> google.type.Money - 163, // 50: api.v1.Node.money_cpu_price:type_name -> google.type.Money - 163, // 51: api.v1.Node.money_memory_price:type_name -> google.type.Money - 163, // 52: api.v1.Node.money_gpu_price:type_name -> google.type.Money + 131, // 43: api.v1.Node.labels:type_name -> api.v1.Node.LabelsEntry + 132, // 44: api.v1.Node.annotations:type_name -> api.v1.Node.AnnotationsEntry + 167, // 45: api.v1.Node.money_price_per_hour:type_name -> google.type.Money + 167, // 46: api.v1.Node.money_eff_period_total_cost:type_name -> google.type.Money + 167, // 47: api.v1.Node.money_price_per_vcpu:type_name -> google.type.Money + 167, // 48: api.v1.Node.money_price_per_gib:type_name -> google.type.Money + 167, // 49: api.v1.Node.money_price_per_gpu:type_name -> google.type.Money + 167, // 50: api.v1.Node.money_cpu_price:type_name -> google.type.Money + 167, // 51: api.v1.Node.money_memory_price:type_name -> google.type.Money + 167, // 52: api.v1.Node.money_gpu_price:type_name -> google.type.Money 15, // 53: api.v1.Node.volumes_attached:type_name -> api.v1.AttachedVolume - 162, // 54: api.v1.Node.last_seen:type_name -> google.protobuf.Timestamp - 162, // 55: api.v1.Node.collected_at:type_name -> google.protobuf.Timestamp - 162, // 56: api.v1.Node.deletion_timestamp:type_name -> google.protobuf.Timestamp + 166, // 54: api.v1.Node.last_seen:type_name -> google.protobuf.Timestamp + 166, // 55: api.v1.Node.collected_at:type_name -> google.protobuf.Timestamp + 166, // 56: api.v1.Node.deletion_timestamp:type_name -> google.protobuf.Timestamp 14, // 57: api.v1.NodeGroup.nodes:type_name -> api.v1.Node 7, // 58: api.v1.NodeGroup.resource_metrics:type_name -> api.v1.ResourceMetrics 6, // 59: api.v1.NodeGroup.cost_info:type_name -> api.v1.CostInfo @@ -15726,7 +16189,7 @@ var file_api_v1_common_proto_depIdxs = []int32{ 20, // 67: api.v1.SavingsTimeSeries.savings_datapoints:type_name -> api.v1.SavingsDataPoint 2, // 68: api.v1.LabelSelectorRequirement.operator:type_name -> api.v1.LabelSelectorOperator 23, // 69: api.v1.LabelSelector.labels:type_name -> api.v1.Label - 129, // 70: api.v1.LabelSelector.match_labels:type_name -> api.v1.LabelSelector.MatchLabelsEntry + 133, // 70: api.v1.LabelSelector.match_labels:type_name -> api.v1.LabelSelector.MatchLabelsEntry 22, // 71: api.v1.LabelSelector.match_expressions:type_name -> api.v1.LabelSelectorRequirement 27, // 72: api.v1.ResourceDetails.pod_details:type_name -> api.v1.PodDetails 29, // 73: api.v1.ResourceDetails.deployment_details:type_name -> api.v1.DeploymentDetails @@ -15753,148 +16216,153 @@ var file_api_v1_common_proto_depIdxs = []int32{ 115, // 94: api.v1.ResourceDetails.pod_disruption_budget_details:type_name -> api.v1.PodDisruptionBudgetDetails 117, // 95: api.v1.ResourceDetails.resource_quota_details:type_name -> api.v1.ResourceQuotaDetails 119, // 96: api.v1.ResourceDetails.volcano_job_details:type_name -> api.v1.VolcanoJobDetails - 42, // 97: api.v1.ResourceDetails.service_ports:type_name -> api.v1.ServicePort - 130, // 98: api.v1.ResourceDetails.service_selector:type_name -> api.v1.ResourceDetails.ServiceSelectorEntry - 131, // 99: api.v1.ResourceDetails.sc_parameters:type_name -> api.v1.ResourceDetails.ScParametersEntry - 62, // 100: api.v1.ResourceDetails.node_taints:type_name -> api.v1.NodeTaint - 28, // 101: api.v1.PodDetails.containers:type_name -> api.v1.ContainerSummary - 30, // 102: api.v1.DeploymentDetails.containers:type_name -> api.v1.ContainerTemplate - 31, // 103: api.v1.DeploymentDetails.conditions:type_name -> api.v1.DeploymentCondition - 30, // 104: api.v1.StatefulSetDetails.containers:type_name -> api.v1.ContainerTemplate - 33, // 105: api.v1.StatefulSetDetails.volume_claim_templates:type_name -> api.v1.VolumeClaimTemplate - 30, // 106: api.v1.DaemonSetDetails.containers:type_name -> api.v1.ContainerTemplate - 69, // 107: api.v1.DaemonSetDetails.tolerations:type_name -> api.v1.TolerationInfo - 70, // 108: api.v1.DaemonSetDetails.node_selector:type_name -> api.v1.NodeSelector - 30, // 109: api.v1.ReplicaSetDetails.containers:type_name -> api.v1.ContainerTemplate - 24, // 110: api.v1.ReplicaSetDetails.selector:type_name -> api.v1.LabelSelector - 30, // 111: api.v1.JobDetails.containers:type_name -> api.v1.ContainerTemplate - 37, // 112: api.v1.JobDetails.conditions:type_name -> api.v1.JobCondition - 24, // 113: api.v1.JobDetails.selector:type_name -> api.v1.LabelSelector - 30, // 114: api.v1.CronJobDetails.containers:type_name -> api.v1.ContainerTemplate - 39, // 115: api.v1.CronJobDetails.active_jobs:type_name -> api.v1.ActiveJobReference - 40, // 116: api.v1.CronJobDetails.job_template:type_name -> api.v1.JobTemplate - 30, // 117: api.v1.JobTemplate.containers:type_name -> api.v1.ContainerTemplate - 42, // 118: api.v1.ServiceDetails.ports:type_name -> api.v1.ServicePort - 132, // 119: api.v1.ServiceDetails.selector:type_name -> api.v1.ServiceDetails.SelectorEntry - 43, // 120: api.v1.ServiceDetails.load_balancer_ingress:type_name -> api.v1.LoadBalancerIngress - 45, // 121: api.v1.IngressDetails.rules:type_name -> api.v1.IngressRule - 48, // 122: api.v1.IngressDetails.tls:type_name -> api.v1.IngressTLS - 47, // 123: api.v1.IngressDetails.default_backend:type_name -> api.v1.IngressBackend - 43, // 124: api.v1.IngressDetails.load_balancer_ingress:type_name -> api.v1.LoadBalancerIngress - 46, // 125: api.v1.IngressRule.paths:type_name -> api.v1.IngressPath - 47, // 126: api.v1.IngressPath.backend:type_name -> api.v1.IngressBackend - 50, // 127: api.v1.PersistentVolumeClaimDetails.resource_requirements:type_name -> api.v1.ResourceRequirements - 24, // 128: api.v1.PersistentVolumeClaimDetails.selector:type_name -> api.v1.LabelSelector - 51, // 129: api.v1.PersistentVolumeClaimDetails.volume_node_affinity:type_name -> api.v1.VolumeNodeAffinity - 52, // 130: api.v1.PersistentVolumeClaimDetails.conditions:type_name -> api.v1.PVCCondition - 133, // 131: api.v1.ResourceRequirements.requests:type_name -> api.v1.ResourceRequirements.RequestsEntry - 134, // 132: api.v1.ResourceRequirements.limits:type_name -> api.v1.ResourceRequirements.LimitsEntry - 72, // 133: api.v1.VolumeNodeAffinity.required:type_name -> api.v1.NodeSelectorRequirement - 72, // 134: api.v1.VolumeNodeAffinity.preferred:type_name -> api.v1.NodeSelectorRequirement - 135, // 135: api.v1.PersistentVolumeDetails.capacity:type_name -> api.v1.PersistentVolumeDetails.CapacityEntry - 54, // 136: api.v1.PersistentVolumeDetails.claim_ref:type_name -> api.v1.PVClaimReference - 55, // 137: api.v1.PersistentVolumeDetails.volume_source:type_name -> api.v1.PVVolumeSource - 70, // 138: api.v1.PersistentVolumeDetails.node_affinity:type_name -> api.v1.NodeSelector - 56, // 139: api.v1.PVVolumeSource.csi:type_name -> api.v1.CSIVolumeSource - 57, // 140: api.v1.PVVolumeSource.host_path:type_name -> api.v1.HostPathVolumeSource - 58, // 141: api.v1.PVVolumeSource.nfs:type_name -> api.v1.NFSVolumeSource - 136, // 142: api.v1.PVVolumeSource.volume_attributes:type_name -> api.v1.PVVolumeSource.VolumeAttributesEntry - 137, // 143: api.v1.CSIVolumeSource.volume_attributes:type_name -> api.v1.CSIVolumeSource.VolumeAttributesEntry - 138, // 144: api.v1.StorageClassDetails.parameters:type_name -> api.v1.StorageClassDetails.ParametersEntry - 67, // 145: api.v1.StorageClassDetails.allowed_topologies:type_name -> api.v1.TopologySelector - 139, // 146: api.v1.NamespaceDetails.conditions:type_name -> api.v1.NamespaceDetails.ConditionsEntry - 63, // 147: api.v1.NodeDetails.addresses:type_name -> api.v1.NodeAddress - 64, // 148: api.v1.NodeDetails.conditions:type_name -> api.v1.NodeCondition - 65, // 149: api.v1.NodeDetails.system_info:type_name -> api.v1.NodeSystemInfo - 140, // 150: api.v1.NodeDetails.capacity:type_name -> api.v1.NodeDetails.CapacityEntry - 141, // 151: api.v1.NodeDetails.allocatable:type_name -> api.v1.NodeDetails.AllocatableEntry - 66, // 152: api.v1.NodeDetails.images:type_name -> api.v1.NodeImage - 68, // 153: api.v1.TopologySelector.match_label_expressions:type_name -> api.v1.TopologySelectorTerm - 142, // 154: api.v1.TopologySelectorTerm.match_labels:type_name -> api.v1.TopologySelectorTerm.MatchLabelsEntry - 71, // 155: api.v1.NodeSelector.terms:type_name -> api.v1.NodeSelectorTerm - 72, // 156: api.v1.NodeSelectorTerm.match_expressions:type_name -> api.v1.NodeSelectorRequirement - 72, // 157: api.v1.NodeSelectorTerm.match_fields:type_name -> api.v1.NodeSelectorRequirement - 74, // 158: api.v1.HPADetails.scale_target_ref:type_name -> api.v1.ScaleTargetRef - 75, // 159: api.v1.HPADetails.metrics:type_name -> api.v1.HPAMetric - 87, // 160: api.v1.HPADetails.conditions:type_name -> api.v1.HPACondition - 88, // 161: api.v1.HPADetails.behavior:type_name -> api.v1.HPABehavior - 82, // 162: api.v1.HPADetails.current_metrics:type_name -> api.v1.HPACurrentMetric - 76, // 163: api.v1.HPAMetric.resource:type_name -> api.v1.HPAResourceMetric - 77, // 164: api.v1.HPAMetric.pods:type_name -> api.v1.HPAPodsMetric - 78, // 165: api.v1.HPAMetric.object:type_name -> api.v1.HPAObjectMetric - 79, // 166: api.v1.HPAMetric.external:type_name -> api.v1.HPAExternalMetric - 80, // 167: api.v1.HPAPodsMetric.metric:type_name -> api.v1.HPAMetricSelector - 81, // 168: api.v1.HPAObjectMetric.described_object:type_name -> api.v1.HPAObjectReference - 80, // 169: api.v1.HPAObjectMetric.metric:type_name -> api.v1.HPAMetricSelector - 80, // 170: api.v1.HPAExternalMetric.metric:type_name -> api.v1.HPAMetricSelector - 143, // 171: api.v1.HPAMetricSelector.selector:type_name -> api.v1.HPAMetricSelector.SelectorEntry - 83, // 172: api.v1.HPACurrentMetric.resource:type_name -> api.v1.HPACurrentResourceMetric - 84, // 173: api.v1.HPACurrentMetric.pods:type_name -> api.v1.HPACurrentPodsMetric - 85, // 174: api.v1.HPACurrentMetric.object:type_name -> api.v1.HPACurrentObjectMetric - 86, // 175: api.v1.HPACurrentMetric.external:type_name -> api.v1.HPACurrentExternalMetric - 80, // 176: api.v1.HPACurrentPodsMetric.metric:type_name -> api.v1.HPAMetricSelector - 81, // 177: api.v1.HPACurrentObjectMetric.described_object:type_name -> api.v1.HPAObjectReference - 80, // 178: api.v1.HPACurrentObjectMetric.metric:type_name -> api.v1.HPAMetricSelector - 80, // 179: api.v1.HPACurrentExternalMetric.metric:type_name -> api.v1.HPAMetricSelector - 89, // 180: api.v1.HPABehavior.scale_up:type_name -> api.v1.HPAScalingRules - 89, // 181: api.v1.HPABehavior.scale_down:type_name -> api.v1.HPAScalingRules - 90, // 182: api.v1.HPAScalingRules.policies:type_name -> api.v1.HPAScalingPolicy - 92, // 183: api.v1.VPADetails.target_ref:type_name -> api.v1.VPATargetRef - 93, // 184: api.v1.VPADetails.update_policy:type_name -> api.v1.VPAUpdatePolicy - 94, // 185: api.v1.VPADetails.resource_policy:type_name -> api.v1.VPAResourcePolicy - 96, // 186: api.v1.VPADetails.recommendation:type_name -> api.v1.VPARecommendation - 98, // 187: api.v1.VPADetails.conditions:type_name -> api.v1.VPACondition - 95, // 188: api.v1.VPAResourcePolicy.container_policies:type_name -> api.v1.VPAContainerResourcePolicy - 144, // 189: api.v1.VPAContainerResourcePolicy.min_allowed:type_name -> api.v1.VPAContainerResourcePolicy.MinAllowedEntry - 145, // 190: api.v1.VPAContainerResourcePolicy.max_allowed:type_name -> api.v1.VPAContainerResourcePolicy.MaxAllowedEntry - 97, // 191: api.v1.VPARecommendation.container_recommendations:type_name -> api.v1.VPAContainerRecommendation - 146, // 192: api.v1.VPAContainerRecommendation.target:type_name -> api.v1.VPAContainerRecommendation.TargetEntry - 147, // 193: api.v1.VPAContainerRecommendation.lower_bound:type_name -> api.v1.VPAContainerRecommendation.LowerBoundEntry - 148, // 194: api.v1.VPAContainerRecommendation.upper_bound:type_name -> api.v1.VPAContainerRecommendation.UpperBoundEntry - 149, // 195: api.v1.VPAContainerRecommendation.uncapped_target:type_name -> api.v1.VPAContainerRecommendation.UncappedTargetEntry - 100, // 196: api.v1.LimitRangeDetails.limits:type_name -> api.v1.LimitRangeItem - 150, // 197: api.v1.LimitRangeItem.default_limits:type_name -> api.v1.LimitRangeItem.DefaultLimitsEntry - 151, // 198: api.v1.LimitRangeItem.default_request:type_name -> api.v1.LimitRangeItem.DefaultRequestEntry - 152, // 199: api.v1.LimitRangeItem.max:type_name -> api.v1.LimitRangeItem.MaxEntry - 153, // 200: api.v1.LimitRangeItem.min:type_name -> api.v1.LimitRangeItem.MinEntry - 154, // 201: api.v1.LimitRangeItem.max_limit_request_ratio:type_name -> api.v1.LimitRangeItem.MaxLimitRequestRatioEntry - 103, // 202: api.v1.RoleDetails.rules:type_name -> api.v1.RoleRule - 105, // 203: api.v1.RoleBindingDetails.subjects:type_name -> api.v1.RoleBindingSubject - 106, // 204: api.v1.RoleBindingDetails.role_ref:type_name -> api.v1.RoleReference - 108, // 205: api.v1.KedaScaledObjectDetails.triggers:type_name -> api.v1.KedaScaledObjectTrigger - 109, // 206: api.v1.KedaScaledObjectDetails.conditions:type_name -> api.v1.KedaScaledObjectCondition - 155, // 207: api.v1.KedaScaledObjectTrigger.metadata:type_name -> api.v1.KedaScaledObjectTrigger.MetadataEntry - 111, // 208: api.v1.KarpenterResourceDetails.conditions:type_name -> api.v1.KarpenterResourceCondition - 112, // 209: api.v1.KarpenterResourceDetails.capacity:type_name -> api.v1.KarpenterCapacity - 113, // 210: api.v1.KarpenterResourceDetails.requirements:type_name -> api.v1.KarpenterRequirement - 156, // 211: api.v1.KarpenterResourceDetails.limits:type_name -> api.v1.KarpenterResourceDetails.LimitsEntry - 157, // 212: api.v1.KarpenterCapacity.other:type_name -> api.v1.KarpenterCapacity.OtherEntry - 24, // 213: api.v1.WorkloadFilters.namespace_selector:type_name -> api.v1.LabelSelector - 24, // 214: api.v1.WorkloadFilters.workload_selector:type_name -> api.v1.LabelSelector - 0, // 215: api.v1.WorkloadFilters.kind_filter:type_name -> api.v1.K8sObjectKind - 25, // 216: api.v1.WorkloadFilters.name_pattern:type_name -> api.v1.RegexPattern - 24, // 217: api.v1.WorkloadFilters.annotation_selector:type_name -> api.v1.LabelSelector - 3, // 218: api.v1.WorkloadFilters.status:type_name -> api.v1.WorkloadStatusFilter - 158, // 219: api.v1.PodDisruptionBudgetDetails.selector_labels:type_name -> api.v1.PodDisruptionBudgetDetails.SelectorLabelsEntry - 116, // 220: api.v1.PodDisruptionBudgetDetails.conditions:type_name -> api.v1.PodDisruptionBudgetCondition - 159, // 221: api.v1.ResourceQuotaDetails.hard_limits:type_name -> api.v1.ResourceQuotaDetails.HardLimitsEntry - 160, // 222: api.v1.ResourceQuotaDetails.used:type_name -> api.v1.ResourceQuotaDetails.UsedEntry - 161, // 223: api.v1.ResourceQuotaDetails.scope_selector:type_name -> api.v1.ResourceQuotaDetails.ScopeSelectorEntry - 118, // 224: api.v1.ResourceQuotaDetails.conditions:type_name -> api.v1.ResourceQuotaCondition - 30, // 225: api.v1.VolcanoJobDetails.containers:type_name -> api.v1.ContainerTemplate - 120, // 226: api.v1.VolcanoJobDetails.conditions:type_name -> api.v1.VolcanoJobCondition - 121, // 227: api.v1.VolcanoJobDetails.tasks:type_name -> api.v1.VolcanoTask - 30, // 228: api.v1.VolcanoTask.containers:type_name -> api.v1.ContainerTemplate - 162, // 229: api.v1.Event.created_at:type_name -> google.protobuf.Timestamp - 162, // 230: api.v1.Event.updated_at:type_name -> google.protobuf.Timestamp - 162, // 231: api.v1.Event.last_seen:type_name -> google.protobuf.Timestamp - 162, // 232: api.v1.Event.deleted_at:type_name -> google.protobuf.Timestamp - 123, // 233: api.v1.EventDatapoint.events:type_name -> api.v1.EventDatapointInfo - 234, // [234:234] is the sub-list for method output_type - 234, // [234:234] is the sub-list for method input_type - 234, // [234:234] is the sub-list for extension type_name - 234, // [234:234] is the sub-list for extension extendee - 0, // [0:234] is the sub-list for field type_name + 122, // 97: api.v1.ResourceDetails.spark_application_details:type_name -> api.v1.SparkApplicationDetails + 42, // 98: api.v1.ResourceDetails.service_ports:type_name -> api.v1.ServicePort + 134, // 99: api.v1.ResourceDetails.service_selector:type_name -> api.v1.ResourceDetails.ServiceSelectorEntry + 135, // 100: api.v1.ResourceDetails.sc_parameters:type_name -> api.v1.ResourceDetails.ScParametersEntry + 62, // 101: api.v1.ResourceDetails.node_taints:type_name -> api.v1.NodeTaint + 28, // 102: api.v1.PodDetails.containers:type_name -> api.v1.ContainerSummary + 30, // 103: api.v1.DeploymentDetails.containers:type_name -> api.v1.ContainerTemplate + 31, // 104: api.v1.DeploymentDetails.conditions:type_name -> api.v1.DeploymentCondition + 30, // 105: api.v1.StatefulSetDetails.containers:type_name -> api.v1.ContainerTemplate + 33, // 106: api.v1.StatefulSetDetails.volume_claim_templates:type_name -> api.v1.VolumeClaimTemplate + 30, // 107: api.v1.DaemonSetDetails.containers:type_name -> api.v1.ContainerTemplate + 69, // 108: api.v1.DaemonSetDetails.tolerations:type_name -> api.v1.TolerationInfo + 70, // 109: api.v1.DaemonSetDetails.node_selector:type_name -> api.v1.NodeSelector + 30, // 110: api.v1.ReplicaSetDetails.containers:type_name -> api.v1.ContainerTemplate + 24, // 111: api.v1.ReplicaSetDetails.selector:type_name -> api.v1.LabelSelector + 30, // 112: api.v1.JobDetails.containers:type_name -> api.v1.ContainerTemplate + 37, // 113: api.v1.JobDetails.conditions:type_name -> api.v1.JobCondition + 24, // 114: api.v1.JobDetails.selector:type_name -> api.v1.LabelSelector + 30, // 115: api.v1.CronJobDetails.containers:type_name -> api.v1.ContainerTemplate + 39, // 116: api.v1.CronJobDetails.active_jobs:type_name -> api.v1.ActiveJobReference + 40, // 117: api.v1.CronJobDetails.job_template:type_name -> api.v1.JobTemplate + 30, // 118: api.v1.JobTemplate.containers:type_name -> api.v1.ContainerTemplate + 42, // 119: api.v1.ServiceDetails.ports:type_name -> api.v1.ServicePort + 136, // 120: api.v1.ServiceDetails.selector:type_name -> api.v1.ServiceDetails.SelectorEntry + 43, // 121: api.v1.ServiceDetails.load_balancer_ingress:type_name -> api.v1.LoadBalancerIngress + 45, // 122: api.v1.IngressDetails.rules:type_name -> api.v1.IngressRule + 48, // 123: api.v1.IngressDetails.tls:type_name -> api.v1.IngressTLS + 47, // 124: api.v1.IngressDetails.default_backend:type_name -> api.v1.IngressBackend + 43, // 125: api.v1.IngressDetails.load_balancer_ingress:type_name -> api.v1.LoadBalancerIngress + 46, // 126: api.v1.IngressRule.paths:type_name -> api.v1.IngressPath + 47, // 127: api.v1.IngressPath.backend:type_name -> api.v1.IngressBackend + 50, // 128: api.v1.PersistentVolumeClaimDetails.resource_requirements:type_name -> api.v1.ResourceRequirements + 24, // 129: api.v1.PersistentVolumeClaimDetails.selector:type_name -> api.v1.LabelSelector + 51, // 130: api.v1.PersistentVolumeClaimDetails.volume_node_affinity:type_name -> api.v1.VolumeNodeAffinity + 52, // 131: api.v1.PersistentVolumeClaimDetails.conditions:type_name -> api.v1.PVCCondition + 137, // 132: api.v1.ResourceRequirements.requests:type_name -> api.v1.ResourceRequirements.RequestsEntry + 138, // 133: api.v1.ResourceRequirements.limits:type_name -> api.v1.ResourceRequirements.LimitsEntry + 72, // 134: api.v1.VolumeNodeAffinity.required:type_name -> api.v1.NodeSelectorRequirement + 72, // 135: api.v1.VolumeNodeAffinity.preferred:type_name -> api.v1.NodeSelectorRequirement + 139, // 136: api.v1.PersistentVolumeDetails.capacity:type_name -> api.v1.PersistentVolumeDetails.CapacityEntry + 54, // 137: api.v1.PersistentVolumeDetails.claim_ref:type_name -> api.v1.PVClaimReference + 55, // 138: api.v1.PersistentVolumeDetails.volume_source:type_name -> api.v1.PVVolumeSource + 70, // 139: api.v1.PersistentVolumeDetails.node_affinity:type_name -> api.v1.NodeSelector + 56, // 140: api.v1.PVVolumeSource.csi:type_name -> api.v1.CSIVolumeSource + 57, // 141: api.v1.PVVolumeSource.host_path:type_name -> api.v1.HostPathVolumeSource + 58, // 142: api.v1.PVVolumeSource.nfs:type_name -> api.v1.NFSVolumeSource + 140, // 143: api.v1.PVVolumeSource.volume_attributes:type_name -> api.v1.PVVolumeSource.VolumeAttributesEntry + 141, // 144: api.v1.CSIVolumeSource.volume_attributes:type_name -> api.v1.CSIVolumeSource.VolumeAttributesEntry + 142, // 145: api.v1.StorageClassDetails.parameters:type_name -> api.v1.StorageClassDetails.ParametersEntry + 67, // 146: api.v1.StorageClassDetails.allowed_topologies:type_name -> api.v1.TopologySelector + 143, // 147: api.v1.NamespaceDetails.conditions:type_name -> api.v1.NamespaceDetails.ConditionsEntry + 63, // 148: api.v1.NodeDetails.addresses:type_name -> api.v1.NodeAddress + 64, // 149: api.v1.NodeDetails.conditions:type_name -> api.v1.NodeCondition + 65, // 150: api.v1.NodeDetails.system_info:type_name -> api.v1.NodeSystemInfo + 144, // 151: api.v1.NodeDetails.capacity:type_name -> api.v1.NodeDetails.CapacityEntry + 145, // 152: api.v1.NodeDetails.allocatable:type_name -> api.v1.NodeDetails.AllocatableEntry + 66, // 153: api.v1.NodeDetails.images:type_name -> api.v1.NodeImage + 68, // 154: api.v1.TopologySelector.match_label_expressions:type_name -> api.v1.TopologySelectorTerm + 146, // 155: api.v1.TopologySelectorTerm.match_labels:type_name -> api.v1.TopologySelectorTerm.MatchLabelsEntry + 71, // 156: api.v1.NodeSelector.terms:type_name -> api.v1.NodeSelectorTerm + 72, // 157: api.v1.NodeSelectorTerm.match_expressions:type_name -> api.v1.NodeSelectorRequirement + 72, // 158: api.v1.NodeSelectorTerm.match_fields:type_name -> api.v1.NodeSelectorRequirement + 74, // 159: api.v1.HPADetails.scale_target_ref:type_name -> api.v1.ScaleTargetRef + 75, // 160: api.v1.HPADetails.metrics:type_name -> api.v1.HPAMetric + 87, // 161: api.v1.HPADetails.conditions:type_name -> api.v1.HPACondition + 88, // 162: api.v1.HPADetails.behavior:type_name -> api.v1.HPABehavior + 82, // 163: api.v1.HPADetails.current_metrics:type_name -> api.v1.HPACurrentMetric + 76, // 164: api.v1.HPAMetric.resource:type_name -> api.v1.HPAResourceMetric + 77, // 165: api.v1.HPAMetric.pods:type_name -> api.v1.HPAPodsMetric + 78, // 166: api.v1.HPAMetric.object:type_name -> api.v1.HPAObjectMetric + 79, // 167: api.v1.HPAMetric.external:type_name -> api.v1.HPAExternalMetric + 80, // 168: api.v1.HPAPodsMetric.metric:type_name -> api.v1.HPAMetricSelector + 81, // 169: api.v1.HPAObjectMetric.described_object:type_name -> api.v1.HPAObjectReference + 80, // 170: api.v1.HPAObjectMetric.metric:type_name -> api.v1.HPAMetricSelector + 80, // 171: api.v1.HPAExternalMetric.metric:type_name -> api.v1.HPAMetricSelector + 147, // 172: api.v1.HPAMetricSelector.selector:type_name -> api.v1.HPAMetricSelector.SelectorEntry + 83, // 173: api.v1.HPACurrentMetric.resource:type_name -> api.v1.HPACurrentResourceMetric + 84, // 174: api.v1.HPACurrentMetric.pods:type_name -> api.v1.HPACurrentPodsMetric + 85, // 175: api.v1.HPACurrentMetric.object:type_name -> api.v1.HPACurrentObjectMetric + 86, // 176: api.v1.HPACurrentMetric.external:type_name -> api.v1.HPACurrentExternalMetric + 80, // 177: api.v1.HPACurrentPodsMetric.metric:type_name -> api.v1.HPAMetricSelector + 81, // 178: api.v1.HPACurrentObjectMetric.described_object:type_name -> api.v1.HPAObjectReference + 80, // 179: api.v1.HPACurrentObjectMetric.metric:type_name -> api.v1.HPAMetricSelector + 80, // 180: api.v1.HPACurrentExternalMetric.metric:type_name -> api.v1.HPAMetricSelector + 89, // 181: api.v1.HPABehavior.scale_up:type_name -> api.v1.HPAScalingRules + 89, // 182: api.v1.HPABehavior.scale_down:type_name -> api.v1.HPAScalingRules + 90, // 183: api.v1.HPAScalingRules.policies:type_name -> api.v1.HPAScalingPolicy + 92, // 184: api.v1.VPADetails.target_ref:type_name -> api.v1.VPATargetRef + 93, // 185: api.v1.VPADetails.update_policy:type_name -> api.v1.VPAUpdatePolicy + 94, // 186: api.v1.VPADetails.resource_policy:type_name -> api.v1.VPAResourcePolicy + 96, // 187: api.v1.VPADetails.recommendation:type_name -> api.v1.VPARecommendation + 98, // 188: api.v1.VPADetails.conditions:type_name -> api.v1.VPACondition + 95, // 189: api.v1.VPAResourcePolicy.container_policies:type_name -> api.v1.VPAContainerResourcePolicy + 148, // 190: api.v1.VPAContainerResourcePolicy.min_allowed:type_name -> api.v1.VPAContainerResourcePolicy.MinAllowedEntry + 149, // 191: api.v1.VPAContainerResourcePolicy.max_allowed:type_name -> api.v1.VPAContainerResourcePolicy.MaxAllowedEntry + 97, // 192: api.v1.VPARecommendation.container_recommendations:type_name -> api.v1.VPAContainerRecommendation + 150, // 193: api.v1.VPAContainerRecommendation.target:type_name -> api.v1.VPAContainerRecommendation.TargetEntry + 151, // 194: api.v1.VPAContainerRecommendation.lower_bound:type_name -> api.v1.VPAContainerRecommendation.LowerBoundEntry + 152, // 195: api.v1.VPAContainerRecommendation.upper_bound:type_name -> api.v1.VPAContainerRecommendation.UpperBoundEntry + 153, // 196: api.v1.VPAContainerRecommendation.uncapped_target:type_name -> api.v1.VPAContainerRecommendation.UncappedTargetEntry + 100, // 197: api.v1.LimitRangeDetails.limits:type_name -> api.v1.LimitRangeItem + 154, // 198: api.v1.LimitRangeItem.default_limits:type_name -> api.v1.LimitRangeItem.DefaultLimitsEntry + 155, // 199: api.v1.LimitRangeItem.default_request:type_name -> api.v1.LimitRangeItem.DefaultRequestEntry + 156, // 200: api.v1.LimitRangeItem.max:type_name -> api.v1.LimitRangeItem.MaxEntry + 157, // 201: api.v1.LimitRangeItem.min:type_name -> api.v1.LimitRangeItem.MinEntry + 158, // 202: api.v1.LimitRangeItem.max_limit_request_ratio:type_name -> api.v1.LimitRangeItem.MaxLimitRequestRatioEntry + 103, // 203: api.v1.RoleDetails.rules:type_name -> api.v1.RoleRule + 105, // 204: api.v1.RoleBindingDetails.subjects:type_name -> api.v1.RoleBindingSubject + 106, // 205: api.v1.RoleBindingDetails.role_ref:type_name -> api.v1.RoleReference + 108, // 206: api.v1.KedaScaledObjectDetails.triggers:type_name -> api.v1.KedaScaledObjectTrigger + 109, // 207: api.v1.KedaScaledObjectDetails.conditions:type_name -> api.v1.KedaScaledObjectCondition + 159, // 208: api.v1.KedaScaledObjectTrigger.metadata:type_name -> api.v1.KedaScaledObjectTrigger.MetadataEntry + 111, // 209: api.v1.KarpenterResourceDetails.conditions:type_name -> api.v1.KarpenterResourceCondition + 112, // 210: api.v1.KarpenterResourceDetails.capacity:type_name -> api.v1.KarpenterCapacity + 113, // 211: api.v1.KarpenterResourceDetails.requirements:type_name -> api.v1.KarpenterRequirement + 160, // 212: api.v1.KarpenterResourceDetails.limits:type_name -> api.v1.KarpenterResourceDetails.LimitsEntry + 161, // 213: api.v1.KarpenterCapacity.other:type_name -> api.v1.KarpenterCapacity.OtherEntry + 24, // 214: api.v1.WorkloadFilters.namespace_selector:type_name -> api.v1.LabelSelector + 24, // 215: api.v1.WorkloadFilters.workload_selector:type_name -> api.v1.LabelSelector + 0, // 216: api.v1.WorkloadFilters.kind_filter:type_name -> api.v1.K8sObjectKind + 25, // 217: api.v1.WorkloadFilters.name_pattern:type_name -> api.v1.RegexPattern + 24, // 218: api.v1.WorkloadFilters.annotation_selector:type_name -> api.v1.LabelSelector + 3, // 219: api.v1.WorkloadFilters.status:type_name -> api.v1.WorkloadStatusFilter + 162, // 220: api.v1.PodDisruptionBudgetDetails.selector_labels:type_name -> api.v1.PodDisruptionBudgetDetails.SelectorLabelsEntry + 116, // 221: api.v1.PodDisruptionBudgetDetails.conditions:type_name -> api.v1.PodDisruptionBudgetCondition + 163, // 222: api.v1.ResourceQuotaDetails.hard_limits:type_name -> api.v1.ResourceQuotaDetails.HardLimitsEntry + 164, // 223: api.v1.ResourceQuotaDetails.used:type_name -> api.v1.ResourceQuotaDetails.UsedEntry + 165, // 224: api.v1.ResourceQuotaDetails.scope_selector:type_name -> api.v1.ResourceQuotaDetails.ScopeSelectorEntry + 118, // 225: api.v1.ResourceQuotaDetails.conditions:type_name -> api.v1.ResourceQuotaCondition + 30, // 226: api.v1.VolcanoJobDetails.containers:type_name -> api.v1.ContainerTemplate + 120, // 227: api.v1.VolcanoJobDetails.conditions:type_name -> api.v1.VolcanoJobCondition + 121, // 228: api.v1.VolcanoJobDetails.tasks:type_name -> api.v1.VolcanoTask + 30, // 229: api.v1.VolcanoTask.containers:type_name -> api.v1.ContainerTemplate + 30, // 230: api.v1.SparkApplicationDetails.containers:type_name -> api.v1.ContainerTemplate + 123, // 231: api.v1.SparkApplicationDetails.spark_driver_info:type_name -> api.v1.SparkDriverInfo + 124, // 232: api.v1.SparkApplicationDetails.restart_policy:type_name -> api.v1.SparkRestartPolicyInfo + 125, // 233: api.v1.SparkApplicationDetails.dynamic_allocation:type_name -> api.v1.SparkDynamicAllocationInfo + 166, // 234: api.v1.Event.created_at:type_name -> google.protobuf.Timestamp + 166, // 235: api.v1.Event.updated_at:type_name -> google.protobuf.Timestamp + 166, // 236: api.v1.Event.last_seen:type_name -> google.protobuf.Timestamp + 166, // 237: api.v1.Event.deleted_at:type_name -> google.protobuf.Timestamp + 127, // 238: api.v1.EventDatapoint.events:type_name -> api.v1.EventDatapointInfo + 239, // [239:239] is the sub-list for method output_type + 239, // [239:239] is the sub-list for method input_type + 239, // [239:239] is the sub-list for extension type_name + 239, // [239:239] is the sub-list for extension extendee + 0, // [0:239] is the sub-list for field type_name } func init() { file_api_v1_common_proto_init() } @@ -17320,7 +17788,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Event); i { + switch v := v.(*SparkApplicationDetails); i { case 0: return &v.state case 1: @@ -17332,7 +17800,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EventDatapointInfo); i { + switch v := v.(*SparkDriverInfo); i { case 0: return &v.state case 1: @@ -17344,6 +17812,54 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SparkRestartPolicyInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_common_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SparkDynamicAllocationInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_common_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Event); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_common_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EventDatapointInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_common_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EventDatapoint); i { case 0: return &v.state @@ -17385,6 +17901,7 @@ func file_api_v1_common_proto_init() { (*ResourceDetails_PodDisruptionBudgetDetails)(nil), (*ResourceDetails_ResourceQuotaDetails)(nil), (*ResourceDetails_VolcanoJobDetails)(nil), + (*ResourceDetails_SparkApplicationDetails)(nil), } file_api_v1_common_proto_msgTypes[110].OneofWrappers = []interface{}{} type x struct{} @@ -17393,7 +17910,7 @@ func file_api_v1_common_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_v1_common_proto_rawDesc, NumEnums: 4, - NumMessages: 158, + NumMessages: 162, NumExtensions: 0, NumServices: 0, }, diff --git a/gen/api/v1/metrics_collector.pb.go b/gen/api/v1/metrics_collector.pb.go index 6e43d60d..714b6c3e 100644 --- a/gen/api/v1/metrics_collector.pb.go +++ b/gen/api/v1/metrics_collector.pb.go @@ -7,13 +7,14 @@ package apiv1 import ( + reflect "reflect" + sync "sync" + _go "github.com/prometheus/client_model/go" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" structpb "google.golang.org/protobuf/types/known/structpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" ) const ( @@ -1512,6 +1513,9 @@ type Namespace struct { KedaScaledObjects map[string]*ResourceIdentifier `protobuf:"bytes,25,rep,name=keda_scaled_objects,json=kedaScaledObjects,proto3" json:"keda_scaled_objects,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` Hash string `protobuf:"bytes,26,opt,name=hash,proto3" json:"hash,omitempty"` CsiStorageCapacities map[string]*ResourceIdentifier `protobuf:"bytes,27,rep,name=csi_storage_capacities,json=csiStorageCapacities,proto3" json:"csi_storage_capacities,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + KubeflowNotebooks map[string]*ResourceIdentifier `protobuf:"bytes,28,rep,name=kubeflow_notebooks,json=kubeflowNotebooks,proto3" json:"kubeflow_notebooks,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + VolcanoJobs map[string]*ResourceIdentifier `protobuf:"bytes,29,rep,name=volcano_jobs,json=volcanoJobs,proto3" json:"volcano_jobs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + SparkApplications map[string]*ResourceIdentifier `protobuf:"bytes,30,rep,name=spark_applications,json=sparkApplications,proto3" json:"spark_applications,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *Namespace) Reset() { @@ -1737,6 +1741,27 @@ func (x *Namespace) GetCsiStorageCapacities() map[string]*ResourceIdentifier { return nil } +func (x *Namespace) GetKubeflowNotebooks() map[string]*ResourceIdentifier { + if x != nil { + return x.KubeflowNotebooks + } + return nil +} + +func (x *Namespace) GetVolcanoJobs() map[string]*ResourceIdentifier { + if x != nil { + return x.VolcanoJobs + } + return nil +} + +func (x *Namespace) GetSparkApplications() map[string]*ResourceIdentifier { + if x != nil { + return x.SparkApplications + } + return nil +} + // ClusterScopedSnapshot contains minimal cluster-scoped resource data type ClusterScopedSnapshot struct { state protoimpl.MessageState @@ -2885,7 +2910,7 @@ var file_api_v1_metrics_collector_proto_rawDesc = []byte{ 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x88, 0x21, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x01, 0x22, 0xa1, 0x25, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x09, @@ -3005,314 +3030,377 @@ var file_api_v1_metrics_collector_proto_rawDesc = []byte{ 0x2e, 0x43, 0x73, 0x69, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x14, 0x63, 0x73, 0x69, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, - 0x1a, 0x5a, 0x0a, 0x10, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5b, 0x0a, 0x11, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x12, 0x57, 0x0a, 0x12, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6e, 0x6f, 0x74, + 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x73, 0x18, 0x1c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, + 0x4b, 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x6b, 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, 0x77, + 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x73, 0x12, 0x45, 0x0a, 0x0c, 0x76, 0x6f, 0x6c, + 0x63, 0x61, 0x6e, 0x6f, 0x5f, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x1d, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x2e, 0x56, 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x4a, 0x6f, 0x62, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0b, 0x76, 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x4a, 0x6f, 0x62, 0x73, + 0x12, 0x57, 0x0a, 0x12, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, + 0x53, 0x70, 0x61, 0x72, 0x6b, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x41, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x5a, 0x0a, 0x10, 0x44, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 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, + 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5b, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, + 0x6c, 0x53, 0x65, 0x74, 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, 0x30, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x59, 0x0a, 0x0f, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x53, 0x65, 0x74, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5a, 0x0a, + 0x10, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, 0x74, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x59, 0x0a, 0x0f, 0x44, 0x61, 0x65, - 0x6d, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x57, 0x0a, 0x0d, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x59, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4d, 0x61, 0x70, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x56, 0x0a, + 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 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, + 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x53, 0x0a, 0x09, 0x50, 0x76, 0x63, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x53, 0x0a, 0x09, 0x4a, 0x6f, + 0x62, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x57, 0x0a, 0x0d, 0x43, 0x72, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x5e, 0x0a, 0x14, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x5e, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 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, 0x30, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x54, 0x0a, 0x0a, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5b, 0x0a, 0x11, 0x52, 0x6f, 0x6c, 0x65, + 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 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, + 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x63, 0x0a, 0x19, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, + 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x0e, 0x45, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5a, 0x0a, 0x10, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, - 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5a, 0x0a, 0x10, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, + 0x67, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x1a, 0x57, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x59, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x4d, 0x61, 0x70, 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, 0x30, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x56, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x53, 0x0a, 0x09, - 0x50, 0x76, 0x63, 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, 0x30, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x53, 0x0a, 0x09, 0x4a, 0x6f, 0x62, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x57, 0x0a, 0x0d, 0x43, 0x72, 0x6f, 0x6e, 0x4a, 0x6f, - 0x62, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x1a, 0x5d, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x6f, 0x74, + 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x58, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5e, 0x0a, 0x14, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5e, 0x0a, 0x14, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x54, 0x0a, 0x0a, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x5e, 0x0a, 0x14, 0x55, 0x6e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x50, 0x6f, + 0x64, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x5b, 0x0a, 0x11, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x63, 0x0a, 0x19, - 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, - 0x67, 0x65, 0x74, 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, 0x30, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5a, 0x0a, 0x10, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5d, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x51, 0x75, 0x6f, 0x74, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5e, 0x0a, 0x14, 0x55, 0x6e, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x64, 0x50, 0x6f, 0x64, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x67, 0x0a, 0x1d, 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, - 0x6e, 0x74, 0x61, 0x6c, 0x50, 0x6f, 0x64, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x67, 0x0a, 0x1d, 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x50, 0x6f, 0x64, + 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x55, 0x0a, 0x0b, 0x45, 0x76, 0x65, 0x6e, + 0x74, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x55, 0x0a, 0x0b, 0x45, 0x76, 0x65, 0x6e, 0x74, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5d, 0x0a, 0x13, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, - 0x61, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x5d, 0x0a, 0x13, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, + 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x60, + 0x0a, 0x16, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x63, 0x0a, 0x19, 0x43, 0x73, 0x69, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x60, 0x0a, 0x16, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, - 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x60, 0x0a, 0x16, 0x4b, 0x75, 0x62, 0x65, 0x66, 0x6c, 0x6f, + 0x77, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x63, 0x0a, 0x19, 0x43, 0x73, 0x69, 0x53, 0x74, - 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe8, 0x0d, 0x0a, - 0x15, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x53, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x63, 0x0a, 0x12, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x2e, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x5a, 0x0a, 0x0f, 0x73, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x12, 0x54, 0x0a, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, - 0x63, 0x6f, 0x70, 0x65, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x6a, 0x0a, - 0x15, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x62, 0x69, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x63, 0x6f, - 0x70, 0x65, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x6f, 0x6c, - 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x7c, 0x0a, 0x1b, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x66, - 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, - 0x63, 0x6f, 0x70, 0x65, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x43, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x66, 0x69, - 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x19, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x66, 0x69, - 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5a, 0x0a, 0x0f, 0x69, 0x6e, 0x67, 0x72, 0x65, - 0x73, 0x73, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, - 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0e, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x65, 0x73, 0x12, 0x48, 0x0a, 0x09, 0x63, 0x73, 0x69, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, - 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x53, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x43, 0x73, 0x69, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x63, 0x73, 0x69, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, - 0x68, 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x73, 0x69, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, - 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x53, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x43, 0x73, 0x69, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x63, 0x73, 0x69, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, - 0x73, 0x12, 0x63, 0x0a, 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x61, 0x74, 0x74, 0x61, - 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5a, 0x0a, 0x10, 0x56, 0x6f, 0x6c, 0x63, 0x61, + 0x6e, 0x6f, 0x4a, 0x6f, 0x62, 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, 0x30, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x60, 0x0a, 0x16, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x41, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 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, + 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe8, 0x0d, 0x0a, 0x15, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, + 0x63, 0x0a, 0x12, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x70, + 0x65, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x50, 0x65, 0x72, 0x73, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x11, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x73, 0x12, 0x5a, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x63, - 0x6f, 0x70, 0x65, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x61, 0x63, - 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x60, 0x0a, 0x16, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5d, 0x0a, 0x13, 0x53, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5b, 0x0a, 0x11, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x62, 0x0a, 0x18, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, - 0x6f, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x68, 0x0a, 0x1e, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, - 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, 0x30, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x5d, 0x0a, 0x13, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x43, 0x6c, 0x61, - 0x73, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x6f, 0x70, 0x65, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, + 0x12, 0x54, 0x0a, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x6f, 0x6c, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x6a, 0x0a, 0x15, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, + 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x73, 0x12, 0x7c, 0x0a, 0x1b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x19, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x5a, 0x0a, 0x0f, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x69, 0x6e, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x12, 0x48, 0x0a, 0x09, + 0x63, 0x73, 0x69, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x43, + 0x73, 0x69, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x63, 0x73, + 0x69, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x73, + 0x69, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x43, + 0x73, 0x69, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, + 0x63, 0x73, 0x69, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x12, 0x63, 0x0a, 0x12, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, + 0x60, 0x0a, 0x16, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x57, 0x0a, 0x0d, 0x43, 0x73, 0x69, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x01, 0x1a, 0x5d, 0x0a, 0x13, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x5b, 0x0a, 0x11, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x62, 0x0a, + 0x18, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 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, 0x30, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x68, 0x0a, 0x1e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5d, 0x0a, 0x13, 0x49, + 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x59, 0x0a, 0x0f, 0x43, 0x73, - 0x69, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x60, 0x0a, 0x16, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, - 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x66, 0x0a, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x1e, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x22, - 0x8b, 0x04, 0x0a, 0x0f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x12, 0x36, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, - 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x38, 0x0a, 0x05, 0x6e, - 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x44, - 0x0a, 0x0e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x53, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x63, - 0x6f, 0x70, 0x65, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1f, - 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x1a, - 0x4a, 0x0a, 0x0a, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x26, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x50, 0x0a, 0x0f, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x27, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x78, 0x0a, - 0x18, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x4c, 0x6f, - 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, - 0x64, 0x12, 0x24, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0xf5, 0x02, 0x0a, 0x12, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x15, - 0x0a, 0x06, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x72, 0x63, 0x49, 0x70, 0x12, 0x15, 0x0a, 0x06, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x70, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x64, 0x73, 0x74, 0x49, 0x70, 0x12, 0x20, 0x0a, 0x0c, - 0x73, 0x72, 0x63, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x57, 0x0a, 0x0d, 0x43, 0x73, + 0x69, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x59, 0x0a, 0x0f, 0x43, 0x73, 0x69, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x60, + 0x0a, 0x16, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, + 0x6e, 0x74, 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, 0x30, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x66, 0x0a, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6e, + 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x22, 0x8b, 0x04, 0x0a, 0x0f, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x36, 0x0a, 0x0c, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x38, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x47, + 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x0e, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x0d, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x12, 0x38, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x1a, 0x4a, 0x0a, 0x0a, 0x4e, 0x6f, 0x64, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x50, 0x0a, 0x0f, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x27, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x78, 0x0a, 0x18, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x65, + 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x04, 0x6c, 0x6f, + 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, + 0x22, 0xf5, 0x02, 0x0a, 0x12, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x72, 0x61, 0x66, + 0x66, 0x69, 0x63, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x15, 0x0a, 0x06, 0x73, 0x72, 0x63, 0x5f, 0x69, + 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x72, 0x63, 0x49, 0x70, 0x12, 0x15, + 0x0a, 0x06, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x64, 0x73, 0x74, 0x49, 0x70, 0x12, 0x20, 0x0a, 0x0c, 0x73, 0x72, 0x63, 0x5f, 0x70, 0x6f, 0x64, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x72, 0x63, + 0x50, 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x72, 0x63, 0x5f, 0x70, + 0x6f, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x73, 0x72, 0x63, 0x50, 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, + 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x07, 0x64, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x78, + 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x74, 0x78, + 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x72, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x78, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x78, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, + 0x1d, 0x0a, 0x0a, 0x72, 0x78, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x78, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x38, + 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xef, 0x01, 0x0a, 0x0d, 0x44, 0x6e, 0x73, + 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, + 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x5f, 0x69, 0x70, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x49, + 0x70, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x20, 0x0a, 0x0c, + 0x73, 0x72, 0x63, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x72, 0x63, 0x50, 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x72, 0x63, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x72, 0x63, 0x50, 0x6f, @@ -3631,7 +3719,7 @@ func file_api_v1_metrics_collector_proto_rawDescGZIP() []byte { } var file_api_v1_metrics_collector_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_api_v1_metrics_collector_proto_msgTypes = make([]protoimpl.MessageInfo, 67) +var file_api_v1_metrics_collector_proto_msgTypes = make([]protoimpl.MessageInfo, 70) var file_api_v1_metrics_collector_proto_goTypes = []interface{}{ (EventType)(0), // 0: api.v1.EventType (ResourceType)(0), // 1: api.v1.ResourceType @@ -3689,45 +3777,48 @@ var file_api_v1_metrics_collector_proto_goTypes = []interface{}{ nil, // 53: api.v1.Namespace.KedaScaledJobsEntry nil, // 54: api.v1.Namespace.KedaScaledObjectsEntry nil, // 55: api.v1.Namespace.CsiStorageCapacitiesEntry - nil, // 56: api.v1.ClusterScopedSnapshot.PersistentVolumesEntry - nil, // 57: api.v1.ClusterScopedSnapshot.StorageClassesEntry - nil, // 58: api.v1.ClusterScopedSnapshot.ClusterRolesEntry - nil, // 59: api.v1.ClusterScopedSnapshot.ClusterRoleBindingsEntry - nil, // 60: api.v1.ClusterScopedSnapshot.CustomResourceDefinitionsEntry - nil, // 61: api.v1.ClusterScopedSnapshot.IngressClassesEntry - nil, // 62: api.v1.ClusterScopedSnapshot.CsiNodesEntry - nil, // 63: api.v1.ClusterScopedSnapshot.CsiDriversEntry - nil, // 64: api.v1.ClusterScopedSnapshot.VolumeAttachmentsEntry - nil, // 65: api.v1.ClusterSnapshot.NodesEntry - nil, // 66: api.v1.ClusterSnapshot.NamespacesEntry - nil, // 67: api.v1.SendNetworkTrafficMetricsRequest.Ip2domainEntry - nil, // 68: api.v1.LogEntry.FieldsEntry - nil, // 69: api.v1.NodeMetadataResponse.NodeToMetaEntry - (*timestamppb.Timestamp)(nil), // 70: google.protobuf.Timestamp - (*structpb.Struct)(nil), // 71: google.protobuf.Struct - (*_go.MetricFamily)(nil), // 72: io.prometheus.client.MetricFamily - (*Node)(nil), // 73: api.v1.Node + nil, // 56: api.v1.Namespace.KubeflowNotebooksEntry + nil, // 57: api.v1.Namespace.VolcanoJobsEntry + nil, // 58: api.v1.Namespace.SparkApplicationsEntry + nil, // 59: api.v1.ClusterScopedSnapshot.PersistentVolumesEntry + nil, // 60: api.v1.ClusterScopedSnapshot.StorageClassesEntry + nil, // 61: api.v1.ClusterScopedSnapshot.ClusterRolesEntry + nil, // 62: api.v1.ClusterScopedSnapshot.ClusterRoleBindingsEntry + nil, // 63: api.v1.ClusterScopedSnapshot.CustomResourceDefinitionsEntry + nil, // 64: api.v1.ClusterScopedSnapshot.IngressClassesEntry + nil, // 65: api.v1.ClusterScopedSnapshot.CsiNodesEntry + nil, // 66: api.v1.ClusterScopedSnapshot.CsiDriversEntry + nil, // 67: api.v1.ClusterScopedSnapshot.VolumeAttachmentsEntry + nil, // 68: api.v1.ClusterSnapshot.NodesEntry + nil, // 69: api.v1.ClusterSnapshot.NamespacesEntry + nil, // 70: api.v1.SendNetworkTrafficMetricsRequest.Ip2domainEntry + nil, // 71: api.v1.LogEntry.FieldsEntry + nil, // 72: api.v1.NodeMetadataResponse.NodeToMetaEntry + (*timestamppb.Timestamp)(nil), // 73: google.protobuf.Timestamp + (*structpb.Struct)(nil), // 74: google.protobuf.Struct + (*_go.MetricFamily)(nil), // 75: io.prometheus.client.MetricFamily + (*Node)(nil), // 76: api.v1.Node } var file_api_v1_metrics_collector_proto_depIdxs = []int32{ - 70, // 0: api.v1.ResourceItem.timestamp:type_name -> google.protobuf.Timestamp + 73, // 0: api.v1.ResourceItem.timestamp:type_name -> google.protobuf.Timestamp 0, // 1: api.v1.ResourceItem.event_type:type_name -> api.v1.EventType - 71, // 2: api.v1.ResourceItem.data:type_name -> google.protobuf.Struct + 74, // 2: api.v1.ResourceItem.data:type_name -> google.protobuf.Struct 1, // 3: api.v1.ResourceItem.resource_type:type_name -> api.v1.ResourceType 1, // 4: api.v1.SendResourceRequest.resource_type:type_name -> api.v1.ResourceType - 70, // 5: api.v1.SendResourceRequest.timestamp:type_name -> google.protobuf.Timestamp + 73, // 5: api.v1.SendResourceRequest.timestamp:type_name -> google.protobuf.Timestamp 0, // 6: api.v1.SendResourceRequest.event_type:type_name -> api.v1.EventType - 71, // 7: api.v1.SendResourceRequest.data:type_name -> google.protobuf.Struct + 74, // 7: api.v1.SendResourceRequest.data:type_name -> google.protobuf.Struct 3, // 8: api.v1.SendResourceBatchRequest.resources:type_name -> api.v1.ResourceItem - 70, // 9: api.v1.GetForecastMetricsRequest.start_time:type_name -> google.protobuf.Timestamp - 70, // 10: api.v1.GetForecastMetricsRequest.end_time:type_name -> google.protobuf.Timestamp + 73, // 9: api.v1.GetForecastMetricsRequest.start_time:type_name -> google.protobuf.Timestamp + 73, // 10: api.v1.GetForecastMetricsRequest.end_time:type_name -> google.protobuf.Timestamp 8, // 11: api.v1.GetForecastMetricsResponse.metrics:type_name -> api.v1.ContainerForecastMetric - 70, // 12: api.v1.ContainerForecastMetric.timestamp:type_name -> google.protobuf.Timestamp - 70, // 13: api.v1.ContainerForecastMetric.created_at:type_name -> google.protobuf.Timestamp - 70, // 14: api.v1.ContainerForecastMetric.updated_at:type_name -> google.protobuf.Timestamp + 73, // 12: api.v1.ContainerForecastMetric.timestamp:type_name -> google.protobuf.Timestamp + 73, // 13: api.v1.ContainerForecastMetric.created_at:type_name -> google.protobuf.Timestamp + 73, // 14: api.v1.ContainerForecastMetric.updated_at:type_name -> google.protobuf.Timestamp 1, // 15: api.v1.SendResourceResponse.resource_type:type_name -> api.v1.ResourceType 1, // 16: api.v1.SendResourceBatchResponse.resource_type:type_name -> api.v1.ResourceType - 72, // 17: api.v1.SendTelemetryMetricsRequest.metric_families:type_name -> io.prometheus.client.MetricFamily - 70, // 18: api.v1.ClusterSnapshotChunk.timestamp:type_name -> google.protobuf.Timestamp + 75, // 17: api.v1.SendTelemetryMetricsRequest.metric_families:type_name -> io.prometheus.client.MetricFamily + 73, // 18: api.v1.ClusterSnapshotChunk.timestamp:type_name -> google.protobuf.Timestamp 20, // 19: api.v1.SendClusterSnapshotStreamResponse.missing_resources:type_name -> api.v1.ClusterSnapshot 15, // 20: api.v1.NodeData.node:type_name -> api.v1.ResourceIdentifier 30, // 21: api.v1.NodeData.pods:type_name -> api.v1.NodeData.PodsEntry @@ -3757,87 +3848,93 @@ var file_api_v1_metrics_collector_proto_depIdxs = []int32{ 53, // 45: api.v1.Namespace.keda_scaled_jobs:type_name -> api.v1.Namespace.KedaScaledJobsEntry 54, // 46: api.v1.Namespace.keda_scaled_objects:type_name -> api.v1.Namespace.KedaScaledObjectsEntry 55, // 47: api.v1.Namespace.csi_storage_capacities:type_name -> api.v1.Namespace.CsiStorageCapacitiesEntry - 56, // 48: api.v1.ClusterScopedSnapshot.persistent_volumes:type_name -> api.v1.ClusterScopedSnapshot.PersistentVolumesEntry - 57, // 49: api.v1.ClusterScopedSnapshot.storage_classes:type_name -> api.v1.ClusterScopedSnapshot.StorageClassesEntry - 58, // 50: api.v1.ClusterScopedSnapshot.cluster_roles:type_name -> api.v1.ClusterScopedSnapshot.ClusterRolesEntry - 59, // 51: api.v1.ClusterScopedSnapshot.cluster_role_bindings:type_name -> api.v1.ClusterScopedSnapshot.ClusterRoleBindingsEntry - 60, // 52: api.v1.ClusterScopedSnapshot.custom_resource_definitions:type_name -> api.v1.ClusterScopedSnapshot.CustomResourceDefinitionsEntry - 61, // 53: api.v1.ClusterScopedSnapshot.ingress_classes:type_name -> api.v1.ClusterScopedSnapshot.IngressClassesEntry - 62, // 54: api.v1.ClusterScopedSnapshot.csi_nodes:type_name -> api.v1.ClusterScopedSnapshot.CsiNodesEntry - 63, // 55: api.v1.ClusterScopedSnapshot.csi_drivers:type_name -> api.v1.ClusterScopedSnapshot.CsiDriversEntry - 64, // 56: api.v1.ClusterScopedSnapshot.volume_attachments:type_name -> api.v1.ClusterScopedSnapshot.VolumeAttachmentsEntry - 19, // 57: api.v1.ClusterSnapshot.cluster_info:type_name -> api.v1.ClusterInfo - 65, // 58: api.v1.ClusterSnapshot.nodes:type_name -> api.v1.ClusterSnapshot.NodesEntry - 66, // 59: api.v1.ClusterSnapshot.namespaces:type_name -> api.v1.ClusterSnapshot.NamespacesEntry - 18, // 60: api.v1.ClusterSnapshot.cluster_scoped:type_name -> api.v1.ClusterScopedSnapshot - 70, // 61: api.v1.ClusterSnapshot.timestamp:type_name -> google.protobuf.Timestamp - 26, // 62: api.v1.SendTelemetryLogsRequest.logs:type_name -> api.v1.LogEntry - 70, // 63: api.v1.NetworkTrafficItem.timestamp:type_name -> google.protobuf.Timestamp - 70, // 64: api.v1.DnsLookupItem.timestamp:type_name -> google.protobuf.Timestamp - 22, // 65: api.v1.SendNetworkTrafficMetricsRequest.items:type_name -> api.v1.NetworkTrafficItem - 23, // 66: api.v1.SendNetworkTrafficMetricsRequest.dns_lookups:type_name -> api.v1.DnsLookupItem - 67, // 67: api.v1.SendNetworkTrafficMetricsRequest.ip2domain:type_name -> api.v1.SendNetworkTrafficMetricsRequest.Ip2domainEntry - 70, // 68: api.v1.LogEntry.timestamp:type_name -> google.protobuf.Timestamp - 2, // 69: api.v1.LogEntry.level:type_name -> api.v1.LogLevel - 68, // 70: api.v1.LogEntry.fields:type_name -> api.v1.LogEntry.FieldsEntry - 69, // 71: api.v1.NodeMetadataResponse.node_to_meta:type_name -> api.v1.NodeMetadataResponse.NodeToMetaEntry - 15, // 72: api.v1.NodeData.PodsEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 73: api.v1.Namespace.DeploymentsEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 74: api.v1.Namespace.StatefulSetsEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 75: api.v1.Namespace.DaemonSetsEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 76: api.v1.Namespace.ReplicaSetsEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 77: api.v1.Namespace.ServicesEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 78: api.v1.Namespace.ConfigMapsEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 79: api.v1.Namespace.SecretsEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 80: api.v1.Namespace.PvcsEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 81: api.v1.Namespace.JobsEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 82: api.v1.Namespace.CronJobsEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 83: api.v1.Namespace.IngressesEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 84: api.v1.Namespace.NetworkPoliciesEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 85: api.v1.Namespace.ServiceAccountsEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 86: api.v1.Namespace.RolesEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 87: api.v1.Namespace.RoleBindingsEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 88: api.v1.Namespace.PodDisruptionBudgetsEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 89: api.v1.Namespace.EndpointsEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 90: api.v1.Namespace.LimitRangesEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 91: api.v1.Namespace.ResourceQuotasEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 92: api.v1.Namespace.UnscheduledPodsEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 93: api.v1.Namespace.HorizontalPodAutoscalersEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 94: api.v1.Namespace.EventsEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 95: api.v1.Namespace.KedaScaledJobsEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 96: api.v1.Namespace.KedaScaledObjectsEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 97: api.v1.Namespace.CsiStorageCapacitiesEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 98: api.v1.ClusterScopedSnapshot.PersistentVolumesEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 99: api.v1.ClusterScopedSnapshot.StorageClassesEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 100: api.v1.ClusterScopedSnapshot.ClusterRolesEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 101: api.v1.ClusterScopedSnapshot.ClusterRoleBindingsEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 102: api.v1.ClusterScopedSnapshot.CustomResourceDefinitionsEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 103: api.v1.ClusterScopedSnapshot.IngressClassesEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 104: api.v1.ClusterScopedSnapshot.CsiNodesEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 105: api.v1.ClusterScopedSnapshot.CsiDriversEntry.value:type_name -> api.v1.ResourceIdentifier - 15, // 106: api.v1.ClusterScopedSnapshot.VolumeAttachmentsEntry.value:type_name -> api.v1.ResourceIdentifier - 16, // 107: api.v1.ClusterSnapshot.NodesEntry.value:type_name -> api.v1.NodeData - 17, // 108: api.v1.ClusterSnapshot.NamespacesEntry.value:type_name -> api.v1.Namespace - 73, // 109: api.v1.NodeMetadataResponse.NodeToMetaEntry.value:type_name -> api.v1.Node - 4, // 110: api.v1.MetricsCollectorService.SendResource:input_type -> api.v1.SendResourceRequest - 5, // 111: api.v1.MetricsCollectorService.SendResourceBatch:input_type -> api.v1.SendResourceBatchRequest - 11, // 112: api.v1.MetricsCollectorService.SendTelemetryMetrics:input_type -> api.v1.SendTelemetryMetricsRequest - 13, // 113: api.v1.MetricsCollectorService.SendClusterSnapshotStream:input_type -> api.v1.ClusterSnapshotChunk - 21, // 114: api.v1.MetricsCollectorService.SendTelemetryLogs:input_type -> api.v1.SendTelemetryLogsRequest - 24, // 115: api.v1.MetricsCollectorService.SendNetworkTrafficMetrics:input_type -> api.v1.SendNetworkTrafficMetricsRequest - 28, // 116: api.v1.MetricsCollectorService.NodeMetadata:input_type -> api.v1.NodeMetadataRequest - 9, // 117: api.v1.MetricsCollectorService.SendResource:output_type -> api.v1.SendResourceResponse - 10, // 118: api.v1.MetricsCollectorService.SendResourceBatch:output_type -> api.v1.SendResourceBatchResponse - 12, // 119: api.v1.MetricsCollectorService.SendTelemetryMetrics:output_type -> api.v1.SendTelemetryMetricsResponse - 14, // 120: api.v1.MetricsCollectorService.SendClusterSnapshotStream:output_type -> api.v1.SendClusterSnapshotStreamResponse - 27, // 121: api.v1.MetricsCollectorService.SendTelemetryLogs:output_type -> api.v1.SendTelemetryLogsResponse - 25, // 122: api.v1.MetricsCollectorService.SendNetworkTrafficMetrics:output_type -> api.v1.SendNetworkTrafficMetricsResponse - 29, // 123: api.v1.MetricsCollectorService.NodeMetadata:output_type -> api.v1.NodeMetadataResponse - 117, // [117:124] is the sub-list for method output_type - 110, // [110:117] is the sub-list for method input_type - 110, // [110:110] is the sub-list for extension type_name - 110, // [110:110] is the sub-list for extension extendee - 0, // [0:110] is the sub-list for field type_name + 56, // 48: api.v1.Namespace.kubeflow_notebooks:type_name -> api.v1.Namespace.KubeflowNotebooksEntry + 57, // 49: api.v1.Namespace.volcano_jobs:type_name -> api.v1.Namespace.VolcanoJobsEntry + 58, // 50: api.v1.Namespace.spark_applications:type_name -> api.v1.Namespace.SparkApplicationsEntry + 59, // 51: api.v1.ClusterScopedSnapshot.persistent_volumes:type_name -> api.v1.ClusterScopedSnapshot.PersistentVolumesEntry + 60, // 52: api.v1.ClusterScopedSnapshot.storage_classes:type_name -> api.v1.ClusterScopedSnapshot.StorageClassesEntry + 61, // 53: api.v1.ClusterScopedSnapshot.cluster_roles:type_name -> api.v1.ClusterScopedSnapshot.ClusterRolesEntry + 62, // 54: api.v1.ClusterScopedSnapshot.cluster_role_bindings:type_name -> api.v1.ClusterScopedSnapshot.ClusterRoleBindingsEntry + 63, // 55: api.v1.ClusterScopedSnapshot.custom_resource_definitions:type_name -> api.v1.ClusterScopedSnapshot.CustomResourceDefinitionsEntry + 64, // 56: api.v1.ClusterScopedSnapshot.ingress_classes:type_name -> api.v1.ClusterScopedSnapshot.IngressClassesEntry + 65, // 57: api.v1.ClusterScopedSnapshot.csi_nodes:type_name -> api.v1.ClusterScopedSnapshot.CsiNodesEntry + 66, // 58: api.v1.ClusterScopedSnapshot.csi_drivers:type_name -> api.v1.ClusterScopedSnapshot.CsiDriversEntry + 67, // 59: api.v1.ClusterScopedSnapshot.volume_attachments:type_name -> api.v1.ClusterScopedSnapshot.VolumeAttachmentsEntry + 19, // 60: api.v1.ClusterSnapshot.cluster_info:type_name -> api.v1.ClusterInfo + 68, // 61: api.v1.ClusterSnapshot.nodes:type_name -> api.v1.ClusterSnapshot.NodesEntry + 69, // 62: api.v1.ClusterSnapshot.namespaces:type_name -> api.v1.ClusterSnapshot.NamespacesEntry + 18, // 63: api.v1.ClusterSnapshot.cluster_scoped:type_name -> api.v1.ClusterScopedSnapshot + 73, // 64: api.v1.ClusterSnapshot.timestamp:type_name -> google.protobuf.Timestamp + 26, // 65: api.v1.SendTelemetryLogsRequest.logs:type_name -> api.v1.LogEntry + 73, // 66: api.v1.NetworkTrafficItem.timestamp:type_name -> google.protobuf.Timestamp + 73, // 67: api.v1.DnsLookupItem.timestamp:type_name -> google.protobuf.Timestamp + 22, // 68: api.v1.SendNetworkTrafficMetricsRequest.items:type_name -> api.v1.NetworkTrafficItem + 23, // 69: api.v1.SendNetworkTrafficMetricsRequest.dns_lookups:type_name -> api.v1.DnsLookupItem + 70, // 70: api.v1.SendNetworkTrafficMetricsRequest.ip2domain:type_name -> api.v1.SendNetworkTrafficMetricsRequest.Ip2domainEntry + 73, // 71: api.v1.LogEntry.timestamp:type_name -> google.protobuf.Timestamp + 2, // 72: api.v1.LogEntry.level:type_name -> api.v1.LogLevel + 71, // 73: api.v1.LogEntry.fields:type_name -> api.v1.LogEntry.FieldsEntry + 72, // 74: api.v1.NodeMetadataResponse.node_to_meta:type_name -> api.v1.NodeMetadataResponse.NodeToMetaEntry + 15, // 75: api.v1.NodeData.PodsEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 76: api.v1.Namespace.DeploymentsEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 77: api.v1.Namespace.StatefulSetsEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 78: api.v1.Namespace.DaemonSetsEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 79: api.v1.Namespace.ReplicaSetsEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 80: api.v1.Namespace.ServicesEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 81: api.v1.Namespace.ConfigMapsEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 82: api.v1.Namespace.SecretsEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 83: api.v1.Namespace.PvcsEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 84: api.v1.Namespace.JobsEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 85: api.v1.Namespace.CronJobsEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 86: api.v1.Namespace.IngressesEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 87: api.v1.Namespace.NetworkPoliciesEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 88: api.v1.Namespace.ServiceAccountsEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 89: api.v1.Namespace.RolesEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 90: api.v1.Namespace.RoleBindingsEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 91: api.v1.Namespace.PodDisruptionBudgetsEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 92: api.v1.Namespace.EndpointsEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 93: api.v1.Namespace.LimitRangesEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 94: api.v1.Namespace.ResourceQuotasEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 95: api.v1.Namespace.UnscheduledPodsEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 96: api.v1.Namespace.HorizontalPodAutoscalersEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 97: api.v1.Namespace.EventsEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 98: api.v1.Namespace.KedaScaledJobsEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 99: api.v1.Namespace.KedaScaledObjectsEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 100: api.v1.Namespace.CsiStorageCapacitiesEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 101: api.v1.Namespace.KubeflowNotebooksEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 102: api.v1.Namespace.VolcanoJobsEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 103: api.v1.Namespace.SparkApplicationsEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 104: api.v1.ClusterScopedSnapshot.PersistentVolumesEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 105: api.v1.ClusterScopedSnapshot.StorageClassesEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 106: api.v1.ClusterScopedSnapshot.ClusterRolesEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 107: api.v1.ClusterScopedSnapshot.ClusterRoleBindingsEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 108: api.v1.ClusterScopedSnapshot.CustomResourceDefinitionsEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 109: api.v1.ClusterScopedSnapshot.IngressClassesEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 110: api.v1.ClusterScopedSnapshot.CsiNodesEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 111: api.v1.ClusterScopedSnapshot.CsiDriversEntry.value:type_name -> api.v1.ResourceIdentifier + 15, // 112: api.v1.ClusterScopedSnapshot.VolumeAttachmentsEntry.value:type_name -> api.v1.ResourceIdentifier + 16, // 113: api.v1.ClusterSnapshot.NodesEntry.value:type_name -> api.v1.NodeData + 17, // 114: api.v1.ClusterSnapshot.NamespacesEntry.value:type_name -> api.v1.Namespace + 76, // 115: api.v1.NodeMetadataResponse.NodeToMetaEntry.value:type_name -> api.v1.Node + 4, // 116: api.v1.MetricsCollectorService.SendResource:input_type -> api.v1.SendResourceRequest + 5, // 117: api.v1.MetricsCollectorService.SendResourceBatch:input_type -> api.v1.SendResourceBatchRequest + 11, // 118: api.v1.MetricsCollectorService.SendTelemetryMetrics:input_type -> api.v1.SendTelemetryMetricsRequest + 13, // 119: api.v1.MetricsCollectorService.SendClusterSnapshotStream:input_type -> api.v1.ClusterSnapshotChunk + 21, // 120: api.v1.MetricsCollectorService.SendTelemetryLogs:input_type -> api.v1.SendTelemetryLogsRequest + 24, // 121: api.v1.MetricsCollectorService.SendNetworkTrafficMetrics:input_type -> api.v1.SendNetworkTrafficMetricsRequest + 28, // 122: api.v1.MetricsCollectorService.NodeMetadata:input_type -> api.v1.NodeMetadataRequest + 9, // 123: api.v1.MetricsCollectorService.SendResource:output_type -> api.v1.SendResourceResponse + 10, // 124: api.v1.MetricsCollectorService.SendResourceBatch:output_type -> api.v1.SendResourceBatchResponse + 12, // 125: api.v1.MetricsCollectorService.SendTelemetryMetrics:output_type -> api.v1.SendTelemetryMetricsResponse + 14, // 126: api.v1.MetricsCollectorService.SendClusterSnapshotStream:output_type -> api.v1.SendClusterSnapshotStreamResponse + 27, // 127: api.v1.MetricsCollectorService.SendTelemetryLogs:output_type -> api.v1.SendTelemetryLogsResponse + 25, // 128: api.v1.MetricsCollectorService.SendNetworkTrafficMetrics:output_type -> api.v1.SendNetworkTrafficMetricsResponse + 29, // 129: api.v1.MetricsCollectorService.NodeMetadata:output_type -> api.v1.NodeMetadataResponse + 123, // [123:130] is the sub-list for method output_type + 116, // [116:123] is the sub-list for method input_type + 116, // [116:116] is the sub-list for extension type_name + 116, // [116:116] is the sub-list for extension extendee + 0, // [0:116] is the sub-list for field type_name } func init() { file_api_v1_metrics_collector_proto_init() } @@ -4179,7 +4276,7 @@ func file_api_v1_metrics_collector_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_v1_metrics_collector_proto_rawDesc, NumEnums: 3, - NumMessages: 67, + NumMessages: 70, NumExtensions: 0, NumServices: 1, }, diff --git a/helm-chart/zxporter/templates/zxporter-rbac.yaml b/helm-chart/zxporter/templates/zxporter-rbac.yaml index dfdb57c1..61182307 100644 --- a/helm-chart/zxporter/templates/zxporter-rbac.yaml +++ b/helm-chart/zxporter/templates/zxporter-rbac.yaml @@ -350,6 +350,15 @@ rules: - get - list - watch +- apiGroups: + - sparkoperator.k8s.io + resources: + - sparkapplications + - scheduledsparkapplications + verbs: + - get + - list + - watch - apiGroups: - datadoghq.com resources: diff --git a/internal/collector/interface.go b/internal/collector/interface.go index ae8534f0..385a4d07 100644 --- a/internal/collector/interface.go +++ b/internal/collector/interface.go @@ -140,60 +140,64 @@ const ( VolumeAttachment KubeflowNotebook VolcanoJob + SparkApplication + ScheduledSparkApplication ) // String returns the string representation of the ResourceType func (r ResourceType) String() string { names := map[ResourceType]string{ - Unknown: "unknown", - Cluster: "cluster", - Node: "node", - Pod: "pod", - Namespace: "namespace", - Event: "event", - Endpoints: "endpoints", - ServiceAccount: "service_account", - LimitRange: "limit_range", - ResourceQuota: "resource_quota", - Deployment: "deployment", - StatefulSet: "stateful_set", - DaemonSet: "daemon_set", - ReplicaSet: "replica_set", - ReplicationController: "replication_controller", - Job: "job", - CronJob: "cron_job", - PersistentVolumeClaim: "persistent_volume_claim", - PersistentVolume: "persistent_volume", - StorageClass: "storage_class", - Service: "service", - Ingress: "ingress", - IngressClass: "ingress_class", - NetworkPolicy: "network_policy", - Role: "role", - RoleBinding: "role_binding", - ClusterRole: "cluster_role", - ClusterRoleBinding: "cluster_role_binding", - HorizontalPodAutoscaler: "horizontal_pod_autoscaler", - VerticalPodAutoscaler: "vertical_pod_autoscaler", - PodDisruptionBudget: "pod_disruption_budget", - PodSecurityPolicy: "pod_security_policy", - CustomResourceDefinition: "custom_resource_definition", - NodeResource: "node_resource", - Container: "container", - ContainerResource: "container_resource", - CSINode: "csi_node", - Karpenter: "karpenter", - Datadog: "datadog", - ArgoRollouts: "argo_rollouts", - Keda: "keda", - KedaScaledJob: "keda_scaled_job", - KedaScaledObject: "keda_scaled_object", - ClusterSnapshot: "cluster_snapshot", - CSIDriver: "csi_driver", - CSIStorageCapacity: "csi_storage_capacity", - VolumeAttachment: "volume_attachment", - KubeflowNotebook: "kubeflow_notebook", - VolcanoJob: "volcano_job", + Unknown: "unknown", + Cluster: "cluster", + Node: "node", + Pod: "pod", + Namespace: "namespace", + Event: "event", + Endpoints: "endpoints", + ServiceAccount: "service_account", + LimitRange: "limit_range", + ResourceQuota: "resource_quota", + Deployment: "deployment", + StatefulSet: "stateful_set", + DaemonSet: "daemon_set", + ReplicaSet: "replica_set", + ReplicationController: "replication_controller", + Job: "job", + CronJob: "cron_job", + PersistentVolumeClaim: "persistent_volume_claim", + PersistentVolume: "persistent_volume", + StorageClass: "storage_class", + Service: "service", + Ingress: "ingress", + IngressClass: "ingress_class", + NetworkPolicy: "network_policy", + Role: "role", + RoleBinding: "role_binding", + ClusterRole: "cluster_role", + ClusterRoleBinding: "cluster_role_binding", + HorizontalPodAutoscaler: "horizontal_pod_autoscaler", + VerticalPodAutoscaler: "vertical_pod_autoscaler", + PodDisruptionBudget: "pod_disruption_budget", + PodSecurityPolicy: "pod_security_policy", + CustomResourceDefinition: "custom_resource_definition", + NodeResource: "node_resource", + Container: "container", + ContainerResource: "container_resource", + CSINode: "csi_node", + Karpenter: "karpenter", + Datadog: "datadog", + ArgoRollouts: "argo_rollouts", + Keda: "keda", + KedaScaledJob: "keda_scaled_job", + KedaScaledObject: "keda_scaled_object", + ClusterSnapshot: "cluster_snapshot", + CSIDriver: "csi_driver", + CSIStorageCapacity: "csi_storage_capacity", + VolumeAttachment: "volume_attachment", + KubeflowNotebook: "kubeflow_notebook", + VolcanoJob: "volcano_job", + SparkApplication: "spark_application", + ScheduledSparkApplication: "scheduled_spark_application", } if name, ok := names[r]; ok { @@ -303,6 +307,10 @@ func (r ResourceType) ProtoType() gen.ResourceType { return gen.ResourceType_RESOURCE_TYPE_KUBEFLOW_NOTEBOOK case VolcanoJob: return gen.ResourceType_RESOURCE_TYPE_VOLCANO_JOB + case SparkApplication: + return gen.ResourceType_RESOURCE_TYPE_SPARK_APPLICATION + // case ScheduledSparkApplication: + // return gen.ResourceType_RESOURCE_TYPE_SCHEDULED_SPARK_APPLICATION default: return gen.ResourceType_RESOURCE_TYPE_UNSPECIFIED } diff --git a/internal/collector/scheduled_spark_application_collector.go b/internal/collector/scheduled_spark_application_collector.go new file mode 100644 index 00000000..a4a7f9ea --- /dev/null +++ b/internal/collector/scheduled_spark_application_collector.go @@ -0,0 +1,403 @@ +// internal/collector/scheduled_spark_application_collector.go +package collector + +import ( + "context" + "fmt" + "sync" + "time" + + gen "github.com/devzero-inc/zxporter/gen/api/v1" + telemetry_logger "github.com/devzero-inc/zxporter/internal/logger" + "github.com/go-logr/logr" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/dynamic" + "k8s.io/client-go/dynamic/dynamicinformer" + "k8s.io/client-go/tools/cache" +) + +// ScheduledSparkApplicationCollector watches for Scheduled Spark Application resources +type ScheduledSparkApplicationCollector struct { + dynamicClient dynamic.Interface + batchChan chan CollectedResource + resourceChan chan []CollectedResource + batcher *ResourcesBatcher + stopCh chan struct{} + informers map[string]cache.SharedIndexInformer + informerStopChs map[string]chan struct{} + namespaces []string + excludedApplications map[types.NamespacedName]bool + logger logr.Logger + telemetryLogger telemetry_logger.Logger + mu sync.RWMutex +} + +// NewScheduledSparkApplicationCollector creates a new collector for Scheduled Spark Application resources +func NewScheduledSparkApplicationCollector( + dynamicClient dynamic.Interface, + namespaces []string, + excludedApplications []ExcludedScheduledSparkApplication, + maxBatchSize int, + maxBatchTime time.Duration, + logger logr.Logger, + telemetryLogger telemetry_logger.Logger, +) *ScheduledSparkApplicationCollector { + // map for quicker lookups + excludedApplicationsMap := make(map[types.NamespacedName]bool) + for _, app := range excludedApplications { + excludedApplicationsMap[types.NamespacedName{ + Namespace: app.Namespace, + Name: app.Name, + }] = true + } + + batchChan := make(chan CollectedResource, 100) + resourceChan := make(chan []CollectedResource, 100) + + batcher := NewResourcesBatcher( + maxBatchSize, + maxBatchTime, + batchChan, + resourceChan, + logger, + ) + + return &ScheduledSparkApplicationCollector{ + dynamicClient: dynamicClient, + batchChan: batchChan, + resourceChan: resourceChan, + batcher: batcher, + stopCh: make(chan struct{}), + informers: make(map[string]cache.SharedIndexInformer), + informerStopChs: make(map[string]chan struct{}), + namespaces: namespaces, + excludedApplications: excludedApplicationsMap, + logger: logger.WithName("scheduled-spark-application-collector"), + telemetryLogger: telemetryLogger, + } +} + +// Start begins the Scheduled Spark Application resources collection process +func (c *ScheduledSparkApplicationCollector) Start(ctx context.Context) error { + c.logger.Info("Starting Scheduled Spark Application collector", "namespaces", c.namespaces) + + gvr := schema.GroupVersionResource{ + Group: "sparkoperator.k8s.io", + Version: "v1beta2", + Resource: "scheduledsparkapplications", + } + + // Set up informers based on namespace configuration + var factory dynamicinformer.DynamicSharedInformerFactory + if len(c.namespaces) == 1 && c.namespaces[0] != "" { + factory = dynamicinformer.NewFilteredDynamicSharedInformerFactory( + c.dynamicClient, + 0, + c.namespaces[0], + nil, + ) + } else { + factory = dynamicinformer.NewFilteredDynamicSharedInformerFactory( + c.dynamicClient, + 0, + "", // All namespaces + nil, + ) + } + + informer := factory.ForResource(gvr).Informer() + + _, err := informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ + AddFunc: func(obj interface{}) { + u, ok := obj.(*unstructured.Unstructured) + if !ok { + c.logger.Error(nil, "Failed to convert object to unstructured") + c.telemetryLogger.Report( + gen.LogLevel_LOG_LEVEL_ERROR, + "ScheduledSparkApplicationCollector_AddFunc", + "Failed to convert object to unstructured", + fmt.Errorf("type assertion failed"), + map[string]string{ + "object_type": fmt.Sprintf("%T", obj), + }, + ) + return + } + c.handleApplicationEvent(u, EventTypeAdd) + }, + UpdateFunc: func(oldObj, newObj interface{}) { + _, ok := oldObj.(*unstructured.Unstructured) + if !ok { + c.logger.Error(nil, "Failed to convert old object to unstructured") + c.telemetryLogger.Report( + gen.LogLevel_LOG_LEVEL_ERROR, + "ScheduledSparkApplicationCollector_UpdateFunc", + "Failed to convert old object to unstructured", + fmt.Errorf("type assertion failed"), + map[string]string{ + "object_type": fmt.Sprintf("%T", oldObj), + }, + ) + return + } + + newU, ok := newObj.(*unstructured.Unstructured) + if !ok { + c.logger.Error(nil, "Failed to convert new object to unstructured") + c.telemetryLogger.Report( + gen.LogLevel_LOG_LEVEL_ERROR, + "ScheduledSparkApplicationCollector_UpdateFunc", + "Failed to convert new object to unstructured", + fmt.Errorf("type assertion failed"), + map[string]string{ + "object_type": fmt.Sprintf("%T", newObj), + }, + ) + return + } + + c.handleApplicationEvent(newU, EventTypeUpdate) + }, + DeleteFunc: func(obj interface{}) { + u, ok := obj.(*unstructured.Unstructured) + if !ok { + // Try to handle DeletedFinalStateUnknown + if tombstone, ok := obj.(cache.DeletedFinalStateUnknown); ok { + if u, ok = tombstone.Obj.(*unstructured.Unstructured); ok { + c.handleApplicationEvent(u, EventTypeDelete) + return + } + } + c.logger.Error(nil, "Failed to convert deleted object") + c.telemetryLogger.Report( + gen.LogLevel_LOG_LEVEL_ERROR, + "ScheduledSparkApplicationCollector_DeleteFunc", + "Failed to convert deleted object", + fmt.Errorf("type assertion failed"), + map[string]string{ + "object_type": fmt.Sprintf("%T", obj), + }, + ) + return + } + c.handleApplicationEvent(u, EventTypeDelete) + }, + }) + if err != nil { + c.telemetryLogger.Report( + gen.LogLevel_LOG_LEVEL_ERROR, + "ScheduledSparkApplicationCollector_Start", + "Failed to add event handler to informer", + err, + map[string]string{ + "resource": "scheduledsparkapplications", + }, + ) + return fmt.Errorf("failed to add event handler to informer for Scheduled Spark Applications: %w", err) + } + + appKey := "scheduled-spark-applications" + c.informers[appKey] = informer + c.informerStopChs[appKey] = make(chan struct{}) + + // Start the informer + go informer.Run(c.informerStopChs[appKey]) + + syncCtx, cancel := context.WithTimeout(ctx, 30*time.Second) + defer cancel() + + if !cache.WaitForCacheSync(syncCtx.Done(), informer.HasSynced) { + c.telemetryLogger.Report( + gen.LogLevel_LOG_LEVEL_ERROR, + "ScheduledSparkApplicationCollector_Start", + "Timeout waiting for cache to sync", + fmt.Errorf("cache sync timeout"), + map[string]string{ + "resource": "scheduledsparkapplications", + "timeout": "30s", + }, + ) + return fmt.Errorf("timeout waiting for Scheduled Spark Applications cache to sync") + } + + c.logger.Info("Successfully started informer for Scheduled Spark Applications") + + c.logger.Info("Starting resources batcher for Scheduled Spark Applications") + c.batcher.start() + + stopCh := c.stopCh + go func() { + select { + case <-ctx.Done(): + c.Stop() + case <-stopCh: + // Channel was closed by Stop() method + } + }() + + return nil +} + +// handleApplicationEvent processes Scheduled Spark Application events +func (c *ScheduledSparkApplicationCollector) handleApplicationEvent(obj *unstructured.Unstructured, eventType EventType) { + name := obj.GetName() + namespace := obj.GetNamespace() + + // Check if this resource should be excluded + if c.isExcluded(namespace, name) { + return + } + + processedObj := c.processApplication(obj) + + key := fmt.Sprintf("%s/%s", namespace, name) + + // Send the processed resource to the batch channel + c.logger.Info("Collected Scheduled Spark Application resource", "key", key, "eventType", eventType, "resource", processedObj) + c.batchChan <- CollectedResource{ + ResourceType: ScheduledSparkApplication, + Object: processedObj, + Timestamp: time.Now(), + EventType: eventType, + Key: key, + } +} + +// processApplication extracts relevant fields from Scheduled Spark Application objects +func (c *ScheduledSparkApplicationCollector) processApplication(obj *unstructured.Unstructured) map[string]interface{} { + result := map[string]interface{}{ + "name": obj.GetName(), + "namespace": obj.GetNamespace(), + "resourceVersion": obj.GetResourceVersion(), + "creationTimestamp": obj.GetCreationTimestamp().Unix(), + "raw": obj, + } + + return result +} + +// isExcluded checks if an application should be excluded +func (c *ScheduledSparkApplicationCollector) isExcluded(namespace, name string) bool { + // Check if monitoring specific namespaces and this resource isn't in them + if len(c.namespaces) > 0 && c.namespaces[0] != "" { + found := false + for _, ns := range c.namespaces { + if ns == namespace { + found = true + break + } + } + if !found { + return true + } + } + + // Check if resource is specifically excluded + c.mu.RLock() + defer c.mu.RUnlock() + + key := types.NamespacedName{ + Namespace: namespace, + Name: name, + } + return c.excludedApplications[key] +} + +// Stop gracefully shuts down the Scheduled Spark Application collector +func (c *ScheduledSparkApplicationCollector) Stop() error { + c.logger.Info("Stopping Scheduled Spark Application collector") + + // Stop all informers + for key, stopCh := range c.informerStopChs { + c.logger.Info("Stopping informer", "resource", key) + close(stopCh) + } + + c.informers = make(map[string]cache.SharedIndexInformer) + c.informerStopChs = make(map[string]chan struct{}) + + // Close the main stop channel (signals informers to stop) + select { + case <-c.stopCh: + c.logger.Info("Scheduled Spark Application collector stop channel already closed") + default: + close(c.stopCh) + c.logger.Info("Closed Scheduled Spark Application collector stop channel") + } + + // Close the batchChan (input to the batcher). + if c.batchChan != nil { + close(c.batchChan) + c.batchChan = nil + c.logger.Info("Closed Scheduled Spark Application collector batch input channel") + } + + // Stop the batcher (waits for completion). + if c.batcher != nil { + c.batcher.stop() + c.logger.Info("Scheduled Spark Application collector batcher stopped") + } + // resourceChan is closed by the batcher's defer func. + + return nil +} + +// GetResourceChannel returns the channel for collected resource batches +func (c *ScheduledSparkApplicationCollector) GetResourceChannel() <-chan []CollectedResource { + return c.resourceChan +} + +// GetType returns the type of resource this collector handles +func (c *ScheduledSparkApplicationCollector) GetType() string { + return "scheduled_spark_application" +} + +// IsAvailable checks if Scheduled Spark Application resources can be accessed in the cluster +func (c *ScheduledSparkApplicationCollector) IsAvailable(ctx context.Context) bool { + gvr := schema.GroupVersionResource{ + Group: "sparkoperator.k8s.io", + Version: "v1beta2", + Resource: "scheduledsparkapplications", + } + + _, err := c.dynamicClient.Resource(gvr).List(ctx, metav1.ListOptions{Limit: 1}) + if err != nil { + c.logger.Info("Scheduled Spark Application resources not available in the cluster", "error", err.Error()) + c.telemetryLogger.Report( + gen.LogLevel_LOG_LEVEL_WARN, + "ScheduledSparkApplicationCollector_IsAvailable", + "Scheduled Spark Application resources not available in the cluster", + err, + map[string]string{ + "resource": "scheduledsparkapplications", + }, + ) + return false + } + return true +} + +// AddResource manually adds a Scheduled Spark Application resource to be processed by the collector +func (c *ScheduledSparkApplicationCollector) AddResource(resource interface{}) error { + app, ok := resource.(*unstructured.Unstructured) + if !ok { + err := fmt.Errorf("expected *unstructured.Unstructured, got %T", resource) + c.telemetryLogger.Report( + gen.LogLevel_LOG_LEVEL_ERROR, + "ScheduledSparkApplicationCollector_AddResource", + "Invalid resource type", + err, + map[string]string{ + "expected_type": "*unstructured.Unstructured", + "actual_type": fmt.Sprintf("%T", resource), + }, + ) + return err + } + + c.handleApplicationEvent(app, EventTypeAdd) + return nil +} diff --git a/internal/collector/spark_application_collector.go b/internal/collector/spark_application_collector.go new file mode 100644 index 00000000..e6fcc438 --- /dev/null +++ b/internal/collector/spark_application_collector.go @@ -0,0 +1,403 @@ +// internal/collector/spark_application_collector.go +package collector + +import ( + "context" + "fmt" + "sync" + "time" + + gen "github.com/devzero-inc/zxporter/gen/api/v1" + telemetry_logger "github.com/devzero-inc/zxporter/internal/logger" + "github.com/go-logr/logr" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/dynamic" + "k8s.io/client-go/dynamic/dynamicinformer" + "k8s.io/client-go/tools/cache" +) + +// SparkApplicationCollector watches for Spark Application resources +type SparkApplicationCollector struct { + dynamicClient dynamic.Interface + batchChan chan CollectedResource + resourceChan chan []CollectedResource + batcher *ResourcesBatcher + stopCh chan struct{} + informers map[string]cache.SharedIndexInformer + informerStopChs map[string]chan struct{} + namespaces []string + excludedApplications map[types.NamespacedName]bool + logger logr.Logger + telemetryLogger telemetry_logger.Logger + mu sync.RWMutex +} + +// NewSparkApplicationCollector creates a new collector for Spark Application resources +func NewSparkApplicationCollector( + dynamicClient dynamic.Interface, + namespaces []string, + excludedApplications []ExcludedSparkApplication, + maxBatchSize int, + maxBatchTime time.Duration, + logger logr.Logger, + telemetryLogger telemetry_logger.Logger, +) *SparkApplicationCollector { + // map for quicker lookups + excludedApplicationsMap := make(map[types.NamespacedName]bool) + for _, app := range excludedApplications { + excludedApplicationsMap[types.NamespacedName{ + Namespace: app.Namespace, + Name: app.Name, + }] = true + } + + batchChan := make(chan CollectedResource, 100) + resourceChan := make(chan []CollectedResource, 100) + + batcher := NewResourcesBatcher( + maxBatchSize, + maxBatchTime, + batchChan, + resourceChan, + logger, + ) + + return &SparkApplicationCollector{ + dynamicClient: dynamicClient, + batchChan: batchChan, + resourceChan: resourceChan, + batcher: batcher, + stopCh: make(chan struct{}), + informers: make(map[string]cache.SharedIndexInformer), + informerStopChs: make(map[string]chan struct{}), + namespaces: namespaces, + excludedApplications: excludedApplicationsMap, + logger: logger.WithName("spark-application-collector"), + telemetryLogger: telemetryLogger, + } +} + +// Start begins the Spark Application resources collection process +func (c *SparkApplicationCollector) Start(ctx context.Context) error { + c.logger.Info("Starting Spark Application collector", "namespaces", c.namespaces) + + gvr := schema.GroupVersionResource{ + Group: "sparkoperator.k8s.io", + Version: "v1beta2", + Resource: "sparkapplications", + } + + // Set up informers based on namespace configuration + var factory dynamicinformer.DynamicSharedInformerFactory + if len(c.namespaces) == 1 && c.namespaces[0] != "" { + factory = dynamicinformer.NewFilteredDynamicSharedInformerFactory( + c.dynamicClient, + 0, + c.namespaces[0], + nil, + ) + } else { + factory = dynamicinformer.NewFilteredDynamicSharedInformerFactory( + c.dynamicClient, + 0, + "", // All namespaces + nil, + ) + } + + informer := factory.ForResource(gvr).Informer() + + _, err := informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ + AddFunc: func(obj interface{}) { + u, ok := obj.(*unstructured.Unstructured) + if !ok { + c.logger.Error(nil, "Failed to convert object to unstructured") + c.telemetryLogger.Report( + gen.LogLevel_LOG_LEVEL_ERROR, + "SparkApplicationCollector_AddFunc", + "Failed to convert object to unstructured", + fmt.Errorf("type assertion failed"), + map[string]string{ + "object_type": fmt.Sprintf("%T", obj), + }, + ) + return + } + c.handleApplicationEvent(u, EventTypeAdd) + }, + UpdateFunc: func(oldObj, newObj interface{}) { + _, ok := oldObj.(*unstructured.Unstructured) + if !ok { + c.logger.Error(nil, "Failed to convert old object to unstructured") + c.telemetryLogger.Report( + gen.LogLevel_LOG_LEVEL_ERROR, + "SparkApplicationCollector_UpdateFunc", + "Failed to convert old object to unstructured", + fmt.Errorf("type assertion failed"), + map[string]string{ + "object_type": fmt.Sprintf("%T", oldObj), + }, + ) + return + } + + newU, ok := newObj.(*unstructured.Unstructured) + if !ok { + c.logger.Error(nil, "Failed to convert new object to unstructured") + c.telemetryLogger.Report( + gen.LogLevel_LOG_LEVEL_ERROR, + "SparkApplicationCollector_UpdateFunc", + "Failed to convert new object to unstructured", + fmt.Errorf("type assertion failed"), + map[string]string{ + "object_type": fmt.Sprintf("%T", newObj), + }, + ) + return + } + + c.handleApplicationEvent(newU, EventTypeUpdate) + }, + DeleteFunc: func(obj interface{}) { + u, ok := obj.(*unstructured.Unstructured) + if !ok { + // Try to handle DeletedFinalStateUnknown + if tombstone, ok := obj.(cache.DeletedFinalStateUnknown); ok { + if u, ok = tombstone.Obj.(*unstructured.Unstructured); ok { + c.handleApplicationEvent(u, EventTypeDelete) + return + } + } + c.logger.Error(nil, "Failed to convert deleted object") + c.telemetryLogger.Report( + gen.LogLevel_LOG_LEVEL_ERROR, + "SparkApplicationCollector_DeleteFunc", + "Failed to convert deleted object", + fmt.Errorf("type assertion failed"), + map[string]string{ + "object_type": fmt.Sprintf("%T", obj), + }, + ) + return + } + c.handleApplicationEvent(u, EventTypeDelete) + }, + }) + if err != nil { + c.telemetryLogger.Report( + gen.LogLevel_LOG_LEVEL_ERROR, + "SparkApplicationCollector_Start", + "Failed to add event handler to informer", + err, + map[string]string{ + "resource": "sparkapplications", + }, + ) + return fmt.Errorf("failed to add event handler to informer for Spark Applications: %w", err) + } + + appKey := "spark-applications" + c.informers[appKey] = informer + c.informerStopChs[appKey] = make(chan struct{}) + + // Start the informer + go informer.Run(c.informerStopChs[appKey]) + + syncCtx, cancel := context.WithTimeout(ctx, 30*time.Second) + defer cancel() + + if !cache.WaitForCacheSync(syncCtx.Done(), informer.HasSynced) { + c.telemetryLogger.Report( + gen.LogLevel_LOG_LEVEL_ERROR, + "SparkApplicationCollector_Start", + "Timeout waiting for cache to sync", + fmt.Errorf("cache sync timeout"), + map[string]string{ + "resource": "sparkapplications", + "timeout": "30s", + }, + ) + return fmt.Errorf("timeout waiting for Spark Applications cache to sync") + } + + c.logger.Info("Successfully started informer for Spark Applications") + + c.logger.Info("Starting resources batcher for Spark Applications") + c.batcher.start() + + stopCh := c.stopCh + go func() { + select { + case <-ctx.Done(): + c.Stop() + case <-stopCh: + // Channel was closed by Stop() method + } + }() + + return nil +} + +// handleApplicationEvent processes Spark Application events +func (c *SparkApplicationCollector) handleApplicationEvent(obj *unstructured.Unstructured, eventType EventType) { + name := obj.GetName() + namespace := obj.GetNamespace() + + // Check if this resource should be excluded + if c.isExcluded(namespace, name) { + return + } + + processedObj := c.processApplication(obj) + + key := fmt.Sprintf("%s/%s", namespace, name) + + // Send the processed resource to the batch channel + c.logger.Info("Collected Spark Application resource", "key", key, "eventType", eventType, "resource", processedObj) + c.batchChan <- CollectedResource{ + ResourceType: SparkApplication, + Object: processedObj, + Timestamp: time.Now(), + EventType: eventType, + Key: key, + } +} + +// processApplication extracts relevant fields from Spark Application objects +func (c *SparkApplicationCollector) processApplication(obj *unstructured.Unstructured) map[string]interface{} { + result := map[string]interface{}{ + "name": obj.GetName(), + "namespace": obj.GetNamespace(), + "resourceVersion": obj.GetResourceVersion(), + "creationTimestamp": obj.GetCreationTimestamp().Unix(), + "raw": obj, + } + + return result +} + +// isExcluded checks if an application should be excluded +func (c *SparkApplicationCollector) isExcluded(namespace, name string) bool { + // Check if monitoring specific namespaces and this resource isn't in them + if len(c.namespaces) > 0 && c.namespaces[0] != "" { + found := false + for _, ns := range c.namespaces { + if ns == namespace { + found = true + break + } + } + if !found { + return true + } + } + + // Check if resource is specifically excluded + c.mu.RLock() + defer c.mu.RUnlock() + + key := types.NamespacedName{ + Namespace: namespace, + Name: name, + } + return c.excludedApplications[key] +} + +// Stop gracefully shuts down the Spark Application collector +func (c *SparkApplicationCollector) Stop() error { + c.logger.Info("Stopping Spark Application collector") + + // Stop all informers + for key, stopCh := range c.informerStopChs { + c.logger.Info("Stopping informer", "resource", key) + close(stopCh) + } + + c.informers = make(map[string]cache.SharedIndexInformer) + c.informerStopChs = make(map[string]chan struct{}) + + // Close the main stop channel (signals informers to stop) + select { + case <-c.stopCh: + c.logger.Info("Spark Application collector stop channel already closed") + default: + close(c.stopCh) + c.logger.Info("Closed Spark Application collector stop channel") + } + + // Close the batchChan (input to the batcher). + if c.batchChan != nil { + close(c.batchChan) + c.batchChan = nil + c.logger.Info("Closed Spark Application collector batch input channel") + } + + // Stop the batcher (waits for completion). + if c.batcher != nil { + c.batcher.stop() + c.logger.Info("Spark Application collector batcher stopped") + } + // resourceChan is closed by the batcher's defer func. + + return nil +} + +// GetResourceChannel returns the channel for collected resource batches +func (c *SparkApplicationCollector) GetResourceChannel() <-chan []CollectedResource { + return c.resourceChan +} + +// GetType returns the type of resource this collector handles +func (c *SparkApplicationCollector) GetType() string { + return "spark_application" +} + +// IsAvailable checks if Spark Application resources can be accessed in the cluster +func (c *SparkApplicationCollector) IsAvailable(ctx context.Context) bool { + gvr := schema.GroupVersionResource{ + Group: "sparkoperator.k8s.io", + Version: "v1beta2", + Resource: "sparkapplications", + } + + _, err := c.dynamicClient.Resource(gvr).List(ctx, metav1.ListOptions{Limit: 1}) + if err != nil { + c.logger.Info("Spark Application resources not available in the cluster", "error", err.Error()) + c.telemetryLogger.Report( + gen.LogLevel_LOG_LEVEL_WARN, + "SparkApplicationCollector_IsAvailable", + "Spark Application resources not available in the cluster", + err, + map[string]string{ + "resource": "sparkapplications", + }, + ) + return false + } + return true +} + +// AddResource manually adds a Spark Application resource to be processed by the collector +func (c *SparkApplicationCollector) AddResource(resource interface{}) error { + app, ok := resource.(*unstructured.Unstructured) + if !ok { + err := fmt.Errorf("expected *unstructured.Unstructured, got %T", resource) + c.telemetryLogger.Report( + gen.LogLevel_LOG_LEVEL_ERROR, + "SparkApplicationCollector_AddResource", + "Invalid resource type", + err, + map[string]string{ + "expected_type": "*unstructured.Unstructured", + "actual_type": fmt.Sprintf("%T", resource), + }, + ) + return err + } + + c.handleApplicationEvent(app, EventTypeAdd) + return nil +} diff --git a/internal/collector/types.go b/internal/collector/types.go index 2e77351f..b5af19df 100644 --- a/internal/collector/types.go +++ b/internal/collector/types.go @@ -12,7 +12,7 @@ func AllResourceTypes() []ResourceType { Cluster, ContainerResource, Namespace, CSINode, Karpenter, Datadog, ArgoRollouts, KedaScaledJob, KedaScaledObject, ClusterSnapshot, CSIDriver, CSIStorageCapacity, - VolumeAttachment, KubeflowNotebook, VolcanoJob, + VolumeAttachment, KubeflowNotebook, VolcanoJob, SparkApplication, ScheduledSparkApplication, } } @@ -175,3 +175,21 @@ type ExcludedArgoRollout struct { // Name is the Argo Rollout's name Name string `json:"name"` } + +// ExcludedSparkApplication identifies a Spark Application to exclude +type ExcludedSparkApplication struct { + // Namespace is the Spark Application's namespace + Namespace string `json:"namespace"` + + // Name is the Spark Application's name + Name string `json:"name"` +} + +// ExcludedScheduledSparkApplication identifies a Scheduled Spark Application to exclude +type ExcludedScheduledSparkApplication struct { + // Namespace is the Scheduled Spark Application's namespace + Namespace string `json:"namespace"` + + // Name is the Scheduled Spark Application's name + Name string `json:"name"` +} diff --git a/internal/controller/collectionpolicy_controller.go b/internal/controller/collectionpolicy_controller.go index 24eba89d..f06dd6f4 100644 --- a/internal/controller/collectionpolicy_controller.go +++ b/internal/controller/collectionpolicy_controller.go @@ -79,50 +79,52 @@ type CollectionPolicyReconciler struct { // PolicyConfig holds the current configuration type PolicyConfig struct { - TargetNamespaces []string - ExcludedNamespaces []string - ExcludedPods []collector.ExcludedPod - ExcludedDeployments []collector.ExcludedDeployment - ExcludedStatefulSets []collector.ExcludedStatefulSet - ExcludedDaemonSets []collector.ExcludedDaemonSet - ExcludedServices []collector.ExcludedService - ExcludedPVCs []collector.ExcludedPVC - ExcludedEvents []collector.ExcludedEvent - ExcludedJobs []collector.ExcludedJob - ExcludedCronJobs []collector.ExcludedCronJob - ExcludedReplicationControllers []collector.ExcludedReplicationController - ExcludedIngresses []collector.ExcludedIngress - ExcludedNetworkPolicies []collector.ExcludedNetworkPolicy - ExcludedEndpoints []collector.ExcludedEndpoint - ExcludedServiceAccounts []collector.ExcludedServiceAccount - ExcludedLimitRanges []collector.ExcludedLimitRange - ExcludedResourceQuotas []collector.ExcludedResourceQuota - ExcludedHPAs []collector.ExcludedHPA - ExcludedVPAs []collector.ExcludedVPA - ExcludedRoles []collector.ExcludedRole - ExcludedRoleBindings []collector.ExcludedRoleBinding - ExcludedClusterRoles []string - ExcludedClusterRoleBindings []string - ExcludedPDBs []collector.ExcludedPDB - ExcludedPSPs []string - ExcludedCRDs []string - ExcludedReplicaSet []collector.ExcludedReplicaSet - ExcludedStorageClasses []string - ExcludedPVs []string - ExcludedIngressClasses []string - ExcludedNodes []string - ExcludedCRDGroups []string - WatchedCRDs []string - ExcludedCSINodes []string - ExcludedDatadogReplicaSets []collector.ExcludedDatadogExtendedDaemonSetReplicaSet - ExcludedArgoRollouts []collector.ExcludedArgoRollout - ExcludedKedaScaledJobs []collector.ExcludedScaledJob - ExcludedKedaScaledObjects []collector.ExcludedScaledObject - ExcludedCSIDrivers []string - ExcludedCSIStorageCapacities []collector.ExcludedCSIStorageCapacity - ExcludedVolumeAttachments []string - ExcludedKubeflowNotebooks []collector.ExcludedKubeflowNotebook - ExcludedVolcanoJobs []collector.ExcludedVolcanoJob + TargetNamespaces []string + ExcludedNamespaces []string + ExcludedPods []collector.ExcludedPod + ExcludedDeployments []collector.ExcludedDeployment + ExcludedStatefulSets []collector.ExcludedStatefulSet + ExcludedDaemonSets []collector.ExcludedDaemonSet + ExcludedServices []collector.ExcludedService + ExcludedPVCs []collector.ExcludedPVC + ExcludedEvents []collector.ExcludedEvent + ExcludedJobs []collector.ExcludedJob + ExcludedCronJobs []collector.ExcludedCronJob + ExcludedReplicationControllers []collector.ExcludedReplicationController + ExcludedIngresses []collector.ExcludedIngress + ExcludedNetworkPolicies []collector.ExcludedNetworkPolicy + ExcludedEndpoints []collector.ExcludedEndpoint + ExcludedServiceAccounts []collector.ExcludedServiceAccount + ExcludedLimitRanges []collector.ExcludedLimitRange + ExcludedResourceQuotas []collector.ExcludedResourceQuota + ExcludedHPAs []collector.ExcludedHPA + ExcludedVPAs []collector.ExcludedVPA + ExcludedRoles []collector.ExcludedRole + ExcludedRoleBindings []collector.ExcludedRoleBinding + ExcludedClusterRoles []string + ExcludedClusterRoleBindings []string + ExcludedPDBs []collector.ExcludedPDB + ExcludedPSPs []string + ExcludedCRDs []string + ExcludedReplicaSet []collector.ExcludedReplicaSet + ExcludedStorageClasses []string + ExcludedPVs []string + ExcludedIngressClasses []string + ExcludedNodes []string + ExcludedCRDGroups []string + WatchedCRDs []string + ExcludedCSINodes []string + ExcludedDatadogReplicaSets []collector.ExcludedDatadogExtendedDaemonSetReplicaSet + ExcludedArgoRollouts []collector.ExcludedArgoRollout + ExcludedKedaScaledJobs []collector.ExcludedScaledJob + ExcludedKedaScaledObjects []collector.ExcludedScaledObject + ExcludedCSIDrivers []string + ExcludedCSIStorageCapacities []collector.ExcludedCSIStorageCapacity + ExcludedVolumeAttachments []string + ExcludedKubeflowNotebooks []collector.ExcludedKubeflowNotebook + ExcludedVolcanoJobs []collector.ExcludedVolcanoJob + ExcludedSparkApplications []collector.ExcludedSparkApplication + ExcludedScheduledSparkApplications []collector.ExcludedScheduledSparkApplication DisabledCollectors []string @@ -252,6 +254,7 @@ type PolicyConfig struct { //+kubebuilder:rbac:groups=keda.sh,resources=scaledobjects;scaledjobs;triggerauthentications;clustertriggerauthentications,verbs=get;list;watch //+kubebuilder:rbac:groups=kubeflow.org,resources=notebooks,verbs=get;list;watch //+kubebuilder:rbac:groups=batch.volcano.sh,resources=jobs,verbs=get;list;watch +//+kubebuilder:rbac:groups=sparkoperator.k8s.io,resources=sparkapplications;scheduledsparkapplications,verbs=get;list;watch // Reconcile is part of the main kubernetes reconciliation loop which aims to // move the current state of the cluster closer to the desired state. @@ -589,6 +592,38 @@ func (r *CollectionPolicyReconciler) createNewConfig(envSpec *monitoringv1.Colle } newConfig.ExcludedVolumeAttachments = envSpec.Exclusions.ExcludedVolumeAttachments + // Kubeflow Notebooks + for _, notebook := range envSpec.Exclusions.ExcludedKubeflowNotebooks { + newConfig.ExcludedKubeflowNotebooks = append(newConfig.ExcludedKubeflowNotebooks, collector.ExcludedKubeflowNotebook{ + Namespace: notebook.Namespace, + Name: notebook.Name, + }) + } + + // Volcano Jobs + for _, job := range envSpec.Exclusions.ExcludedVolcanoJobs { + newConfig.ExcludedVolcanoJobs = append(newConfig.ExcludedVolcanoJobs, collector.ExcludedVolcanoJob{ + Namespace: job.Namespace, + Name: job.Name, + }) + } + + // Spark Applications + for _, app := range envSpec.Exclusions.ExcludedSparkApplications { + newConfig.ExcludedSparkApplications = append(newConfig.ExcludedSparkApplications, collector.ExcludedSparkApplication{ + Namespace: app.Namespace, + Name: app.Name, + }) + } + + // Scheduled Spark Applications + for _, app := range envSpec.Exclusions.ExcludedScheduledSparkApplications { + newConfig.ExcludedScheduledSparkApplications = append(newConfig.ExcludedScheduledSparkApplications, collector.ExcludedScheduledSparkApplication{ + Namespace: app.Namespace, + Name: app.Name, + }) + } + // Events - these are special with more fields for _, event := range envSpec.Exclusions.ExcludedEvents { newConfig.ExcludedEvents = append(newConfig.ExcludedEvents, collector.ExcludedEvent{ @@ -784,6 +819,14 @@ func (r *CollectionPolicyReconciler) identifyAffectedCollectors(oldConfig, newCo affectedCollectors["volcano_job"] = true } + if !reflect.DeepEqual(oldConfig.ExcludedSparkApplications, newConfig.ExcludedSparkApplications) { + affectedCollectors["spark_application"] = true + } + + if !reflect.DeepEqual(oldConfig.ExcludedScheduledSparkApplications, newConfig.ExcludedScheduledSparkApplications) { + affectedCollectors["scheduled_spark_application"] = true + } + // Check if the special node collectors are affected by the update interval change if oldConfig.UpdateInterval != newConfig.UpdateInterval || oldConfig.PrometheusURL != newConfig.PrometheusURL || @@ -1469,6 +1512,26 @@ func (r *CollectionPolicyReconciler) restartCollectors(ctx context.Context, newC logger, r.TelemetryLogger, ) + case "spark_application": + replacedCollector = collector.NewSparkApplicationCollector( + r.DynamicClient, + newConfig.TargetNamespaces, + newConfig.ExcludedSparkApplications, + collector.DefaultMaxBatchSize, + collector.DefaultMaxBatchTime, + logger, + r.TelemetryLogger, + ) + case "scheduled_spark_application": + replacedCollector = collector.NewScheduledSparkApplicationCollector( + r.DynamicClient, + newConfig.TargetNamespaces, + newConfig.ExcludedScheduledSparkApplications, + collector.DefaultMaxBatchSize, + collector.DefaultMaxBatchTime, + logger, + r.TelemetryLogger, + ) default: logger.Info("Collector type not handled in selective restart", "type", collectorType) continue @@ -2602,6 +2665,30 @@ func (r *CollectionPolicyReconciler) registerResourceCollectors( ), name: collector.VolcanoJob, }, + { + collector: collector.NewSparkApplicationCollector( + r.DynamicClient, + config.TargetNamespaces, + config.ExcludedSparkApplications, + collector.DefaultMaxBatchSize, + collector.DefaultMaxBatchTime, + logger, + r.TelemetryLogger, + ), + name: collector.SparkApplication, + }, + { + collector: collector.NewScheduledSparkApplicationCollector( + r.DynamicClient, + config.TargetNamespaces, + config.ExcludedScheduledSparkApplications, + collector.DefaultMaxBatchSize, + collector.DefaultMaxBatchTime, + logger, + r.TelemetryLogger, + ), + name: collector.ScheduledSparkApplication, + }, } // Register all collectors @@ -3239,6 +3326,26 @@ func (r *CollectionPolicyReconciler) handleDisabledCollectorsChange( logger, r.TelemetryLogger, ) + case "spark_application": + replacedCollector = collector.NewSparkApplicationCollector( + r.DynamicClient, + newConfig.TargetNamespaces, + newConfig.ExcludedSparkApplications, + collector.DefaultMaxBatchSize, + collector.DefaultMaxBatchTime, + logger, + r.TelemetryLogger, + ) + case "scheduled_spark_application": + replacedCollector = collector.NewScheduledSparkApplicationCollector( + r.DynamicClient, + newConfig.TargetNamespaces, + newConfig.ExcludedScheduledSparkApplications, + collector.DefaultMaxBatchSize, + collector.DefaultMaxBatchTime, + logger, + r.TelemetryLogger, + ) default: logger.Info("Unknown collector type, skipping", "type", collectorType) continue diff --git a/proto/dakr_proto_descriptor.bin b/proto/dakr_proto_descriptor.bin index 849d906c1fc78fc1e59c13ae80273de4aa0c9d0c..2ae5519a26fb8990b7adc15d292dadc8abf919a3 100644 GIT binary patch delta 98286 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 E|IuTaH~;_u delta 95106 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%0As;YVYDWb z+Tu(~hOs7--6xJSkV$=&3F3=-SrDGU)^T9~5%X21RO`ax`L)*yR-#G@jz{WnWm8|< zfqDiA`o?DlL|CA;RbcGvY&CBDzV+G%5f*5*4xt?x4BKVy|`eV1rLw)I`232f{8 zBzLkcpii)D>-!|Z*wzMLaX45{SfH&qK*DbD6^AQI*wzoeZR79`fq}m4WLrOEc$i$a z#bJLAdHE&?L|9;agixM@-I%dA%7EC`kC`Aob|FMqplz;zg#9too=aNgSTIZNn-amg zodNWMcOmemL@!DJw19LFrL5oVF?H-&{Ne){*rOWTJVMX zONI*!mP-1z`2~WbF`srZ_FPHcmZ`M6&v?V#rr}C0x#?Prb}%_M%Wn@$`W=o5&*of>^wDxQD%MUt-Z>HyG=5P(Sf!;dw9abS10gvX7Q zuRk*Ga7kCy#erG(r!f$1H_(ex^E@!?78>wH)WEF!>lqM91GD@Q%q9vnC~KQza;L3) zpqHc#)Ir%o*$zeUM%19JTeAShWH-&|s#FZly0`B@7J5+{)C|tL6EFB8X>hi2+_(_0 z1~r4Tws8Rx?JZf`!U^%rim(@@z5H8}{Hck!C0lIm%0PpiTe7wRgiN%zW^J1wge0Js zq^`7Zp{|$(i(x0bZeGzeEa}uS9MOeW!-8M2vI;UN<00xC8E^4+?Fj`(;_gU zZp+3aVHpw4%aE*F@&X|V=q2fF%aBA8jZYcuPCXDBQA4us)I(S86b{Y0od*!2fL@d? zoefPyscjmXb^lKzFp`F5-9ALufTn49)>dtjm`8EIc=Mnv40m|eJ(&oEJ3Q;2Ozf(r zYDA)%0$iZoc)%0th^+guG7##BY`hRBUC?sfkz_zyhQKOUm}Yc>LK4tRQUmqCpA8h=hnt-pr(2Y2O$dR zMX7fqKL@P#_csbPW_3?jyc|0>XX7H&ETwKs}nMMhz6u zHc)s%ebhHlK&X$ZfjXLMc5E?vBAc2)(@^(+Hw{$XxrWEyBQ4J6akeWroLK0WJBZUTvYdX`y^j?s5#B`lkI!F)D0Jf-|} z)(xk+Oa3#yl7kQkw3Qr)z-N3V2O{tpU&*_xvOSx12d_a;fu5>b{cP4z41x;uR8`yOvThKEZyea2%<8Uc z`+PQNa(vt;04=uK1S0BruT3DLp3kyVs(~gDQO{>NiqHma9#@QJXHzemzT?A#d(F;r ziC)e5anj~XUYj5U0^sv#;$JsCOn5-;>)F5#E^tKb>)HL{l?sJH?CV*UHS{LW@x|z^Y-*ml--M?( zcq?0J{}Ob(1ihV&FTfnC+~Gh{-}XrbBJ*vZR3I|nR#HzS8ON)5=9&xc2~X}i*V`hF zNSN!j2UMV}Yt?~Bn5#xzd&egfqj$5Z`DFGSWwxy0q;jE`2}I^X zFB6E&g_3zW$v9E@{LtJ#A?#iL(B~6JBz)-e2~;58PXLkdq3@JWl$kHex=Ugp>n@1_k+djV7hk6-lNjLQth*!zLKM)8(jwvFM3id5;;g$QM&Ow1 z-V8ZWsrbbAgCOz)jAAnfLj5FLVb4hcp?;DryK^EZs-iCOrU$anbJaa9$yV3_3chfc zWNYjJ-4m7DrM`OtK?QoM`lF@U3cDeRFVv-3&Y@kF4>Bhev(abS)GBk!{o$nzKg)9F zTDvMIsdPWj28~SaOe2#I1@=eyAss}1imPZCO**~Qit;?pq zb2&bRkn2=`wNHAAa=hOB&*ZRl&U#<4IATfbvu;-o2xWbCZ)-Y0gs;!WTSq~rXEEB4 zO>J?)dlGU(mQ6V+q^E@cV1A#BLVobM!;vsQWZl&|Aku!wa2y=py{FzY*6AkcRF~6xs*Z2YnsW2>{=ER0$>xNqD!w`E zcE#~U{N`-DMiOLt6{DZBsb8JKdJ*y`Z-2d{u%E5{nJy27`F1~hnRpTMXK#8yWd7_; zua|Q73oVXGPYL%hlR1oKCd04C%~n=Iki=hns|t)6Zg~KRxL?$&$}D@SB5spe9@CR= zh})8MD5`DVIPrzJO~xrpJC#?AvZJJ+ySKDcmA4({rm11++#NnuIAUo#vhI#5 z5Xz41zOCb?5{U2}cK97+PAf)#WK)A9TX9b#uu7SViYXmdI@Mp!L~+;H#oxWIs(s}v21+;9(H zxI-d0+&f(bHZ%%4#d-swRiN!+fKZ1d=S_hBjKzusE#FH=Q02_rSK>0Ky#> zxrPN8hj!O>&L~E=N2xoVBF-S>?UB0%afTFeM-+69Qv@PKKzsB6NZ31~n!~&=Qtyb$ zN7l#sJ+l~%icK)@swM;zH?-*aKXR47I%i4IXCJunTYsAH{- zD#e5y7X@}~4YJTvHI5h;xpVXQLLJAyGxQ|2xTt1)pX|#H1Q+PJD)z~~?C^y< zIdVmJmXbKd7ahn#PgSu`@kNI()G4;;g3Q_Ie`=I^%IW`Xf=-Rx;n}mL|A)O;5MqH= zERe7dN3OdABKG0PZ3&z$Ej<#sRZkF9pr=azk3{x|Y~>8za36_yJ6gqlw)FpK!d2#g zo-4_ZIE2|{j;kHeb5-r8dy~Nz?sRYD zXRF%H@D>9iTA-(@+RgA5gD=z>-eS(y`q7hd(H=_s4}=T$T=+{kdWsRrYz+-uRDBUJ}2Gjg!4Hvl;{P z0^%H@7b5);ptb{mcwb23m8rZCx#23laae|{I+=KmEM=Ct?@11F&WhYn3r8f(irl6S z5DBv)x0($^!mNn>ezkh%7Nb|9)ElnSolD49A{HZL{pU)LuSOZ$i-V8~wBtD-VPB2h zTS4dAV?wV+9Ea8^opY7n*UUvvg~!&v7V%1?)*x_1DX&Gl*faY;1&W&6bqyd1do5yJ zLkEq{l}cad?|k98^{*!qq}JCXx6Dl#B)lFqvI`|ZB)lH63!~q71GLHk z687z=V2>A{7xa{!z3nUMc}n%%C}X=J5L}?=N-J|CcbNoVsB=|YblL4ZX=R?d{+aOL z^1Os1f%ANU69&q>$Zc$%C-hE~vG2)%$Uo3d;ek-!iJBc4mk=-xe6T$?cAm`ZKM7UK z-atz&;|upc30H>opXg66xq3Is*mK_J#dmCh))Ih-de@f%5J~U)QUD_9U0(|47o!DH zYOyPY^9i{i;#tUeqwRbZ!~4D%Ktu|(sss}FeP0Yf#J=xK;e09W178Xts6bCuDSY5d z0bi&e_%`c&l|p%;R}7Hc0Igzxa2I;L0O2n5dO2U{!-T5h0D7v5$ zisPdw)2QXaHCNtf%uIgL0rV+WX?zqFtVI$Q>PNnDKVSXAB3~LHBmr${07=9mUm8Fp zE%K!SMA9N(8W$9!PomTcR~qFD2>OYy6c?y8miW>D5h>6n5J=c1zBGV{UE)jQ0_kk2 zFAWe>pr@)dmip4b7wS@#Mr;HZs5q8I8GG3a1Q+PJlDsT(t3>$1U8bg2)%XITeIUYDMV#H&%V8Hv&tIB|79XUP5zgW zTgoAf0!4eOGp-6obmIj%Opz7W=SUY$r#hF2#N6wT^Hf(mf8B$zpHO6l>l2EsaD9?ctnfQ?!)z`Ze3wvUeBUJrmGOO-B$O0=Z|2YD zUgq}+MMn315{r!Pd&Q#ljf+$U8%(R0!XC975{hhXL*%Yy69&qLh{e<%6vf5GXj7E> z$=vr+cwF_Sh$T5)dbwCdvDy6iQg}pZvloOTf;LC)3OW!$n>XKr#ElTY)`@ItO zC~i}7wIF+mlKX2EG%)R(^Xlk?SHj)e0c~00iNIfdvVjQvRmqkGU82~2V@PaHevzf? zKVAu=PC!pp@_+L~V!}fGO%0l*lKkyZTkcbH)(OX&|E&u4I-=ILE0@Ifgr^szXtpPU zl&S3!q&qX02<yJ?-!l2*N0k+F`xpdTB8lSdqG=!fbst{7Zv@6&z!b zA}*C8236QG^&PJRwlK`L%!R&;Q@zvL>)Z;2n4Af^lf{b7agVy?2?~H^R=%@2ar( zz6hh^ly_BdWQ)>_QpIR&MQVo`@dmH*j;&zq%FsGWDHr3-jyE{NKfWT0uNun{=J<+6 z@mXp?#E-8y@=P`EKvHtA8T4j&bh~>iqWFxL9HHD>QH&2T3PQQJqU|yH{xRkM^mXo0 zT2<#6|2X^bo$bUp%s0RQ-Ue*cnha`;F&C4dMq{EiqA^*kCMAjkGe9IANNl^h@&!{9 z8f{TqJSsOuQ6mTnVFqv_gaG0#A_lsUL_!z=M~DLiL_z59*_S!(>RSEt*?T|lzP)>& zea?Q*`zDq0tSp(6?^|u!uAarG7!3i%)QwqL{h1NMnw6b@d4z0evooHBc%E0`bZEdM zolpwT%@_T~T;DV|E4wg56jG<>W_9jmTTq3vrZ4f5sHP)uUViQxb7RxItUM@GBTLeG z*epYrz5z6p3ozBm^iz`7W^RqAgZK#Ep=7sqQ>!@X6R(4868CjPu%uaTn zQU#$b%r5y(&2_F8UY4K97p^nkXnCff$jJ1Wf}(fiXGGzIg9MB!mSoAO&~KSdEGek6 zIbBjvWks<>)UP`#Rut{|xaZBtruMAtv=Di+JZ;bVpB)6sc%nVK;L4y{7*8zEcR#P+ zLyD1;0qXK%_F7RuV97I}PFt6Hvi6g)nx&nLZTZn$uLu}u0wSzjy@ zd3;!}W#ShjaeZFOl2Y()IuIPvxQzr1KhTw6g8HWZ3lp^6QKqE@J4gA~NI1>Pj^jPbG=*R;79r+OrAF2+gTBsOcDFfd@G@g}h)f8b?vb#+TI8~vedDP}`a znzv{+ydL9CVr!O+4^5IAiLHgY41l_|P#1ZX*eZ4LRC$%ilF5PU+(~3*_hwqImXd*R z|Bwy)a?FPNhwSTZfs1>IZAG>6E3vJpwgKw4qFP01-d0qLn~CjNa$Arq{}S7?a@?c_ zLEWC6QN1E&!`+^Z{6VM|e-k^hpU9mNuqgNYqlg1)ynnCQxqmOzz5 ziLR{d-VYe~AyB)r(=Lv=Rk&T*SH=V`4kmVH$u~o;JWA{=o)9O)-B~;#tay%TOo>)t8_1YZ(%U>E833ubI1=4i_yO2Ip|mvSDxzt7U$VK7#{aUc1qZ zJoiXeb{A2|IRna(>=bvuB?#q6cG-7zu;S2OKAx5CviY=)=E{D@b+W>-L%EMm1ygLk zYoodF+$lC}_oO0fiVfR65K&Vsy7n`*xR1^Sci8-@*Ui-7cN8QY4DKjMIvCs`lA7E{ z&;O}5@AEsZyQdZ$pWIuK&aP9%!C(ju=uVqge`hYO-f6>`g;Ye{X~UTX=t?<_)T6ij z@3wTWb@#PpcN(+25lUGT^>vy}u6HvBq8HO_c+dlpI?aX$JrJqWERQQs)ivqeHY{t7 zXby&D4TO8QJ;SeRAl$ocSk><2bB_&s7zpY;HazlxQ17wfkq3f$k9B)klHSZo&Xyif zX9nWT|7Mu~X)*EB;rwRxW_rGFyZQKin@xH6bQ_N5WKeFp4M%ezBB$GMG{0HZ-)G&? zyb9pVb6>$!x9+pyXihH7`z%LK#()ZGX>Nnn6NtwH(7&MoISS=ASUmxel-pqS1VmD9 zKk2NVkOaEl#=w+7M1i9yeI2{M5T!Sl`)#m#qOc=7tEVI#T`50kOAq&TH&$Qtmb`V@(=upbV>bMH075~4{sJBd^)Va%JODy{%!WS?ZV`IihMzJ(P=StGrHvZX$8Gra0O(2w zA0W+@@{_i-ER0JtC7;ylJBiLUD|Xg=n>=NW8&WXY^KDIk7ds26fm>kHGhHAohv`2F zK6aK%xPi7Tupb>*6hX!U+c309pg9XHroO&THt|I^S<+jl#%z%#HqS-G>uNS`Gk-ci z_YGWNKW)j+ZNk+^3~=rvxGe7UwhGAiB-s|4CE@i!HQB)U+(Nd}+`O zH>;0JZQ@?ygy;{@e~|@3UTTMo@B`$OW2wFD%g$Fsv*xVb;vKHP`;DUcrb(^MZG=P5 zKeN@;RmpMhUkFtb+HHgPPXeR??G~SKz5(b(N1WVdx7L7O>48u?EVdz1dLYye8|HRQ zrM$wHR)x78L&+63xHcJ+RO#2VQR&Axr3ZSY2U7UisPsU@J{y&OjOy%+N)KYvfnMo> zET7J(^FUWP=sXZfozi*tfqRUU{<*01AVwGHl^zK9xv2C&xX(qUA0xCfjtdAXFjA%S zE2GYn>k5Z)8Cxl@w$;+BVPM8mbhX8!fD~}7l>Rq1SsN4(O!jZ0(gURsYogLSO#eyn zO79YA%9^P2E&&m1qRzVnQ#qfMp!8#DZ25VcywqE#2JQK%^kl2f^-}uts}3>5>!S|4 z1j?_E%I^~B?|Lb}qTDHg0x#P13a8`_(?$~fx^xMyM8k-p1R`FvmtF3(aI9MJicK!^ z|1JXIgZ(-H!hXdLaUUI0Alz4Mu<;qI%74o`a5@Tt3iQekbh$zKflzA%86wNSG9nhpOKw5UlNqXvT*6rk5&AcZ$Z4F)21W7OalwdnPz!60T3=rtIKq}QVc z16|>u!BsG#UXR;$i!^vs)L;;u19~+C!rc@#7zlM!)ZiAO%~69vP=S#u4c;6zm|R!* ztg81T(OM~Qv8A11U|K1<#fFfFt@fW&!E3Nfpeb9U z2D=1AY?TIItX)8P-i#Vdw(8vGG&rC3M`NqoqWZc#3U7<* z>k<&YEvl~)D6rk8mpbKimAs5)Bs@B@nUQe(4gYzOAah3-xs>2$Dqz*sCuX zc2`tiAl$B~zOAbKt*E{rs6em2K$jcT7YOw&sjsZR$6+6AOM7jfA=fuvJ#pgrAADb7 z&c1r|y2ysg8WPP^mO$Znl>&mZ0$6`4dT=#GjEq=N2v(jBL^z2i^1 z7XVP)cM7JO_D($Mk_+=44XUpUz1^eA8uJZ*GIhiE6g&ytQ`9Im-J=>6hIM?U++*>b zSG$8StUWqy$s%FAn!Ycu?l7Nh+7};ABqC^^`?l2FiXNJLUXvyw=)*{K76=bsmV#B@xO28!l^rP!3qWRm<(}c%i@K4|L&n z_b&xSYwIsI7$8$dg)9chGL{*yQ|7_^{VwyV;RlO`>2!I};;Y5?MW@Sy7Grtc&P}M4 z-?ydX`HgRJJNLfDT!+`ebbu zO}~lXZ*IG3^2D}LKWuKB)H?CjL0My;vro9PbX{%C`KHg9%5Z$5rZ;ue=!xI^UhCvR z))nt_-AS?dWiFl4`A=KYFE(9TUsE?K=EX`bt<>}@61}8hSJw>9f8Ci5?%3Xvjz8%m zi>LLe$trzIrK9FQ-raUi$CTUBYtQb})vC8hoOsK?Xms=E}OQYW`s z&HwHsnAC#UIDp=61jyL!PKJHTDHM>g+nofH+FDKD+et7x20;Zzs`TOQWSDb3LN(Hd zw-wh!wN`7T5Z#G)gFvpHNWjRI$BnYbgwRCkdedKv02^Dg}8b8Rj=p za$RBP`d^(zLG~ocrT%~bgbR*bY092t*cU=?r73%o5q@{B)%znMf<7HGWwZf|)V@&n z7QNN&#NOE3TJ`SFiT9I3Bg)v?3P-Lka{rtR^M+Vt!~JvO{pL`bYl?Rntx&CO`+)uc zK_=99V{9WJ)OQuz$WJZT6+Maf2!S9uT?DGuoBImG?Ma4t%OoJ&p5#1vh|oxJZ$W4x z_r*{ME-wa~rAzT~3MveuKdU!{C7DZQW9KAC=@dN2t#y#1tShhhXW5d8r9 zegF}8CP}qGCjj@I(%jn%%G(w{V zjE&G0=$%C)7@oU|vKk&>UCn7c$&sYX&%0E36spLb(%q)?08ybv=Bt*a{qwsQrdRa4 zTXBGNoTzA^?lt-8Gt*Ce3V`H$O;~9_B;TumO*$d~>Ce4}^OhWdSJe0ECO_$c^z8iB zMQOQddO_3}PLDp4DG719d?d?1e?^0IfBx{I^kdcDC_E&hFGS&qbxHdDroaDeMlKTW zH}11plGazsGfe4mYdgF~fL2!YQt3J&txa!laf=ZueoA8TBz1u5*kt)HnqyK7hq0Tn^2<1K*)ClBXOX~{hlLwnR~$yFaN zxX%8+;7X|;F1T8A4;NhKYHmT*Umrlf$=2)I0@z!v9#L}(Dvzi~BDGrY?9aiGt7jB} zd}5RJjC!Qt@{A&okKc{zo%uO1QuT;>G=^Rv7wV%5z2FCmN7TF+exyE;g92bRa`lXw zS8(-=nis>5)H@FaaZd!%`N!hM288-p+}D6mA2ZH5Sd#Xylz(ALPX|Sn2mW6e>zx?& zm!ejmjJ*NUB%q&mAcdcdK{0@ceKPi@zw~K-R8$aDV5CY>=SM{)7wY_|sQtD07DNx$ zRUjG!_76EAqIzTV01-uK9&ZH>MAQNk99s7mdMa-CAjSpgH+&$}r{cH(UE#3b_gAe8 z8GmO=_*|2V`aApSuA`RnxP~@PmW?10SGAzzUO`HDq|>HO-T6o7gtKF}~h3hIc6U-MOXt zrU{c<8Yj2iGep!$ZYuDMkv#4GBT4#*oMs3vIY5uCJ-#3zUV5Pj$lztubQZ^4O z4c;N7TLYz*tD>WO5MqIT-vUy0mEnA;2Q(0|t8}jU3{o2^Bki~$oHN^rJ7)k4TRzX2k8%-2C4kZ`KcZ0*+obn5}^>%$M5_= zC@*W7$RBEh(5rb{M|w#U!FIehkqG5gGtl3U0aZw@`V|hTK`Om5|6@mbX4A&Fph$$W z(S-jmflxLY3@R}{gTml$$}d=!-Z*?yL6OdGirXn=plnjihN~FkL436|rQheB%hIpa zZZUlK(r2AP8po~qfaU2$!->G+CyPV`ZH zGA_T}ht2Kz2g}pTo3^u{HO)$70Joc7t2_zf6Wis%n1Ncl@(C-_8$a1)dMyTZitRGJ z7K56QF2n8nZLStFcbR0=kk-60PY2{DJ)4ed+GTp}+%#dkOs}1rCS#YusL5M(fV%Ss zpG`+!+-=HkWz$3*V!BOZG#u3Bf44d7^PvNpscv({*kG~2Ozq7-+nL_bw6|!nj=Xz| z7Hg*Vs>L_B79+kVf3`FIR<)<7R0rQ4)9CK5XoF^|$6Pf*3kk^Pvfm_M2~E&;u)i2m zS^w=XhE%)5ehsOX=io~DpeY>=%Tx9}2MwRi^o}(+$(ZUxCT++sdC;7luliM5J`d>E z!C*J#hhkV&AYu<`|JG-@!P5BmOgiL$|B0VoLk8U=CrZ(3de3~st3A0$dCxx%lXOU> zOpuJDp>eVxB1pz5?t|nIso{});&bUarynul#|aWCbHohvzdHhvb|hc+T>AO{26ezs A&;S4c From 6eaee488353e21759564a22370f27da6c9d4e263 Mon Sep 17 00:00:00 2001 From: Sandipan Panda Date: Tue, 23 Dec 2025 22:41:36 +0530 Subject: [PATCH 2/9] update crd to include exclusion fields for missing resources --- api/v1/zz_generated.deepcopy.go | 80 +++++++++++++++++++ .../bases/devzero.io_collectionpolicies.yaml | 68 ++++++++++++++++ config/rbac/role.yaml | 18 ++--- dist/backend-install.yaml | 18 ++--- dist/install.yaml | 18 ++--- dist/installer_updater.yaml | 18 ++--- dist/zxporter.yaml | 18 ++--- 7 files changed, 193 insertions(+), 45 deletions(-) diff --git a/api/v1/zz_generated.deepcopy.go b/api/v1/zz_generated.deepcopy.go index 82041c28..c99e076c 100644 --- a/api/v1/zz_generated.deepcopy.go +++ b/api/v1/zz_generated.deepcopy.go @@ -296,6 +296,21 @@ func (in *ExcludedJob) DeepCopy() *ExcludedJob { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExcludedKubeflowNotebook) DeepCopyInto(out *ExcludedKubeflowNotebook) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExcludedKubeflowNotebook. +func (in *ExcludedKubeflowNotebook) DeepCopy() *ExcludedKubeflowNotebook { + if in == nil { + return nil + } + out := new(ExcludedKubeflowNotebook) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ExcludedLimitRange) DeepCopyInto(out *ExcludedLimitRange) { *out = *in @@ -461,6 +476,21 @@ func (in *ExcludedScaledObject) DeepCopy() *ExcludedScaledObject { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExcludedScheduledSparkApplication) DeepCopyInto(out *ExcludedScheduledSparkApplication) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExcludedScheduledSparkApplication. +func (in *ExcludedScheduledSparkApplication) DeepCopy() *ExcludedScheduledSparkApplication { + if in == nil { + return nil + } + out := new(ExcludedScheduledSparkApplication) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ExcludedSecret) DeepCopyInto(out *ExcludedSecret) { *out = *in @@ -506,6 +536,21 @@ func (in *ExcludedServiceAccount) DeepCopy() *ExcludedServiceAccount { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExcludedSparkApplication) DeepCopyInto(out *ExcludedSparkApplication) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExcludedSparkApplication. +func (in *ExcludedSparkApplication) DeepCopy() *ExcludedSparkApplication { + if in == nil { + return nil + } + out := new(ExcludedSparkApplication) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ExcludedStatefulSet) DeepCopyInto(out *ExcludedStatefulSet) { *out = *in @@ -536,6 +581,21 @@ func (in *ExcludedVPA) DeepCopy() *ExcludedVPA { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExcludedVolcanoJob) DeepCopyInto(out *ExcludedVolcanoJob) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExcludedVolcanoJob. +func (in *ExcludedVolcanoJob) DeepCopy() *ExcludedVolcanoJob { + if in == nil { + return nil + } + out := new(ExcludedVolcanoJob) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Exclusions) DeepCopyInto(out *Exclusions) { *out = *in @@ -741,6 +801,26 @@ func (in *Exclusions) DeepCopyInto(out *Exclusions) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.ExcludedKubeflowNotebooks != nil { + in, out := &in.ExcludedKubeflowNotebooks, &out.ExcludedKubeflowNotebooks + *out = make([]ExcludedKubeflowNotebook, len(*in)) + copy(*out, *in) + } + if in.ExcludedVolcanoJobs != nil { + in, out := &in.ExcludedVolcanoJobs, &out.ExcludedVolcanoJobs + *out = make([]ExcludedVolcanoJob, len(*in)) + copy(*out, *in) + } + if in.ExcludedSparkApplications != nil { + in, out := &in.ExcludedSparkApplications, &out.ExcludedSparkApplications + *out = make([]ExcludedSparkApplication, len(*in)) + copy(*out, *in) + } + if in.ExcludedScheduledSparkApplications != nil { + in, out := &in.ExcludedScheduledSparkApplications, &out.ExcludedScheduledSparkApplications + *out = make([]ExcludedScheduledSparkApplication, len(*in)) + copy(*out, *in) + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Exclusions. diff --git a/config/crd/bases/devzero.io_collectionpolicies.yaml b/config/crd/bases/devzero.io_collectionpolicies.yaml index 72c7d89f..862e0077 100644 --- a/config/crd/bases/devzero.io_collectionpolicies.yaml +++ b/config/crd/bases/devzero.io_collectionpolicies.yaml @@ -261,6 +261,23 @@ spec: - namespace type: object type: array + excludedKubeflowNotebooks: + description: Kubeflow Notebooks Exclusions + items: + description: ExcludedKubeflowNotebook identifies a Kubeflow + Notebook to exclude + properties: + name: + description: Name is the Kubeflow Notebook's name + type: string + namespace: + description: Namespace is the Kubeflow Notebook's namespace + type: string + required: + - name + - namespace + type: object + type: array excludedLabels: additionalProperties: type: string @@ -465,6 +482,23 @@ spec: - namespace type: object type: array + excludedScheduledSparkApplications: + items: + description: ExcludedScheduledSparkApplication identifies a + Scheduled Spark Application to exclude + properties: + name: + description: Name is the Scheduled Spark Application's name + type: string + namespace: + description: Namespace is the Scheduled Spark Application's + namespace + type: string + required: + - name + - namespace + type: object + type: array excludedSecrets: items: description: ExcludedSecret identifies a secret to exclude @@ -512,6 +546,23 @@ spec: - namespace type: object type: array + excludedSparkApplications: + description: Spark Applications Exclusions + items: + description: ExcludedSparkApplication identifies a Spark Application + to exclude + properties: + name: + description: Name is the Spark Application's name + type: string + namespace: + description: Namespace is the Spark Application's namespace + type: string + required: + - name + - namespace + type: object + type: array excludedStatefulSets: items: description: ExcludedStatefulSet identifies a statefulset to @@ -549,6 +600,23 @@ spec: - namespace type: object type: array + excludedVolcanoJobs: + description: VolcanoJobs Exclusions + items: + description: ExcludedVolcanoJob identifies a Volcano Job to + exclude + properties: + name: + description: Name is the Volcano Job's name + type: string + namespace: + description: Namespace is the Volcano Job's namespace + type: string + required: + - name + - namespace + type: object + type: array excludedVolumeAttachments: items: type: string diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index 018f7a79..07a4a3e8 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -294,22 +294,22 @@ rules: - list - watch - apiGroups: - - storage.k8s.io + - sparkoperator.k8s.io resources: - - csidrivers - - csinodes - - csistoragecapacities - - storageclasses - - volumeattachments + - scheduledsparkapplications + - sparkapplications verbs: - get - list - watch - apiGroups: - - sparkoperator.k8s.io + - storage.k8s.io resources: - - sparkapplications - - scheduledsparkapplications + - csidrivers + - csinodes + - csistoragecapacities + - storageclasses + - volumeattachments verbs: - get - list diff --git a/dist/backend-install.yaml b/dist/backend-install.yaml index eed02f20..084977cb 100644 --- a/dist/backend-install.yaml +++ b/dist/backend-install.yaml @@ -1248,22 +1248,22 @@ rules: - list - watch - apiGroups: - - storage.k8s.io + - sparkoperator.k8s.io resources: - - csidrivers - - csinodes - - csistoragecapacities - - storageclasses - - volumeattachments + - scheduledsparkapplications + - sparkapplications verbs: - get - list - watch - apiGroups: - - sparkoperator.k8s.io + - storage.k8s.io resources: - - sparkapplications - - scheduledsparkapplications + - csidrivers + - csinodes + - csistoragecapacities + - storageclasses + - volumeattachments verbs: - get - list diff --git a/dist/install.yaml b/dist/install.yaml index 206742e3..589b05fc 100644 --- a/dist/install.yaml +++ b/dist/install.yaml @@ -1253,22 +1253,22 @@ rules: - list - watch - apiGroups: - - storage.k8s.io + - sparkoperator.k8s.io resources: - - csidrivers - - csinodes - - csistoragecapacities - - storageclasses - - volumeattachments + - scheduledsparkapplications + - sparkapplications verbs: - get - list - watch - apiGroups: - - sparkoperator.k8s.io + - storage.k8s.io resources: - - sparkapplications - - scheduledsparkapplications + - csidrivers + - csinodes + - csistoragecapacities + - storageclasses + - volumeattachments verbs: - get - list diff --git a/dist/installer_updater.yaml b/dist/installer_updater.yaml index 4c49d970..16355e68 100644 --- a/dist/installer_updater.yaml +++ b/dist/installer_updater.yaml @@ -1248,22 +1248,22 @@ rules: - list - watch - apiGroups: - - storage.k8s.io + - sparkoperator.k8s.io resources: - - csidrivers - - csinodes - - csistoragecapacities - - storageclasses - - volumeattachments + - scheduledsparkapplications + - sparkapplications verbs: - get - list - watch - apiGroups: - - sparkoperator.k8s.io + - storage.k8s.io resources: - - sparkapplications - - scheduledsparkapplications + - csidrivers + - csinodes + - csistoragecapacities + - storageclasses + - volumeattachments verbs: - get - list diff --git a/dist/zxporter.yaml b/dist/zxporter.yaml index 0a03010f..c2753e65 100644 --- a/dist/zxporter.yaml +++ b/dist/zxporter.yaml @@ -432,22 +432,22 @@ rules: - list - watch - apiGroups: - - storage.k8s.io + - sparkoperator.k8s.io resources: - - csidrivers - - csinodes - - csistoragecapacities - - storageclasses - - volumeattachments + - scheduledsparkapplications + - sparkapplications verbs: - get - list - watch - apiGroups: - - sparkoperator.k8s.io + - storage.k8s.io resources: - - sparkapplications - - scheduledsparkapplications + - csidrivers + - csinodes + - csistoragecapacities + - storageclasses + - volumeattachments verbs: - get - list From 0e873e404dd99a9e9bbaedeb4207cf0a9e990e7c Mon Sep 17 00:00:00 2001 From: Sandipan Panda Date: Thu, 15 Jan 2026 20:17:21 +0530 Subject: [PATCH 3/9] lint --- gen/api/v1/k8s.pb.go | 5 +++-- internal/collector/helper.go | 5 +++-- internal/collector/interface.go | 4 ++-- .../scheduled_spark_application_collector.go | 4 +++- .../collector/spark_application_collector.go | 4 +++- .../controller/collectionpolicy_controller.go | 2 +- proto/dakr_proto_descriptor.bin | Bin 311027 -> 311278 bytes 7 files changed, 15 insertions(+), 9 deletions(-) diff --git a/gen/api/v1/k8s.pb.go b/gen/api/v1/k8s.pb.go index 7e1b709d..fa5acb32 100644 --- a/gen/api/v1/k8s.pb.go +++ b/gen/api/v1/k8s.pb.go @@ -7,12 +7,13 @@ package apiv1 import ( + reflect "reflect" + sync "sync" + money "google.golang.org/genproto/googleapis/type/money" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" ) const ( diff --git a/internal/collector/helper.go b/internal/collector/helper.go index aff3e330..32641568 100644 --- a/internal/collector/helper.go +++ b/internal/collector/helper.go @@ -2,10 +2,11 @@ package collector import ( "fmt" - v2 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1" "sort" "strings" + + v2 "k8s.io/api/core/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) // isResourceTypeUnavailableError checks if the error indicates the resource type is not available diff --git a/internal/collector/interface.go b/internal/collector/interface.go index 385a4d07..e4f68078 100644 --- a/internal/collector/interface.go +++ b/internal/collector/interface.go @@ -309,8 +309,8 @@ func (r ResourceType) ProtoType() gen.ResourceType { return gen.ResourceType_RESOURCE_TYPE_VOLCANO_JOB case SparkApplication: return gen.ResourceType_RESOURCE_TYPE_SPARK_APPLICATION - // case ScheduledSparkApplication: - // return gen.ResourceType_RESOURCE_TYPE_SCHEDULED_SPARK_APPLICATION + case ScheduledSparkApplication: + return gen.ResourceType_RESOURCE_TYPE_SCHEDULED_SPARK_APPLICATION default: return gen.ResourceType_RESOURCE_TYPE_UNSPECIFIED } diff --git a/internal/collector/scheduled_spark_application_collector.go b/internal/collector/scheduled_spark_application_collector.go index a4a7f9ea..6bb365e0 100644 --- a/internal/collector/scheduled_spark_application_collector.go +++ b/internal/collector/scheduled_spark_application_collector.go @@ -232,7 +232,9 @@ func (c *ScheduledSparkApplicationCollector) Start(ctx context.Context) error { go func() { select { case <-ctx.Done(): - c.Stop() + if err := c.Stop(); err != nil { + c.logger.Error(err, "Error stopping Scheduled Spark Application collector") + } case <-stopCh: // Channel was closed by Stop() method } diff --git a/internal/collector/spark_application_collector.go b/internal/collector/spark_application_collector.go index e6fcc438..eba7a682 100644 --- a/internal/collector/spark_application_collector.go +++ b/internal/collector/spark_application_collector.go @@ -232,7 +232,9 @@ func (c *SparkApplicationCollector) Start(ctx context.Context) error { go func() { select { case <-ctx.Done(): - c.Stop() + if err := c.Stop(); err != nil { + c.logger.Error(err, "Error stopping Spark Application collector") + } case <-stopCh: // Channel was closed by Stop() method } diff --git a/internal/controller/collectionpolicy_controller.go b/internal/controller/collectionpolicy_controller.go index f06dd6f4..5ab941d7 100644 --- a/internal/controller/collectionpolicy_controller.go +++ b/internal/controller/collectionpolicy_controller.go @@ -279,7 +279,7 @@ func (r *CollectionPolicyReconciler) Reconcile(ctx context.Context, req ctrl.Req "zxporter_version": version.Get().String(), }, ) - logger.Error(err, "Error loading ENV varaibles") + logger.Error(err, "Error loading ENV variables") } // Create a new config object from the policy and environment diff --git a/proto/dakr_proto_descriptor.bin b/proto/dakr_proto_descriptor.bin index 2ae5519a26fb8990b7adc15d292dadc8abf919a3..87bcebe950120c19d14e78a8f84a6d90766a7e27 100644 GIT binary patch delta 20322 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 delta 20085 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 B^O^tv From e9fa25071925d84d0d9ed9a2a6ab79cfece62f20 Mon Sep 17 00:00:00 2001 From: Sandipan Panda Date: Thu, 15 Jan 2026 20:59:42 +0530 Subject: [PATCH 4/9] nit --- internal/controller/collectionpolicy_controller.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/controller/collectionpolicy_controller.go b/internal/controller/collectionpolicy_controller.go index 5ab941d7..da679e67 100644 --- a/internal/controller/collectionpolicy_controller.go +++ b/internal/controller/collectionpolicy_controller.go @@ -254,7 +254,7 @@ type PolicyConfig struct { //+kubebuilder:rbac:groups=keda.sh,resources=scaledobjects;scaledjobs;triggerauthentications;clustertriggerauthentications,verbs=get;list;watch //+kubebuilder:rbac:groups=kubeflow.org,resources=notebooks,verbs=get;list;watch //+kubebuilder:rbac:groups=batch.volcano.sh,resources=jobs,verbs=get;list;watch -//+kubebuilder:rbac:groups=sparkoperator.k8s.io,resources=sparkapplications;scheduledsparkapplications,verbs=get;list;watch +// +kubebuilder:rbac:groups=sparkoperator.k8s.io,resources=sparkapplications;scheduledsparkapplications,verbs=get;list;watch // Reconcile is part of the main kubernetes reconciliation loop which aims to // move the current state of the cluster closer to the desired state. From dc00f8560133e305772fb175b75f6b41f7d33fc1 Mon Sep 17 00:00:00 2001 From: Sandipan Panda Date: Thu, 15 Jan 2026 21:35:26 +0530 Subject: [PATCH 5/9] nit --- .../scheduled_spark_application_collector.go | 44 +++++++++---------- .../collector/spark_application_collector.go | 44 +++++++++---------- 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/internal/collector/scheduled_spark_application_collector.go b/internal/collector/scheduled_spark_application_collector.go index 6bb365e0..03a50267 100644 --- a/internal/collector/scheduled_spark_application_collector.go +++ b/internal/collector/scheduled_spark_application_collector.go @@ -19,7 +19,7 @@ import ( "k8s.io/client-go/tools/cache" ) -// ScheduledSparkApplicationCollector watches for Scheduled Spark Application resources +// ScheduledSparkApplicationCollector watches for ScheduledSparkApplication resources type ScheduledSparkApplicationCollector struct { dynamicClient dynamic.Interface batchChan chan CollectedResource @@ -35,7 +35,7 @@ type ScheduledSparkApplicationCollector struct { mu sync.RWMutex } -// NewScheduledSparkApplicationCollector creates a new collector for Scheduled Spark Application resources +// NewScheduledSparkApplicationCollector creates a new collector for ScheduledSparkApplication resources func NewScheduledSparkApplicationCollector( dynamicClient dynamic.Interface, namespaces []string, @@ -80,9 +80,9 @@ func NewScheduledSparkApplicationCollector( } } -// Start begins the Scheduled Spark Application resources collection process +// Start begins the ScheduledSparkApplication resources collection process func (c *ScheduledSparkApplicationCollector) Start(ctx context.Context) error { - c.logger.Info("Starting Scheduled Spark Application collector", "namespaces", c.namespaces) + c.logger.Info("Starting ScheduledSparkApplication collector", "namespaces", c.namespaces) gvr := schema.GroupVersionResource{ Group: "sparkoperator.k8s.io", @@ -196,7 +196,7 @@ func (c *ScheduledSparkApplicationCollector) Start(ctx context.Context) error { "resource": "scheduledsparkapplications", }, ) - return fmt.Errorf("failed to add event handler to informer for Scheduled Spark Applications: %w", err) + return fmt.Errorf("failed to add event handler to informer for ScheduledSparkApplications: %w", err) } appKey := "scheduled-spark-applications" @@ -220,12 +220,12 @@ func (c *ScheduledSparkApplicationCollector) Start(ctx context.Context) error { "timeout": "30s", }, ) - return fmt.Errorf("timeout waiting for Scheduled Spark Applications cache to sync") + return fmt.Errorf("timeout waiting for ScheduledSparkApplications cache to sync") } - c.logger.Info("Successfully started informer for Scheduled Spark Applications") + c.logger.Info("Successfully started informer for ScheduledSparkApplications") - c.logger.Info("Starting resources batcher for Scheduled Spark Applications") + c.logger.Info("Starting resources batcher for ScheduledSparkApplications") c.batcher.start() stopCh := c.stopCh @@ -233,7 +233,7 @@ func (c *ScheduledSparkApplicationCollector) Start(ctx context.Context) error { select { case <-ctx.Done(): if err := c.Stop(); err != nil { - c.logger.Error(err, "Error stopping Scheduled Spark Application collector") + c.logger.Error(err, "Error stopping ScheduledSparkApplication collector") } case <-stopCh: // Channel was closed by Stop() method @@ -243,7 +243,7 @@ func (c *ScheduledSparkApplicationCollector) Start(ctx context.Context) error { return nil } -// handleApplicationEvent processes Scheduled Spark Application events +// handleApplicationEvent processes ScheduledSparkApplication events func (c *ScheduledSparkApplicationCollector) handleApplicationEvent(obj *unstructured.Unstructured, eventType EventType) { name := obj.GetName() namespace := obj.GetNamespace() @@ -258,7 +258,7 @@ func (c *ScheduledSparkApplicationCollector) handleApplicationEvent(obj *unstruc key := fmt.Sprintf("%s/%s", namespace, name) // Send the processed resource to the batch channel - c.logger.Info("Collected Scheduled Spark Application resource", "key", key, "eventType", eventType, "resource", processedObj) + c.logger.Info("Collected ScheduledSparkApplication resource", "key", key, "eventType", eventType, "resource", processedObj) c.batchChan <- CollectedResource{ ResourceType: ScheduledSparkApplication, Object: processedObj, @@ -268,7 +268,7 @@ func (c *ScheduledSparkApplicationCollector) handleApplicationEvent(obj *unstruc } } -// processApplication extracts relevant fields from Scheduled Spark Application objects +// processApplication extracts relevant fields from ScheduledSparkApplication objects func (c *ScheduledSparkApplicationCollector) processApplication(obj *unstructured.Unstructured) map[string]interface{} { result := map[string]interface{}{ "name": obj.GetName(), @@ -308,9 +308,9 @@ func (c *ScheduledSparkApplicationCollector) isExcluded(namespace, name string) return c.excludedApplications[key] } -// Stop gracefully shuts down the Scheduled Spark Application collector +// Stop gracefully shuts down the ScheduledSparkApplication collector func (c *ScheduledSparkApplicationCollector) Stop() error { - c.logger.Info("Stopping Scheduled Spark Application collector") + c.logger.Info("Stopping ScheduledSparkApplication collector") // Stop all informers for key, stopCh := range c.informerStopChs { @@ -324,23 +324,23 @@ func (c *ScheduledSparkApplicationCollector) Stop() error { // Close the main stop channel (signals informers to stop) select { case <-c.stopCh: - c.logger.Info("Scheduled Spark Application collector stop channel already closed") + c.logger.Info("ScheduledSparkApplication collector stop channel already closed") default: close(c.stopCh) - c.logger.Info("Closed Scheduled Spark Application collector stop channel") + c.logger.Info("Closed ScheduledSparkApplication collector stop channel") } // Close the batchChan (input to the batcher). if c.batchChan != nil { close(c.batchChan) c.batchChan = nil - c.logger.Info("Closed Scheduled Spark Application collector batch input channel") + c.logger.Info("Closed ScheduledSparkApplication collector batch input channel") } // Stop the batcher (waits for completion). if c.batcher != nil { c.batcher.stop() - c.logger.Info("Scheduled Spark Application collector batcher stopped") + c.logger.Info("ScheduledSparkApplication collector batcher stopped") } // resourceChan is closed by the batcher's defer func. @@ -357,7 +357,7 @@ func (c *ScheduledSparkApplicationCollector) GetType() string { return "scheduled_spark_application" } -// IsAvailable checks if Scheduled Spark Application resources can be accessed in the cluster +// IsAvailable checks if ScheduledSparkApplication resources can be accessed in the cluster func (c *ScheduledSparkApplicationCollector) IsAvailable(ctx context.Context) bool { gvr := schema.GroupVersionResource{ Group: "sparkoperator.k8s.io", @@ -367,11 +367,11 @@ func (c *ScheduledSparkApplicationCollector) IsAvailable(ctx context.Context) bo _, err := c.dynamicClient.Resource(gvr).List(ctx, metav1.ListOptions{Limit: 1}) if err != nil { - c.logger.Info("Scheduled Spark Application resources not available in the cluster", "error", err.Error()) + c.logger.Info("ScheduledSparkApplication resources not available in the cluster", "error", err.Error()) c.telemetryLogger.Report( gen.LogLevel_LOG_LEVEL_WARN, "ScheduledSparkApplicationCollector_IsAvailable", - "Scheduled Spark Application resources not available in the cluster", + "ScheduledSparkApplication resources not available in the cluster", err, map[string]string{ "resource": "scheduledsparkapplications", @@ -382,7 +382,7 @@ func (c *ScheduledSparkApplicationCollector) IsAvailable(ctx context.Context) bo return true } -// AddResource manually adds a Scheduled Spark Application resource to be processed by the collector +// AddResource manually adds a ScheduledSparkApplication resource to be processed by the collector func (c *ScheduledSparkApplicationCollector) AddResource(resource interface{}) error { app, ok := resource.(*unstructured.Unstructured) if !ok { diff --git a/internal/collector/spark_application_collector.go b/internal/collector/spark_application_collector.go index eba7a682..64108047 100644 --- a/internal/collector/spark_application_collector.go +++ b/internal/collector/spark_application_collector.go @@ -19,7 +19,7 @@ import ( "k8s.io/client-go/tools/cache" ) -// SparkApplicationCollector watches for Spark Application resources +// SparkApplicationCollector watches for SparkApplication resources type SparkApplicationCollector struct { dynamicClient dynamic.Interface batchChan chan CollectedResource @@ -35,7 +35,7 @@ type SparkApplicationCollector struct { mu sync.RWMutex } -// NewSparkApplicationCollector creates a new collector for Spark Application resources +// NewSparkApplicationCollector creates a new collector for SparkApplication resources func NewSparkApplicationCollector( dynamicClient dynamic.Interface, namespaces []string, @@ -80,9 +80,9 @@ func NewSparkApplicationCollector( } } -// Start begins the Spark Application resources collection process +// Start begins the SparkApplication resources collection process func (c *SparkApplicationCollector) Start(ctx context.Context) error { - c.logger.Info("Starting Spark Application collector", "namespaces", c.namespaces) + c.logger.Info("Starting SparkApplication collector", "namespaces", c.namespaces) gvr := schema.GroupVersionResource{ Group: "sparkoperator.k8s.io", @@ -196,7 +196,7 @@ func (c *SparkApplicationCollector) Start(ctx context.Context) error { "resource": "sparkapplications", }, ) - return fmt.Errorf("failed to add event handler to informer for Spark Applications: %w", err) + return fmt.Errorf("failed to add event handler to informer for SparkApplications: %w", err) } appKey := "spark-applications" @@ -220,12 +220,12 @@ func (c *SparkApplicationCollector) Start(ctx context.Context) error { "timeout": "30s", }, ) - return fmt.Errorf("timeout waiting for Spark Applications cache to sync") + return fmt.Errorf("timeout waiting for SparkApplications cache to sync") } - c.logger.Info("Successfully started informer for Spark Applications") + c.logger.Info("Successfully started informer for SparkApplications") - c.logger.Info("Starting resources batcher for Spark Applications") + c.logger.Info("Starting resources batcher for SparkApplications") c.batcher.start() stopCh := c.stopCh @@ -233,7 +233,7 @@ func (c *SparkApplicationCollector) Start(ctx context.Context) error { select { case <-ctx.Done(): if err := c.Stop(); err != nil { - c.logger.Error(err, "Error stopping Spark Application collector") + c.logger.Error(err, "Error stopping SparkApplication collector") } case <-stopCh: // Channel was closed by Stop() method @@ -243,7 +243,7 @@ func (c *SparkApplicationCollector) Start(ctx context.Context) error { return nil } -// handleApplicationEvent processes Spark Application events +// handleApplicationEvent processes SparkApplication events func (c *SparkApplicationCollector) handleApplicationEvent(obj *unstructured.Unstructured, eventType EventType) { name := obj.GetName() namespace := obj.GetNamespace() @@ -258,7 +258,7 @@ func (c *SparkApplicationCollector) handleApplicationEvent(obj *unstructured.Uns key := fmt.Sprintf("%s/%s", namespace, name) // Send the processed resource to the batch channel - c.logger.Info("Collected Spark Application resource", "key", key, "eventType", eventType, "resource", processedObj) + c.logger.Info("Collected SparkApplication resource", "key", key, "eventType", eventType, "resource", processedObj) c.batchChan <- CollectedResource{ ResourceType: SparkApplication, Object: processedObj, @@ -268,7 +268,7 @@ func (c *SparkApplicationCollector) handleApplicationEvent(obj *unstructured.Uns } } -// processApplication extracts relevant fields from Spark Application objects +// processApplication extracts relevant fields from SparkApplication objects func (c *SparkApplicationCollector) processApplication(obj *unstructured.Unstructured) map[string]interface{} { result := map[string]interface{}{ "name": obj.GetName(), @@ -308,9 +308,9 @@ func (c *SparkApplicationCollector) isExcluded(namespace, name string) bool { return c.excludedApplications[key] } -// Stop gracefully shuts down the Spark Application collector +// Stop gracefully shuts down the SparkApplication collector func (c *SparkApplicationCollector) Stop() error { - c.logger.Info("Stopping Spark Application collector") + c.logger.Info("Stopping SparkApplication collector") // Stop all informers for key, stopCh := range c.informerStopChs { @@ -324,23 +324,23 @@ func (c *SparkApplicationCollector) Stop() error { // Close the main stop channel (signals informers to stop) select { case <-c.stopCh: - c.logger.Info("Spark Application collector stop channel already closed") + c.logger.Info("SparkApplication collector stop channel already closed") default: close(c.stopCh) - c.logger.Info("Closed Spark Application collector stop channel") + c.logger.Info("Closed SparkApplication collector stop channel") } // Close the batchChan (input to the batcher). if c.batchChan != nil { close(c.batchChan) c.batchChan = nil - c.logger.Info("Closed Spark Application collector batch input channel") + c.logger.Info("Closed SparkApplication collector batch input channel") } // Stop the batcher (waits for completion). if c.batcher != nil { c.batcher.stop() - c.logger.Info("Spark Application collector batcher stopped") + c.logger.Info("SparkApplication collector batcher stopped") } // resourceChan is closed by the batcher's defer func. @@ -357,7 +357,7 @@ func (c *SparkApplicationCollector) GetType() string { return "spark_application" } -// IsAvailable checks if Spark Application resources can be accessed in the cluster +// IsAvailable checks if SparkApplication resources can be accessed in the cluster func (c *SparkApplicationCollector) IsAvailable(ctx context.Context) bool { gvr := schema.GroupVersionResource{ Group: "sparkoperator.k8s.io", @@ -367,11 +367,11 @@ func (c *SparkApplicationCollector) IsAvailable(ctx context.Context) bool { _, err := c.dynamicClient.Resource(gvr).List(ctx, metav1.ListOptions{Limit: 1}) if err != nil { - c.logger.Info("Spark Application resources not available in the cluster", "error", err.Error()) + c.logger.Info("SparkApplication resources not available in the cluster", "error", err.Error()) c.telemetryLogger.Report( gen.LogLevel_LOG_LEVEL_WARN, "SparkApplicationCollector_IsAvailable", - "Spark Application resources not available in the cluster", + "SparkApplication resources not available in the cluster", err, map[string]string{ "resource": "sparkapplications", @@ -382,7 +382,7 @@ func (c *SparkApplicationCollector) IsAvailable(ctx context.Context) bool { return true } -// AddResource manually adds a Spark Application resource to be processed by the collector +// AddResource manually adds a SparkApplication resource to be processed by the collector func (c *SparkApplicationCollector) AddResource(resource interface{}) error { app, ok := resource.(*unstructured.Unstructured) if !ok { From 76741df2ad6129a5bf79c4898ecfb8d469d7dc96 Mon Sep 17 00:00:00 2001 From: Sandipan Panda Date: Tue, 20 Jan 2026 18:02:04 +0530 Subject: [PATCH 6/9] protos --- gen/api/v1/common.pb.go | 680 +++++++++++++++----------------- gen/api/v1/k8s.pb.go | 13 +- proto/dakr_proto_descriptor.bin | Bin 311278 -> 313608 bytes 3 files changed, 320 insertions(+), 373 deletions(-) diff --git a/gen/api/v1/common.pb.go b/gen/api/v1/common.pb.go index bd57117c..f7111e61 100644 --- a/gen/api/v1/common.pb.go +++ b/gen/api/v1/common.pb.go @@ -13924,138 +13924,17 @@ var file_api_v1_common_proto_rawDesc = []byte{ 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3e, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x65, 0x78, - 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x22, 0x84, 0x46, 0x0a, 0x0f, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x35, 0x0a, 0x0b, 0x70, - 0x6f, 0x64, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x64, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x6f, 0x64, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x12, 0x4a, 0x0a, 0x12, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x11, 0x64, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x4e, - 0x0a, 0x14, 0x73, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, 0x53, 0x65, - 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x12, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x66, 0x75, 0x6c, 0x53, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x48, - 0x0a, 0x12, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x10, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x53, 0x65, - 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x4b, 0x0a, 0x13, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x48, 0x00, 0x52, 0x11, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, 0x74, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x35, 0x0a, 0x0b, 0x6a, 0x6f, 0x62, 0x5f, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, - 0x52, 0x0a, 0x6a, 0x6f, 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, - 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x72, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, - 0x52, 0x0e, 0x63, 0x72, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x12, 0x41, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x48, 0x00, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x12, 0x41, 0x0a, 0x0f, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0e, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x44, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x48, 0x0a, 0x0b, 0x70, 0x76, 0x63, 0x5f, 0x64, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x8c, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x76, 0x63, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x12, 0x41, 0x0a, 0x0a, 0x70, 0x76, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x8d, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x09, 0x70, 0x76, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x12, 0x3d, 0x0a, 0x0a, 0x73, 0x63, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x18, 0x8e, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x09, 0x73, 0x63, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x12, 0x3a, 0x0a, 0x0a, 0x6e, 0x73, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x18, 0x8f, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x39, - 0x0a, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x90, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, - 0x6f, 0x64, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x6f, - 0x64, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x68, 0x70, 0x61, - 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x91, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x68, 0x70, 0x61, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x76, 0x70, 0x61, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x18, 0x92, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x56, 0x50, 0x41, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x76, - 0x70, 0x61, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x4c, 0x0a, 0x13, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x18, 0x93, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x48, 0x00, 0x52, 0x11, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, - 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x58, 0x0a, 0x17, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x18, 0xe8, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x15, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x12, 0x39, 0x0a, 0x0c, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x18, 0xe9, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, - 0x0b, 0x72, 0x6f, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x4f, 0x0a, 0x14, - 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x18, 0xea, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x12, 0x72, 0x6f, 0x6c, 0x65, 0x42, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x5f, 0x0a, - 0x1a, 0x6b, 0x65, 0x64, 0x61, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xeb, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x64, 0x61, - 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x17, 0x6b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, - 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x61, - 0x0a, 0x1a, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xec, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x72, - 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x18, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x12, 0x68, 0x0a, 0x1d, 0x70, 0x6f, 0x64, 0x5f, 0x64, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x18, 0xed, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, - 0x1a, 0x70, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, - 0x64, 0x67, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x55, 0x0a, 0x16, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x5f, 0x64, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xee, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, - 0x6f, 0x74, 0x61, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x14, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x12, 0x4c, 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x5f, 0x6a, 0x6f, - 0x62, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xef, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x63, 0x61, 0x6e, - 0x6f, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x11, 0x76, - 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x70, 0x6f, 0x64, 0x5f, 0x69, 0x70, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x6f, 0x64, 0x49, 0x70, 0x12, 0x17, 0x0a, - 0x07, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x68, 0x6f, 0x73, 0x74, 0x49, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x71, 0x6f, 0x73, - 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x71, 0x6f, - 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x22, 0x46, 0x0a, 0x0a, 0x50, 0x6f, 0x64, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x12, 0x38, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x0a, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0xb0, 0x01, 0x0a, 0x10, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, + 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, @@ -15693,245 +15572,314 @@ var file_api_v1_common_proto_rawDesc = []byte{ 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, - 0x12, 0x3b, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, - 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x71, 0x75, 0x65, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, - 0x65, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x41, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x6f, 0x72, - 0x69, 0x74, 0x79, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x56, 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x74, 0x61, - 0x73, 0x6b, 0x73, 0x22, 0xa5, 0x01, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x4a, - 0x6f, 0x62, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, - 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x78, 0x0a, 0x0b, 0x56, - 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0x8b, 0x08, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, - 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x75, 0x69, - 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x69, - 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, - 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x76, 0x6f, 0x6c, - 0x76, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, - 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x76, - 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, - 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x69, - 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, - 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x31, 0x0a, 0x14, 0x72, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x18, - 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, - 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4d, 0x6f, 0x64, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x61, 0x73, 0x73, + 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x13, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x43, 0x0a, 0x11, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x5f, 0x64, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x44, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x44, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x5f, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x12, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x75, + 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, + 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, + 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x52, + 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, + 0x51, 0x0a, 0x12, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, + 0x63, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x11, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0xdc, 0x02, 0x0a, 0x0f, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x44, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6f, 0x64, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x2d, 0x0a, 0x13, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x77, 0x65, 0x62, 0x55, 0x69, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x24, 0x0a, 0x0e, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x65, 0x62, 0x55, 0x69, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1e, 0x0a, 0x0b, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, + 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x77, 0x65, 0x62, + 0x55, 0x69, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2d, 0x0a, 0x13, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, + 0x5f, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x65, 0x62, 0x55, 0x69, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, 0x5f, + 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x77, 0x65, 0x62, 0x55, 0x69, 0x49, 0x6e, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, + 0x72, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x6f, 0x72, 0x65, 0x73, + 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x22, 0xa8, 0x02, 0x0a, 0x16, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x2c, 0x0a, 0x12, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x72, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6f, 0x6e, + 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x39, + 0x0a, 0x19, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x74, + 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x16, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x74, 0x72, + 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x41, 0x0a, 0x1d, 0x6f, 0x6e, 0x5f, + 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, + 0x72, 0x65, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x1a, 0x6f, 0x6e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x61, + 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x4e, 0x0a, 0x24, + 0x6f, 0x6e, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, + 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x76, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x20, 0x6f, 0x6e, 0x53, 0x75, + 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, + 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0xa1, 0x02, 0x0a, + 0x1a, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6c, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, + 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x10, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, + 0x72, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, + 0x6d, 0x61, 0x78, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x38, 0x0a, 0x18, + 0x73, 0x68, 0x75, 0x66, 0x66, 0x6c, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, + 0x73, 0x68, 0x75, 0x66, 0x66, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x45, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x38, 0x0a, 0x18, 0x73, 0x68, 0x75, 0x66, 0x66, 0x6c, + 0x65, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, 0x73, 0x68, 0x75, 0x66, 0x66, 0x6c, + 0x65, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x22, 0x8b, 0x08, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x1b, 0x0a, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, + 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, + 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x5f, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x12, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, + 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x13, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, + 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x69, 0x6e, 0x76, 0x6f, 0x6c, + 0x76, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x31, 0x0a, 0x14, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x13, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, + 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x11, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x37, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x2b, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, - 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x24, 0x0a, 0x0e, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x61, 0x67, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x41, 0x67, 0x65, 0x12, 0x24, - 0x0a, 0x0e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x61, 0x67, 0x65, - 0x18, 0x2d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x41, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, - 0x6e, 0x5f, 0x61, 0x67, 0x65, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, - 0x74, 0x53, 0x65, 0x65, 0x6e, 0x41, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x22, 0xc9, 0x01, 0x0a, 0x12, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, - 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x77, 0x6e, 0x65, - 0x72, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x77, 0x6e, - 0x65, 0x72, 0x55, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6b, - 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, - 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, - 0x75, 0x0a, 0x0e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x74, 0x63, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x74, 0x63, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2a, 0xe8, 0x09, 0x0a, 0x0d, 0x4b, 0x38, 0x73, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1f, 0x0a, 0x1b, 0x4b, 0x38, 0x53, 0x5f, - 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x4b, 0x38, 0x53, - 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x45, 0x50, - 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x4b, 0x38, 0x53, - 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x50, - 0x4c, 0x49, 0x43, 0x41, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x4b, 0x38, - 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x45, 0x46, 0x55, 0x4c, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x03, 0x12, 0x1e, 0x0a, 0x1a, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x2a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x53, + 0x65, 0x65, 0x6e, 0x12, 0x24, 0x0a, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x5f, 0x61, 0x67, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x41, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x61, 0x67, 0x65, 0x18, 0x2d, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x41, 0x67, 0x65, 0x12, + 0x22, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x61, 0x67, 0x65, + 0x18, 0x2e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, + 0x41, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xc9, + 0x01, 0x0a, 0x12, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x75, 0x69, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x69, 0x64, + 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x12, + 0x1d, 0x0a, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x75, 0x0a, 0x0e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, + 0x75, 0x74, 0x63, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x75, 0x74, 0x63, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, + 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2a, 0x8f, 0x0a, 0x0a, 0x0d, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, + 0x69, 0x6e, 0x64, 0x12, 0x1f, 0x0a, 0x1b, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, + 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, + 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, + 0x4e, 0x54, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, + 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x5f, + 0x53, 0x45, 0x54, 0x10, 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, + 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x46, 0x55, + 0x4c, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x03, 0x12, 0x1e, 0x0a, 0x1a, 0x4b, 0x38, 0x53, 0x5f, 0x4f, + 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x41, 0x45, 0x4d, 0x4f, + 0x4e, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x38, 0x53, 0x5f, 0x4f, + 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x05, + 0x12, 0x1c, 0x0a, 0x18, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, + 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x52, 0x4f, 0x4e, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x06, 0x12, 0x2a, + 0x0a, 0x26, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, + 0x44, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, + 0x4e, 0x54, 0x52, 0x4f, 0x4c, 0x4c, 0x45, 0x52, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x38, + 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x4f, + 0x44, 0x10, 0x08, 0x12, 0x1d, 0x0a, 0x19, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, + 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x53, 0x50, 0x41, 0x43, 0x45, + 0x10, 0x09, 0x12, 0x18, 0x0a, 0x14, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, + 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x10, 0x0a, 0x12, 0x1b, 0x0a, 0x17, + 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, + 0x49, 0x4e, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x0b, 0x12, 0x1d, 0x0a, 0x19, 0x4b, 0x38, 0x53, + 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4f, 0x4e, + 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x0c, 0x12, 0x1b, 0x0a, 0x17, 0x4b, 0x38, 0x53, 0x5f, + 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x45, 0x52, 0x56, + 0x49, 0x43, 0x45, 0x10, 0x0d, 0x12, 0x1e, 0x0a, 0x1a, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, + 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, + 0x4d, 0x41, 0x50, 0x10, 0x0e, 0x12, 0x25, 0x0a, 0x21, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, + 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x45, 0x52, 0x53, 0x49, 0x53, 0x54, + 0x45, 0x4e, 0x54, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x10, 0x0f, 0x12, 0x2b, 0x0a, 0x27, + 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, + 0x50, 0x45, 0x52, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, + 0x45, 0x5f, 0x43, 0x4c, 0x41, 0x49, 0x4d, 0x10, 0x10, 0x12, 0x21, 0x0a, 0x1d, 0x4b, 0x38, 0x53, + 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x4f, + 0x52, 0x41, 0x47, 0x45, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x10, 0x11, 0x12, 0x20, 0x0a, 0x1c, + 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, + 0x41, 0x52, 0x47, 0x4f, 0x5f, 0x52, 0x4f, 0x4c, 0x4c, 0x4f, 0x55, 0x54, 0x10, 0x12, 0x12, 0x2d, + 0x0a, 0x29, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, + 0x44, 0x5f, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x4f, 0x4e, 0x54, 0x41, 0x4c, 0x5f, 0x50, 0x4f, 0x44, + 0x5f, 0x41, 0x55, 0x54, 0x4f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x10, 0x13, 0x12, 0x2b, 0x0a, + 0x27, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, + 0x5f, 0x56, 0x45, 0x52, 0x54, 0x49, 0x43, 0x41, 0x4c, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x41, 0x55, + 0x54, 0x4f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x10, 0x14, 0x12, 0x1f, 0x0a, 0x1b, 0x4b, 0x38, + 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4c, 0x49, + 0x4d, 0x49, 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x15, 0x12, 0x23, 0x0a, 0x1f, 0x4b, + 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, + 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x16, + 0x12, 0x18, 0x0a, 0x14, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, + 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x17, 0x12, 0x20, 0x0a, 0x1c, 0x4b, 0x38, + 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x4f, + 0x4c, 0x45, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x18, 0x12, 0x26, 0x0a, 0x22, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, - 0x44, 0x41, 0x45, 0x4d, 0x4f, 0x4e, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, + 0x4b, 0x45, 0x44, 0x41, 0x5f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x44, 0x5f, 0x4f, 0x42, 0x4a, 0x45, + 0x43, 0x54, 0x10, 0x19, 0x12, 0x26, 0x0a, 0x22, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, + 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4b, 0x41, 0x52, 0x50, 0x45, 0x4e, 0x54, 0x45, + 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, 0x1a, 0x12, 0x29, 0x0a, 0x25, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, - 0x4a, 0x4f, 0x42, 0x10, 0x05, 0x12, 0x1c, 0x0a, 0x18, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, - 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x52, 0x4f, 0x4e, 0x5f, 0x4a, 0x4f, - 0x42, 0x10, 0x06, 0x12, 0x2a, 0x0a, 0x26, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, - 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x4f, 0x4c, 0x4c, 0x45, 0x52, 0x10, 0x07, 0x12, - 0x17, 0x0a, 0x13, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, - 0x4e, 0x44, 0x5f, 0x50, 0x4f, 0x44, 0x10, 0x08, 0x12, 0x1d, 0x0a, 0x19, 0x4b, 0x38, 0x53, 0x5f, - 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x41, 0x4d, 0x45, - 0x53, 0x50, 0x41, 0x43, 0x45, 0x10, 0x09, 0x12, 0x18, 0x0a, 0x14, 0x4b, 0x38, 0x53, 0x5f, 0x4f, - 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x10, - 0x0a, 0x12, 0x1b, 0x0a, 0x17, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, - 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x0b, 0x12, 0x1d, - 0x0a, 0x19, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, - 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x0c, 0x12, 0x1b, 0x0a, - 0x17, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, - 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x0d, 0x12, 0x1e, 0x0a, 0x1a, 0x4b, 0x38, - 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4f, - 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x50, 0x10, 0x0e, 0x12, 0x25, 0x0a, 0x21, 0x4b, 0x38, - 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x45, - 0x52, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x10, - 0x0f, 0x12, 0x2b, 0x0a, 0x27, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, - 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x45, 0x52, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x54, 0x5f, - 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x43, 0x4c, 0x41, 0x49, 0x4d, 0x10, 0x10, 0x12, 0x21, - 0x0a, 0x1d, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, - 0x44, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x10, - 0x11, 0x12, 0x20, 0x0a, 0x1c, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, - 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x41, 0x52, 0x47, 0x4f, 0x5f, 0x52, 0x4f, 0x4c, 0x4c, 0x4f, 0x55, - 0x54, 0x10, 0x12, 0x12, 0x2d, 0x0a, 0x29, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, - 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x4f, 0x4e, 0x54, 0x41, - 0x4c, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x41, 0x55, 0x54, 0x4f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, - 0x10, 0x13, 0x12, 0x2b, 0x0a, 0x27, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, - 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x56, 0x45, 0x52, 0x54, 0x49, 0x43, 0x41, 0x4c, 0x5f, 0x50, - 0x4f, 0x44, 0x5f, 0x41, 0x55, 0x54, 0x4f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x10, 0x14, 0x12, - 0x1f, 0x0a, 0x1b, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, - 0x4e, 0x44, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x15, - 0x12, 0x23, 0x0a, 0x1f, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, - 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x41, 0x43, 0x43, 0x4f, - 0x55, 0x4e, 0x54, 0x10, 0x16, 0x12, 0x18, 0x0a, 0x14, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, - 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x17, 0x12, + 0x50, 0x4f, 0x44, 0x5f, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, + 0x55, 0x44, 0x47, 0x45, 0x54, 0x10, 0x1b, 0x12, 0x22, 0x0a, 0x1e, 0x4b, 0x38, 0x53, 0x5f, 0x4f, + 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, + 0x52, 0x43, 0x45, 0x5f, 0x51, 0x55, 0x4f, 0x54, 0x41, 0x10, 0x1c, 0x12, 0x25, 0x0a, 0x21, 0x4b, + 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4b, + 0x55, 0x42, 0x45, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x4e, 0x4f, 0x54, 0x45, 0x42, 0x4f, 0x4f, 0x4b, + 0x10, 0x1d, 0x12, 0x1f, 0x0a, 0x1b, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, + 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x56, 0x4f, 0x4c, 0x43, 0x41, 0x4e, 0x4f, 0x5f, 0x4a, 0x4f, + 0x42, 0x10, 0x1e, 0x12, 0x1a, 0x0a, 0x16, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, + 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x45, 0x43, 0x52, 0x45, 0x54, 0x10, 0x1f, 0x12, 0x20, 0x0a, 0x1c, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, - 0x4e, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, - 0x18, 0x12, 0x26, 0x0a, 0x22, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, - 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4b, 0x45, 0x44, 0x41, 0x5f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x44, - 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x19, 0x12, 0x26, 0x0a, 0x22, 0x4b, 0x38, 0x53, - 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4b, 0x41, 0x52, - 0x50, 0x45, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, - 0x1a, 0x12, 0x29, 0x0a, 0x25, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, - 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x55, 0x44, 0x47, 0x45, 0x54, 0x10, 0x1b, 0x12, 0x22, 0x0a, 0x1e, + 0x4e, 0x44, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, + 0x20, 0x12, 0x28, 0x0a, 0x24, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, + 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x4c, + 0x45, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x21, 0x12, 0x22, 0x0a, 0x1e, 0x4b, + 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, + 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x22, 0x12, + 0x1b, 0x0a, 0x17, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, + 0x4e, 0x44, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x10, 0x23, 0x12, 0x25, 0x0a, 0x21, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, - 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x51, 0x55, 0x4f, 0x54, 0x41, 0x10, 0x1c, - 0x12, 0x25, 0x0a, 0x21, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, - 0x49, 0x4e, 0x44, 0x5f, 0x4b, 0x55, 0x42, 0x45, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x4e, 0x4f, 0x54, - 0x45, 0x42, 0x4f, 0x4f, 0x4b, 0x10, 0x1d, 0x12, 0x1f, 0x0a, 0x1b, 0x4b, 0x38, 0x53, 0x5f, 0x4f, - 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x56, 0x4f, 0x4c, 0x43, 0x41, - 0x4e, 0x4f, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x1e, 0x12, 0x1a, 0x0a, 0x16, 0x4b, 0x38, 0x53, 0x5f, - 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x45, 0x43, 0x52, - 0x45, 0x54, 0x10, 0x1f, 0x12, 0x20, 0x0a, 0x1c, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, - 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, - 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x20, 0x12, 0x28, 0x0a, 0x24, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, - 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, - 0x52, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x21, - 0x12, 0x22, 0x0a, 0x1e, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, - 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x50, 0x4f, 0x4c, 0x49, - 0x43, 0x59, 0x10, 0x22, 0x12, 0x1b, 0x0a, 0x17, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, - 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x10, - 0x23, 0x2a, 0x48, 0x0a, 0x0b, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x45, 0x6e, 0x75, 0x6d, - 0x12, 0x22, 0x0a, 0x1e, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x42, 0x59, 0x5f, 0x45, 0x4e, 0x55, - 0x4d, 0x5f, 0x44, 0x45, 0x53, 0x43, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x42, 0x59, - 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x41, 0x53, 0x43, 0x10, 0x01, 0x2a, 0x94, 0x02, 0x0a, 0x15, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x27, 0x0a, 0x23, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, - 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, - 0x0a, 0x1a, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, - 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x22, - 0x0a, 0x1e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, - 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x49, 0x4e, - 0x10, 0x02, 0x12, 0x22, 0x0a, 0x1e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, - 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x45, 0x58, - 0x49, 0x53, 0x54, 0x53, 0x10, 0x03, 0x12, 0x2a, 0x0a, 0x26, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, - 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, - 0x52, 0x5f, 0x44, 0x4f, 0x45, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x45, 0x58, 0x49, 0x53, 0x54, - 0x10, 0x04, 0x12, 0x1e, 0x0a, 0x1a, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, - 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x47, 0x54, - 0x10, 0x05, 0x12, 0x1e, 0x0a, 0x1a, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, - 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4c, 0x54, - 0x10, 0x06, 0x2a, 0xa6, 0x01, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x22, 0x57, - 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, - 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x41, 0x43, - 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, - 0x41, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, - 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x57, 0x4f, - 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x49, - 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x42, 0x4f, 0x54, 0x48, 0x10, 0x03, 0x42, 0x84, 0x01, 0x0a, 0x0a, - 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, 0x72, 0x6f, 0x2d, 0x69, 0x6e, - 0x63, 0x2f, 0x7a, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x41, 0x58, - 0x58, 0xaa, 0x02, 0x06, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x06, 0x41, 0x70, 0x69, - 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x12, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x07, 0x41, 0x70, 0x69, 0x3a, 0x3a, - 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x53, 0x50, 0x41, 0x52, 0x4b, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x10, 0x24, 0x2a, 0x48, 0x0a, 0x0b, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x45, 0x6e, + 0x75, 0x6d, 0x12, 0x22, 0x0a, 0x1e, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x42, 0x59, 0x5f, 0x45, + 0x4e, 0x55, 0x4d, 0x5f, 0x44, 0x45, 0x53, 0x43, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, + 0x42, 0x59, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x41, 0x53, 0x43, 0x10, 0x01, 0x2a, 0x94, 0x02, + 0x0a, 0x15, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x27, 0x0a, 0x23, 0x4c, 0x41, 0x42, 0x45, 0x4c, + 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, + 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x1e, 0x0a, 0x1a, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, + 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x10, 0x01, + 0x12, 0x22, 0x0a, 0x1e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, + 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, + 0x49, 0x4e, 0x10, 0x02, 0x12, 0x22, 0x0a, 0x1e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, + 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, + 0x45, 0x58, 0x49, 0x53, 0x54, 0x53, 0x10, 0x03, 0x12, 0x2a, 0x0a, 0x26, 0x4c, 0x41, 0x42, 0x45, + 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, + 0x54, 0x4f, 0x52, 0x5f, 0x44, 0x4f, 0x45, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x45, 0x58, 0x49, + 0x53, 0x54, 0x10, 0x04, 0x12, 0x1e, 0x0a, 0x1a, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, + 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, + 0x47, 0x54, 0x10, 0x05, 0x12, 0x1e, 0x0a, 0x1a, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, + 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, + 0x4c, 0x54, 0x10, 0x06, 0x2a, 0xa6, 0x01, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x26, 0x0a, + 0x22, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, + 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, + 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x57, 0x4f, 0x52, 0x4b, + 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x49, 0x4c, 0x54, + 0x45, 0x52, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, + 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, + 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x42, 0x4f, 0x54, 0x48, 0x10, 0x03, 0x42, 0x84, 0x01, + 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x43, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x30, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, 0x72, 0x6f, 0x2d, + 0x69, 0x6e, 0x63, 0x2f, 0x7a, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x6e, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, + 0x41, 0x58, 0x58, 0xaa, 0x02, 0x06, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x06, 0x41, + 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x12, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, + 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x07, 0x41, 0x70, 0x69, + 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/gen/api/v1/k8s.pb.go b/gen/api/v1/k8s.pb.go index fa5acb32..8ac3d60c 100644 --- a/gen/api/v1/k8s.pb.go +++ b/gen/api/v1/k8s.pb.go @@ -9635,13 +9635,12 @@ var file_api_v1_k8s_proto_rawDesc = []byte{ 0x6c, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3c, 0x0a, 0x0f, 0x7a, 0x78, 0x70, 0x5f, 0x6e, 0x65, 0x74, 0x6d, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, - 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x7a, 0x78, 0x70, 0x4e, 0x65, 0x74, 0x6d, 0x6f, 0x6e, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x45, 0x0a, 0x14, 0x7a, 0x78, 0x70, 0x5f, 0x6e, 0x65, 0x74, 0x6d, - 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x6c, 0x6d, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x7a, 0x78, 0x70, 0x4e, 0x65, 0x74, - 0x6d, 0x6f, 0x6e, 0x48, 0x65, 0x6c, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x0c, 0x64, - 0x61, 0x6b, 0x72, 0x5f, 0x6f, 0x70, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x7a, 0x78, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x38, + 0x0a, 0x0d, 0x7a, 0x78, 0x70, 0x5f, 0x68, 0x65, 0x6c, 0x6d, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x7a, 0x78, 0x70, + 0x48, 0x65, 0x6c, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3c, 0x0a, 0x0f, 0x7a, 0x78, 0x70, 0x5f, + 0x6e, 0x65, 0x74, 0x6d, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x64, 0x61, 0x6b, 0x72, 0x4f, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3f, 0x0a, 0x11, 0x64, 0x61, 0x6b, 0x72, 0x5f, 0x6f, 0x70, 0x5f, 0x68, diff --git a/proto/dakr_proto_descriptor.bin b/proto/dakr_proto_descriptor.bin index 87bcebe950120c19d14e78a8f84a6d90766a7e27..7c597bce6590d495313978cd9a25f9ca3d0be6ba 100644 GIT binary patch delta 84793 zcmZsEXMk0;*7hW4pMA;z0~|Ip6a#c`3z24%`doPCGktR*0 zSg0yRrAt-1bfkldfZy}%?2!Au@AvPlB+tsq%1W}blI(NlFR#zAq6^NHlb41}Jy*_? zUnV}iP`i9|c+1AMhI@@`+IM)R?F;SOc7CDb%kP$aCMl|l)^Vmi(6)2ym*4fO z$BW!7(Ya%r_MP5r*SX}gezA<8*rP$RS0nD-EDLTgy!GeygQZrn_n=!eTOQqwAFk&c@^V@Od+3Vr;@MvrF{GN^tHzSo*o}Fz>P<| za9Y}yPtWZCu8i38>F3u+6%^U3b-JirHY;8*9(F>qQpj`GiE`!R#p4dh%AT`c$nxq# zlxbQzC{r0_){C;qczwT270>xW$kLfv$p>H%sW;lb+xCqlbo*Y1j;|;0Z`-+JyO%q~ z)vA~%TCYmjFB=UQRS_g(#SIC*KZuf<@sd8@s-Ck!$fQPA1rn4&Rt0i{h-C)Isz7cK zWy;0N`^ajZvyoCq<07keH6TG5WHlf+ikN9jH6S;#EgD(fb2h1PT$IbN4%j9Os}9&E z5laRYRtId8s8A`M@GGq0Ih%#d&W+gR`@@nq`(9jhDi!c zwu)GpfJq8Wwu)qSz$C|e-PtB&)&IjK2V9V0xa5G#HW7n~`o@z3F55(MYJVSnvKn@t`9Vr1hATmqG>-Z2* z2i3m|ih8Mo77_yFpoo`q4A@~a12{4a*kMtoY`m6Vlj}LZ3?Fr)MqNj`VDXE^xxoEm z3?I3`{UVa(0|_IZb3~mh1PPB=NCc20Ru2(Cj!+LdepOM=IXe8IzpB@FWE52$wYVs7 zN3Doa;EqzndOj}ZImcka!x#LOf|M~pL2APR3Ft8^Wem_`9G(q)Xxwv-t9W72D0SRI z;(#1CGn6CafE?!xr8_v?b55wY3ZsKhSV%e`C(KB3WI7-xI3LyZYboG4C)K9H;+E7& z3n>7|Nf9d-^i}~tPKxY`{)l&ELC-m*Y8MerQl~7WARwpAB!M!3oZ=+W)UTzG=bTm( zg=h#R6oL{?TVNpoPm7qb@IF~KPMxuk!hoC+u?j)E3IlRRRIVDY<_lTGbIz(|o~V&JYavAdIcxi<2q0(K zM|u!?o^wu>4*BAF5bvA?dH|lY;&}j`qj**Qx{7+vdG%INQ9X6uLW%-%-u6^cK+dzL z^tdYKITzH1kf@^06vZgHU~$EOyI`v-2HXW!rJGgUb1tg##n7ya7E&CLi?&(C0lCO# zX=_h-&Lx%ai0aUK0?oQ)fe8RF*?vv{c!~X7$!}H(&$+CAc0_pqO8|J;0!sjR*^ZME z0AA)|t|!2fo^wUzhDA95O9FVs0!spT#SYAp0A3N9SwZVcdCqU@-^J0o-z=mQAivqx zl>+29wodCl({p}Td%~h3>dHi2zgu7?fWO-w$OQ0r_CU&SU1`txL)CUgH2_Nk_=g3S z2JjEFTq762Ke$}$uFLYAt7@Q&uA7%Y*Il)^Ea0x%k(LGARgN^>4`n>(PjxUMa#Md= zNEtx>v^`J;kU!Z2kNYx~^_**}SqbrE>Y9a=1>~BDRSoREEFjmQG2gXwWI4~duGU9H zoqG6lf*Eu*lV`U3_ZdaK$R8=b}Iu-6Jqb1^%AwigHSvRRZE-9+y zbdxgT*NIec>L#Nl4GB)&Wa+GU6(57l?ox?TqH0cei{Wb4T}HM47nWSjx=T#0w6(Cr zYSu%lCrXLRIXx_f%UKUw50|qZtf!oh0o7BgIi*B0r>DhmJ?kl>MFQElp7oT)iuLkZ zv2JSFu$uLeYEmX->tiuo$@*B?xRUjuY+46c$@)rlCR0?-?Q1by%KEZH=&*$)m$JSR zOBol5u*6cReb3mGI;%e4UMvDbdu4esYiIM>nt66`kCYKhqbNX8h zm$Cj9!)2_$EK$n$Ai@&M*Z}!qmZ+OEz(Tl;4Y1ndGB!Y#D(%nRVTomIpj2(LL~hPN zi{UypP)4L7x#wFd8Wf7xBB?rG0-W)iYB< z$+{q5XdhZ62h4{S$pP~rkzDFs4j84f%86TYl!cI=lCc6oWgIU`W)zNB_aUH0!6v7M zD%E#o2$hYpNRFCOGUf$Hj+#-jc*1vlT#lO2QkGOh>WCBs#cV-Zdp;n69W4Vt6(q2u zCHzz^D9Vmejg#<6##jgk&lp=BUBNM|j=ktg44$!STv9Y_I#x=(F+(C#Wx5^*Ai-g* zESU@h=1>|dD^!dpeGV8(<5c1DB0DusO1)WiB}dXYnb3PVkbsPn<&r^HU?h!KFO(Nm z>W#M$j-c@}p*L=>fod^GcG#K4-Y4rGfKO($DO0cduzOxLryD>=d@%Tm<>&2ofI zmNjz%4j5rm)Uy>ti|D< za_U+IQ7nZ7V@(`+Q)Liga3x3HREY?KwkEic(^OtXSkpA{2r8iSI8A0%HY6a^WVISW zeQ+M9tBDn1P1CK!g(2~DnO-q~(3hMpE7dY2I82vy>IDM_zT`)$XeCiI^^uj6zT`*N z>gh{<#2Ji!nk(T;&QNbu!n!=eLg+=#kg@cj7J890WTC?GdwdAI$XV)}O5(o!SyH+| z8G4bkWW;EeUgRtZAEtm0ffqSjN~7mu7^Wc2fGLJ1&X(zV!F475%Gt7Xjes%z%Goj} z*Z1jN3BPiVL^vcTd0#s7UzKrV73336Qk8$g7fm{i%bD>0NphoiEcI{tDc6c?}`L(v{>niZ)k#6jgZsP`a%^?}qffCR%OW^8~2!zHq0sQ`-1rDp1i_^Sy>1LbP6RK^PX z%0(`qOJ&hw@jEF?)N{X*X{*)q)x;ecU&&};-}8x5m}TnIYNBdtnNcPZ!D$&B51$iA za9YN>n~O}8E6{Qkt&Xv>+(KCSa^u6G3?R$t!*HxbxswuF)C%9>RS`L|8*8ZM(bo$4=$7eWSy*3*>_}Oq}HqB zHARD3>n(&zS#KN}lwl!RK0E#bS{V1-4Kl5FNIj4e&v_eUw1Drk#o5G-QWjP#Cx*(X z?+=I4>mm)Nh(v8qAi;N|naeqeNV| zrs~o;R9QWAe<)oQ&J}JQr0Q8T?mI9)nzbDyIQ+=Iq{YM~9GLC!>$8(8KU-v~Jtq#fa}utYY}Z+RSsQ%{(ij_^n%!pZjr&f`ZqB{jqsAqinx9m$I+&$? zvg)N5^OIFCy_lcqIz8z_;Kl4y?dpi9Q~PW!bX)eB6+P}pz4mcMr{@uua9j4Pb9KZm zx%(}I&dPq{$D#~s*)NNi@I8;XgtKx$%F1eDQq*b%66yhM)RO`A95443=acDt; z)d7jP4;|XLgcEa6t*Hx#_Mn;KkqF2^zKe zC1UU% z6&MJdnxn=;iOZrGOCU|R(z!WmIn%j0syXMAby2WBYFQWcqp|WPYdAm0q|6QEC3^o~Fp&h(B>_|}x~>z3}(37V6ZIsw)vWXT$V)Csaa zAxl*cq=xr&QcCT@#(n1rq+w0x>7?--kPGNZdexe932;6sOXmcfOGNYi{H#>K8qU=z zD>XxUAPs9eSEuY4pmTM~3SAPcPg$W$Qs`3@`a$2~;Cr2sGAFZT@*x~Lwrl^lWV`mS zcIc>THW1D7k)s0yaY^s%j4W0)5SZTA8Ck=~2k+~wl(z(#nHX3g4U}HkSy{{|hF;iN z`u6m<;u2xNa}XeamIf50hUOy|*mJg8Mgq^-Y7q%MFJ&sgW&sP*RLfxCd0DKA$p!Sh ztX?yy7Qw&^7Fq^SkOs=2;00MM-(VRPykN123SN{_@6Y10EU+LAmeIkBvY2*+kqhWW ziKw`4Euw>$Y)6&@6r_PNK6ptM)7z-HEO$S!m$;A8*d$`Sw%R1HAPqJN>}6YR641-6 z_90)%R1ahc8V?5B<36#ii$*?{~ZgEM55 z0pt&E0T_0U%LG)1wgLZIi><2*Eq-MHdRCjR7$f#RfJ)KG=^Of(Cacd z8H>w`fL@nbWrG#ElIL{6X?tce`FMvn-g&cavJLhQojP~u*ye9)eq&K8AGv0#uLQbc#7jf!!6u?YeveSFT}CQEJwm}zBuIdIgb)YT)mKHlG<0)7 zR7HIt&BR$1(4L_zGYqQ&+A~zc48v*&n}%e)K$vQPg49rqrE0+T3T2t0Rt?x*q1ts( zt#r~ow{IwIKuE;X;~|I3ecuqmv6LvC-e|v&)cXxk&?QLSNgz?SUnq#LfdtonAvj_h zip>5Y32imNgqrT}i9j1H9n$`xn2wbo7ufzGcu-G4q5_^fIFvS8&1fo~%orR(Jek4m z0u*M5DwHRxrG^+rNCcxHMhK8#G=xIXE(_3y9jac*6O~#HH64jWXlH0BUHeraStwLk zZ$vjN>f8gN@+$fFkVB`^QH`66jQWh1AzM3^1tjYm77Bt! zAi-)_2#%#@1!_1n0#@Z81FPqAMbzh_-fAYC6tc9X6_E6!hlhed5=b8i<#4}SfPVA{ zHMyB+oEl*v^rJ^u2>s|0)aR`}1pPKrMVpJ;>x>LZeRfUv92yCHs~>ElB|Gy){rJf0TC#TO*ljSt}zfL?e(_TB_`P-X4; zKh{!|$U%Y@4cUHv&@CVVocr;^52xk+Nr4VJAN?97DrWz@b z2u4$l6d=K9s*$1)rI@DLw8CCsnz1Y-GSyfXNI<61vN(b>JaTgG|r!EAsicXLouTRj*YpYDpliUdN#lUg@RBNa=~j}2*+YvIWssL%nxBFRXVA9+=fdi zAPkT}^ZB7*MMFsd=ZA1+#SKFS_nZsVj@v|)`~?=mUFL#N5W_+lKo*3sW#nbE4DK=) zhGbTDBw0V1N;Wj|@>T`XO|{&1F0?%80xl#E+D&24{VbHWB(NLqXg&+&<7AONSeS;h zC?xf{94N2_siS%zQFxKDV31(Dh!(7&$Xpx>miEH_bPG}+!+`X23u*rsB%q5!IE+ai?ci;%4A_dF={HAvlVkkI`Xp>)0Efdupmv*Lk7EnkFc z*9kZw^Q(~5HdMqnY>>Xn@=*^Z{3;aOqyP!*S0UUN(o(>(mze=o#J6maTHPQ4U1kOp zNI;jF0ab+5@{rUaBv4Q(NCTx|FAtRsE}0?QFO9o4N+1v-J@=bX+7GJ4o#Mm%Z$jZr zN`tdo=;Ygw<8Nw6fd@$6c_j&1zYSH#eM`SAGS`Hh3fWHb?)JXgP=swoqJP*%5{NY+ z#HdR62vBRmE<1)hX`SzGpG^9&N+`&NBFk?JNxvlKBV5h{3DMW7hwl<4%dWF!;72&? zIA>+~Wzc==Rqwk**{9Zr9KS07bWmn}2*bIwUj`cbjuID4-ie!{o!fSN^tCoOMdwgN zt`Qw70twM^9}=8k4&SRAcZtm8_qGfU2b}L&rYCgjc%HjCl=hQqc(>@0u{nfrU@O>} zN1bj}-`_26%h?)o{1!72wQUWh>%|i!nz%KDi&x-8405-tyn96Nob4e;yNF0+YA928 zI7nc&Qvo+L2Ey!_ap4{z^7n)seQ@ac2DK+tP&@Y^!D3ISm>w-4!D5dYEk!+dZz%0R zFj%;w-y4b+^v$#=8?nzUAE2N~klNNjqU^pgFVif1NnsdKc{OoZvW|4?a zIvz^bfpL)Fd^}V{@3}#O^Ks5qT&qE1!aE)c0tY1hYy=L5Nxuew&n#K?fG8$XXF|cj zV==!A&V&-W3qS&NhF$Qgk3kQdQ#T$IujQSyQqgqIh0^slu9)8g=Ry_r4i_XioC`H< z6u%eEE$+FOLTSILsSk;J?zt2~oSF(O&emQIIl3XBpg@q?l0ZVz%b|4bRD%S=%OS+d zYx_`SUQrDm#xegD3!%=h7)2HLTX7|X6NGkp}KLutRNQ4fpPa;}DOTcHpbC8BAb z`)5cla6-QRK!eAhp=gHh87C;>b(PZ^i`4ayqpcc=D04lOp{)%hM7vIFW6U=}v-nGO zX)S8z{1tMvyNpDph7whEExu@fg=*CFFYF{ZEp&C%9$@Np1&g2%IdyeP=<_fXLN#5T zoLT_}RCmXznOR1yY$r-L(Q^)}520U>p|=bm!KAxWTyNAt`Y_COT2{<1JsmaZ5mBRl zPxMGoF+G8vPD1bB6MnS0r&BW(s07{A+i}We7Ej*O;U#tcQBks97nJ5F6C zJ`mL?W$hTGM2g-LBOmC&PI(74 zVdardaUC&089+ul*_GlI{bnJotkiS5ZPZr6Bgk_;q|cWT!1BOM6_k|(OlPm0_I6P;jLK_Va%olG6g z2MNeTr(T0V5eOttcAN^CiDc^zZ?yHzxVDEbMxs#*!^)GbT0AhAOttWmT|y#mJXP&@ z61RG%f($gt)n%$3vWyo`b#iJ4R)Ki%bd~!QtYW&g3dVt_J6ZJu4vYg&cN#VI=eYz= zy=SPwPl>vz8IEH*i1FPSP8ofufii&1a2n_N#{db50PZYx_9?u*STu$ z)99tSwwD-aoojoEf!4X~B_0?ic#1t=xzC6?IrDAv88)5oWa)JSWdND)G;9)I#|1GV z5jXuzz50y!F7+9%LIm%x6xKqW*o$1mmTP)N{|`Y^#@=EJVR&@06P!mUB=1Ttc8V4c8iVlY5|!~B`f`bdFf6(R z$FhN(jEXLC5FOX;M^tpFYEQ^g+z}7TFdDkliDSPr0k2?~)EBU$F@SM0S z^|`HuQP9tAExaZ9Icwof{%2(g_ZpQ3jAN9mM1FeMmOEa3x<5T~o^~BpZAY;RipLJJ}WE zc|N29578IAAeyIESV#pxRye`EhlH$vT2?r?_rOq4LRQ52xXOA_w5+qzLKyU1X(0@H zt|X+152=LnaYvTVPO0)QiiDc}A`YaGpm$^mKd`yViJB>yfz4G8Ug|vTgDZQ^YIW&F z@kna5RW~D;tDWG4Hz66pTT3&O{PJrHVf^xILhkh;h+lrA zuCx*Nr@pZe#x1{b0$(#B8Mpj~cJQVTLELh!dg~?8A+^@Fh2hGzPH@LHAsMb*>)_0h zC%g$+otujSFN>zBbrw<`kabRQjTB`7Sx3Pbd`id~+-tn^vS^iBZy_}RS?>h5Vo?T= z^$sH1ylJ11HL;sezq~A(rM|O}nt*&~1*-|jcN9$5lH!)*!BdK)$ycO9Apd z1=EXh4&HF7<*#5B`N58y96)|>BHArZ$Q(d^;P~V_p@gi3$6G49EnW?5u#j4SY{12q zVC>ZbWCKUeZ9XIy7X(zlw&IS|Mk`n@ARC<^pr4R@__LAC*Aqu=-Xgf(R^+tWgx3)P zTfX|)I%#LV}s=>HxjX z2`-x@WF4TlaTx0Q>*7dWz4tdvTt8Y!T|jT3M+Y}Ud37-%>v0RV^>3nK zYP*Hh17y1sY^qTPknMI%-NKXl2Cs>{)DGLpw*a!ki5fTU7C?45I8V{F)aOb4I1Tqwdl4qz-ha3+o3JHETjP-yPO~%l#mSo+2!DbL$ARNap)wvfBw_PYKx&klobx2Y&M#dCt%3%XXqm>Sx=QMu7Zm=ekCK{7fb5S{h@=s9yU! zYT0WcjRD!~1lNNTvN0fg9UR4Tdy)Ab@M`$$Q1Sr_$phqoh2#NpfDrA>HRCD$@2}(1 z#X$>c2FO7>#G3(fkT%Y6Z$dW50la$t4N*UJ$SS!xAcw4yn*(x)O6GY&LbkxWDYfbi z?3xZ+NDDv?J3*WdWdJ$M=0EL2TH+*K6@61Yn>uO*YYE6vyP&iL>3?RoGTp!R2%B|QOt5|!{GIiWSZUyAH?U!2tIZnZJEw|wa zTfNsFwVbe!+WOvu}DR;_+%55N4RZT{_moOFUfFvTwUE02`PB(7N23fNztWPmJ8?H60jkeieAr~0e>Wg!tj6vJ z0 z%674O08t0kr6U%r%T}-l0J-eM%vSIL)N8M`c9%N|ZEFo7cjF z{zH6K^n54u{%;oY5Fo!<$U}hqMu=YCALfDe=bf;;|8CpzFd)A>!R@<*d>D}59b75W z(?x3@SZ8;}bn%CUvIaPVfAFB%f^aRytCy(8|)`^zrCk7EJ;%Pzo=gTr5rXXJex z9RA|ITMyPJaI_s(?cWvE^Sa>qNU(-KfvsSdaJt#oJpmS7!X@}B)IQkr2o;6Z*?)-J^LpEApGUR5 zZMDyXMeneu-*6`6^I*|CT(w5P;srce3ahu@7q{p1vDLl+OdqS+7l7$Q&GNQgLcWOb zQCR)*zIZC9zs0-=O#kpr(|Zw^{$ZG&UKiWo5m8vZ{!ejB-T*6V8;ClLXcjLaO@85X{|-}@UN z!`Ov--hGWRx90!BygS@NUIS!!_~zRF8X&{NS>=MQNIPCD81o-&MMi{gZsOYkG9nx? zVY+sJjG%to`d##Q#@ufFNBk|NtZn@r5ETy2loRsrfGGB=-o3nz^LsVy1MFT#S;*^v zjIxl|0U1Te?S3t9AnvBFejx5ljkb_C02v*=>2$mS$mlRaSlS(UlMkQT=Zn@&$5@@e z37wCzI)4)!##qyN6CB2{Y1)9>GrV^#AHLyOTWNbh#)fY?;Ozk!8!lZo(0K?>9)KD$oO!gR8Y&?xOAY(bww=` zY&X3P$b@i29~vd(+ki|UL~ms~GKl!kuGq>>w6$~uWMVk@7)3&M1Y{zcuT8EK-!~oU zDylV~WEI#63Y=sW*a;jag}thQL3RR%Nt|Ze`MuT|0m87Xq$WQmDyp};!TSekR)fxf zP7UAO$aMyEYPh_9t(%bV@B+l4Zn&~P%|hM*WLh}5FoZIIObeGV{@=R{KsN7=4xeu2 zeHZdhxAMLV4%5S)aiHG?hv}Rsbr9!0J~Z0UT{N%rk*)MSKt2lJ+#|mS$VXwsbMbYV{nfH}67e*-cnd~>JsZ$RdR@r4dvoKMLAc+SVFSTFS3#}@J* zKt2xN3^M%(kdMRoG|2rvXhg=F&R!rZpcoF4V8RM5@I+ z+tvBd`8?azyty*Znr1#Y%%f@k#}D{+LGHq^Ec@Z(c=z|u-s0I@P|-MVQ72><9%wCO z8x0NcLN>CA5AKTWPn6q7T zRjY?~h*GL!Ur{L+3B`l*J&0cvPE@!_1HXt%UM(Nr6WNQ^+PG{HL!&9P$!>D zZ)AU=CiN5V)cwNhtv69$(AqVsH&I{Ec6AH-Ap6TOZvQviEh?zj`-}9JAWcj9P=+t9 z41LJ$OZp+2TOV@!lD#lm_(JqW{&KaXzZjdl+zQc`u;sSP`x3UCU4Dy?>WAzVs@nk3 zAa{jD^&@IU7y&6=SwEsygp(EET2gKOk-bu#7$7RKmexK57WEzYSwg*7X-rOr0Af(sMzYp*)1>Z^H;N z>NKsP&+At1RGcjbvRv5Y@;> zeTeK0>XxCRN$v)V`jDs%7WE-f8;HvDQ3}}`)uf@KdG1DwQbcVGZuj`tC?44@)2-LOH)-{2sonf4AXw(Fvc5-%V=GQe5*}GKLk)lQJE{npKg^(OZ zkWr&1619s?lD3UW$lk3+jTB9q?zR$6B5Jo?GA9wWn@gtd<;lq2Lq{nmd4JnCJ9K&9U z8#)!)`_%pq#lyM#Y(u9KwJ(elJ>Af$MD62%)2M04-mhL%;^7wi?Nm68Q{jF)6;30U z{oFfhF4M?mKUY%SHPexOK%H0Ungez+pH9?)aKzL-ou~t>JI9y!BV->`&x{hexd&}K zKO*WNcRaeTkBBJXl=|#_9=B@EVOaTqUIBI$}V{Gi8{qeEX$X00kTi4`^Jf~ zxu-2^0a2&9InwP~K-6jOj{c4dVkJEHTsZB58Z%C`%QzRt>v0B+OYjERdF724we!x? z#2I=(B3y>^;ourANH9Jh4sP~<1mE-FYSrP@N~fgfUJj>SQ(eZ3yW*F*G?WG3lB(}y zQ7)&Xf9vfEWh7&e;B+M%JQe{7PFKQsr%}$w?3j!Rq4@-S)9E)0VXJ-%2e%DX8`;)csy-O+2{VSZ-%~i)IiYE&H#U+d<0j1bOU0l`WHd*sl5D=vc zK1AYk0LeJ68@!VM3I1K&GWs?gNbv9CR(?+K2Aj; zzf?JWISwRPbain#?qP_S>A5}Kv;nTloh%+K+|z}K?Cea6*vnOe+2y_PkrrP#q=Hp1 zH|T7TVAabFIy;ln^mf(H=<=N27Q^a$yFqWG5HP)6D3t-NO!jskS5==PQuX@a`!PX1 zWYxzF?q#45FnwISU*O(4lT=?9AJ)iB-miXmL6oV7ByXtum9H-``brr-~|d`&$fqzrPy<>re=o{w^Lo+z!>2 z_T0g4+DKPqHb@RX*tICW5+rJ73}$KGt|?6w4^cl&#UuD3Mq5Y($00_;Ai;46HOv@y zX{u!?K0A_~rE+m)M7=moxH(AB-GgjDKe#gl65ydO9^JFqrK##+t~!t>E7Svl1`V@F zavtX1L{i1Wh-BkSlN#=-EmdXtx*&iYZjn^=a5uPggj~NYuCQ`0D$QXwLN%X`?_rHF zT0r08K!ELNWA7kg z@1xC-0SWe_&5!{J_MvI~h#6x>49c*OTTY)6fCPszF0Kai zd^L-D9ILi`BwFN*HElv7AYW&(I*nYXp%7ikYF^42EdcbGOT5?x->&nX*tSI}!nzYWfo-3$Z`>QNS`ZfoUpzmZ+68&DKH_nC1r2Ba{JTnv0K6P+es`ccz>6 zv3hNmc)ajT@}&usrMhMXCIA9#XBicML_s!=7=W?&*wDDHkD(W76feqfi^8L5`lz73rw3pg8c&1CXisi zfNkPDT8?!uRKLs-IXMemsqcd#k*RKBeUS$wAPd1GK3;zPaP3eT^x%nt#>% z;5t!49hoaiWPIh~4nI%3%d>&YRQf#8s?IWFk4Oa9WoFcY1lMI|+AYs2m;cwaJ82%K zT_orsgKR%Pm^?uOyxdH?<=KiA!L$nkgKdRHlJg2P?IIV*6=vEkPikc_?ScSurA2bg ztu)gva{aQHb{VlP&oQ@3<i*NZfT_9R#tZ{KgkJDo|^}AM$Ux4qStu_6QMD+Vw zV>uwfcdfA;kl?$PmcvOdn@U-yN-Y#sny#}PXgTZLbp5?4lwl#atafTZg2OsGHC!jN zsq^*f-wW}gVZ9qXP(vah>)qgi8c0CaySU{45E@g#b2qqYTh)$*;=#u^aM{6YBc}oz zvk{Mrvg5R;WcxO6w$*+ba-c9|X&V3u<{OOxfduo7G$6dU0vlv*QvdoyluB)~5H?|x z8(g4789+9<@M*bDRbUe~t5u(fa;eQ0LPne2;4}bb0NL!~i3ykK3Z%BEf}i40e~alt zBm%O<4cuUmEabvLy$!9d=(*cnJd}F*Q*mqI?Jn+y@c^VETfM_oW$%$?TY-Qv?J)fS z68*5l^dv~I-(h+ZB-rmTGi^nRyHh1T!*a3HNQ6YD8i_yxvXc_&y3y`ks`F>KiM7i@ z$Y>YkqnBOLZ}%=2pF`9TFxaiu5VG4s*zVmH!glW_g!__;93XpC$wi`k&K{#(Bm%O> z4UPdp0eymYH}8<;z$xaC@gq-Z5>YvI%;*(~V06rk4Uk}T zjAMhnSDA7iS67#y_l}$1Ln2e%sJ>(l5|HB@8@zc~ne9KJ?punp#}gJpMkh>%qYNM? z*x_8UE0a2@mMz68_(>}mTX@n9?rNe83%Pi^%Sp5{ZRC_H|2ZbnQx-xSIpxN*uZ1#z zoT8t{+eei-iJn#;d@gQHowkB;5dfcjuAEI{U!C%mm;_6C1W^9M7u8;!vP5n zmt0RT@*u(C5*Hedm@1?$tBqfZ8abD3rR<5zW;sI{7ILwiap+a`+&|p38>-4z7WTU9CNpDvzt7gG=XN0e%X z1oSyl^c)Wo%>H!K^`Hdlmq!GW0|F$N{Yi7-np2gUxu$MihW91cT&eGPBN32mZV`R) z4kRGgTzrs@qopdT>uTIGQMuW5TPdHzT{q(xWx(OO8OI=r;W(}j%~bQ;u937Jkq?)P zdWE}2Fbeskpc*yPEuwB)E}G_aiv&v)Qo*TPB-p%z1gCBh3`3evH4552qUJ3ZrJHq+ z1R6jpgy|j$W-^d|sbD4p2^QTWP$w6Y>Ym#>lGZ<>A}d6zCwfyFuA$W_O`nLrhCbH% zKD@#2{F>G;a$q;e(rYM4aPMOT1PShaC?E$)bqd%wq9&~ncjol97)sPP60C?Q1Wexu zRzyzo)!8TgBC7aGL?rq}f=)pyF#RG$v|9`kn0^t=^Bi3@JaBRx>0bOR4KiL{?ppXf0?RqX6k= z!!4yXfdqC)1RE^|n`%(XxKA_GR!5FQBf+%=lmTRD1Re~p3fCYtOs!sptHQ%9 zgyu6W65NwV85W8ls=+&%H8{l$SGlWkCv&)kaEcoq3HD|v1IX|Q_GS%z2pTa$jb4qf za*nVNPH`hFgj3uILhgV@Yhp(qNgJ!g*W&h!QTQ&V?{LNN7SS>qHF{950Wtwkgo4n zfQojXIEsN+(AGrxzsnPL7nVDZ@NN|`M!Iz!+O_v^ml`u8 zf%k(%$TBk$ct0S)Xl4Z74;o^uNCH(L^Y;zY|92qaRINIA{;<)+9CAB2t#|Tj)J;@~&N!wZy z31WoE^~(mE)m%vVxM( znrl3iR8gDMstCfr4}6RNE!+PC4p%_xC=@aQ zT@?wUP$2!nsEsCHo4Q`DybU5JZ?!R4Btmnm%`gTD4yz-<4PcPqusVX^dkbi;4mSM} ze6Hj_8$|PrH4((-xW?C^uGXsWH;ByqwWiyV2u5p-nSunPwKP+@Z*|zjbrD$t-{;|U z#jSOxx7xfM?5~jxp^&eQ7NlQ1Sm!~4*E+8A++WwB64ys$5q!@?y|Pgh%?DwCtY>{B z*kz+6fa@dJN#H{y0D}4sOEf-2((<9Zlkc|e*adHp^!vaVHrAoh#1RD*M1@!v}JVyrN>U!>`NZNMQY?HVrV-r0N zI;VB1(#=Y3!rOw)h7l6MXtPl%NHE$=m2%ps%cgEo$2Z}H$rfnCH$NmYHR5R}79=2B z=%etaYF%n>tGa75ZmMoIiyIOF*%~RKy;hKbY>mKc)wO`yrsi%&E!%7@RL(YA3zf5t zwb1P9QaL}Wf?E)s{Lu_0Bm(kdB%zPCKmzh(1VNx?P)a?|-4#j0_hh$-yo_C(0O-)w zqf&OOMO#Gq)NZ2`B!bayGckb#qurdC*fI6kmOU!8Rb=Pyu@EX{k8xN~29P~;SadB= z%1@9pyGZiC{->?;`)>utS~6Yjg$@kiFCy&uwq<+=G#{U(|!! z#9dDux(DN1kp6NN_)7tP3Q#AEI^9-MWR1Jgm-a z6AkJgwh$`vu!T^OhY4v8f$Dqiu}In}OtZC<58UyHdV33QEq4Av8rdC!6{dW(fa`y?2RUdDvUGbu`Xz%M4@j^%LE*TS ztxwZG$$m*DpLnfp=hsw|?Rchw6x}_@2l}Mx9*{tvWUtbbY~Z~7) zBal-=14@2gP1zwTHa~A>aU{a+I3Ed4_(6ih`AG0-NRZ%gK7tQr(YP9rx)6~SRg-@B z5_Y+rBHk3Fp7)RmEnYC|0Z4GVVAcbWJ{IeNZZXXCqH4PnExu@5Of$V032yN>@Xhoh zmprbL4g6?~l78y&9q4G}?zq+M4XcHsc-53X9=%QR$fT~$Bs!WS2>8bOcJl9K!U@cY(1xghU~m+YQ}Dn zYH-c;HxdE4X8Ic>AlKO64?_Azp4%mw);lWjMPL56s5;+FW~xeiM2*5-qS$5gSfdf! z(lx4H+#_1%b&UpHiBu@AYc$xugG4o5qrt=u64i8#qMAIP1v0xu)xJHVSzb5Gg6?d$ zXu94lH}V_TEm}%Hs{siX-J=pKc{;%*l;5ioV!PhXb%V^Fx{h2 zh{k~G5mn2G=@AX~0F8XB>k$q103iKRaDiyQjW{{>jH>cKehH{o6nAN9RVV}&y`shS=N3SMMXxAM^tp#=?797- zX@jHcz|RN{^o!!Omosc*>b`$eHQ9?rzkf8CeUJ)P{iA{B0TQhGN8x#J5HzMr21Hf& zy_nwzSPV^PKr}Eu6ar>I6vlV2kAZdvM%Avp;=Y`L7DHA8qk%u)*w^mBC?-peoW|7k zpr~rS4}a1yC>nUjNCjq4H2A{_kbWt+Q@5a*O+0s46d{n$fXNs}3wsHiny{6_)o=U6 zE2-h8awLM$@Mti_f&`=CQB1Ks;ci07MyNjf@t$skg|LkyqQPzeWdIow#k|@GbvH$@ zAc{|a?%ppNW{isB*y4FGYRbAttK)7>lF`V~om>3*;E8j5Bgm8u3_kGA~Mi0CKEFlI>WFqsy;u2m3XR= z8i`;uH5xox0trS_qll{0ea@pYrbT`C`4RnRwvRn__icI^K_)~(u3n5m`h|nQ3`lUA z7R4$^4?d4NpN@eH5583g_2^+yBp;-KvYzQibtntybXp9rD&>*-D2fke7Ea#Vwqtwz z>+=6_OGa4a}X!qD~DCB1TBkX$H?OnHi1gzyflCpBY7bg)V0v7r0sKgJ0m-&azc< zO`8=B4x~^9kXcbgjOYdA@!O)a)epa5gD~4dB7n?}1}{KS29Vh_8T!I`{I=*ERptoJ zn&wzY6p%U5U~_^pfXsqoHP= zyC90ca$9-?M?(uZNwV%{G_Qp!dK51%7n<1@iO|u)Xb|rM3BC)XLA(zn_%4j1Z#YJp z(F#6MuO7u1`NUW{5}9gdGLV3L62(l$3A?%HE{>)xRi7V4&}nfL>pt(mG^Z#_RIy`t zfx5(qf<$z|l4!bq_zDtymqe5LlT{$WcS*Ey6TISNHF?}{r)Hzwe;MT(X=(H@^SG<#!3!FIwmd2XqD=7 z9FEBkFmn?)HwR?}v=G_>TH`&u{;TXA1(K>bG4?wcpJom?F+Aer_Et13AOfI1wJuPZK{bLlNC{}PAMcf`me4|kE zk+yHNeHmZGPrlyveLc}47lR1ddZGb|nzkD|0g0Nn(@t*nSs`Rg}-$X_|*bRJzlQT#(?fGa7s|2qY@q$*GF}iFCW?{uE6+ zsOJBQKlT2JW0els?QGT0D(ei6AAdH!A`-#q=V%e#gCN1^XZ9ciuD7$6z3RO)qSozu zjVMTjruP~b4kQaji)(KaBslEl+D8Zeb~a`oCTi^Z?s}-DDl%7;x+nPjEi+-P$kmDk z3C8=PL5LhA81IV)x0OJG@ji}ZKCHZ*)PD8ASv;)V9}VuDAQ6!L(L(yv03-`V5oh3h zaXV`}pcbALRr3zmO7UNq&H-c5C<6`$qFFis4H6skqAadjJE_5jE>M-qBC&^n|3s+N*91L0Rnw{)FP?SqZUbp z9wm}Dsqdgdk407c0x|_8t>TzPlI^i*u;wEd$YWgdIUMiw+*46}Qg+aJ498PkCvFG7 zJ1P8W_49c=gFS5+ArXvD8xcT)(P@gn9mJiiSyj7)y9$?$(vS#7myOaug3)E;AK%5s zT~WO*;q~|x3!&1km<~f3K(4UK_xZIzX}_uSm&5}(zgY+w{bqcDyL>JE7DeQbVZ6IN z_s?kBU+T@vBCqhDbmuvv+)Z(>VY4b^W?c|4_-m&5Ai?iiH25+yNQiKaO9OY$ceAqV zDsly%wz_UaKq6C()F1)5PN_M~+|91Oq1s##Ikj$B2pQclQlktYHz+k7oWj)jj zLYA(F-vIWA1!fA8d9k3mAOY+VLvuN)+(X%W#?NS1*T^#7*-&G=@~C2gU+JyU%ln#?nTpDSw~=L)idsQ0`*`hN&}uh%%{Rh7l6M zXjm-Rvw{SpVKGc5^yKejEyGpAtGJ&sJQhSFkjT_n5RCu{$nY4V5uAnZ_godjmGz-l zF$=30oEp}BKkFW)PG3dcqfFgM1fx-=ZjfL!igoi$qJuraa!{|UzZ{&b97?HPasr!mHEK!Vd4s-8pZeo|v&IFKoW2~GWozf8{oX`nQp zv9aL%1!euhaI-mH9`M|WG2Cyja!s@-JTV5xiZl5GRKTQ|+IwEKs0#vCFv;)(34W7I zqdIzIa~H70d@3yFYCjg`{d0FW#cL$p&1h6#I` zI(i*1N2Xc9IAKq-f^ov0M!{M`HxGL5%or}S=iLwwXUvS@TlDPd2dSG`YWxjc@0?|n zfG5B)q=GLD3RV;0#x+>(u8DFuRskhb? zcbV23enW4|j07OTZkdq)B-kx860~Mr%PB#ry7-Nuv)sr5l6giBkN_^H9PIMe6nzD| zyrxQqq+5T5#gXRlij*4}tX~ zY|J-mOh~rQ`NnWXBDj8IY!)QAenXpW>O+wEZA=H@9`W1ptwpjO-^PNtC31oMHWmco z9$`Dy#B>l21T?V5BH5BP7Ri>ZA(CG8Bc#^GbPx^%kZUcHqkC;Eh&>|LFN;VLo#034 zkFQg?_`pQYx>yh@MIs>UI1;#31qsMHjxf4ok9zJ8v9wL9M_AsP@k0!uQf?_9rKUD0 zy!Eb-+7Js|K_r6FhM1@Kydc4713R4a*Q0FGMpfCBm2x&(2vxK(7MvuY3?Lg>H)q|) zJa=m>ZHIc_l`S&1(n(<>9%J3x6fVwJPHi)dKq44zi{XwF8vzoGw#9Ilms|A5Soe>r zbVN2y{b*E$M5Y=u0}05FG&7FF$JjmFRSz7=7GTIBWSy z^^3}~sh>=Pk;v3oRR1{*NI-rfg#Gh4rTH>D)+gAC!wP0tD|OgR zD@X+7a4h(P4>j_f7s7d(axca|X2nWS4v0^$hi83q{t5n%{pP%5MI1p#Olb(AbhJUqalP+6j zoZ#HT#qCMz?xgx8T{cNU2ioaCA{d=C{SFe0PO=ke=ufhtr&MME82Tv-p~g;G2sL(! z5bjlekz0h05Vh0u=wvJl$wUlsy8?h;pz6_)sHCjKhf*UU5i-KQ?` zAOH;#EV{&lFK>bbi!O1zi@(Dc6l+P>xcaKFyt95+{MB>7f`R?6@!(eOGk##dYaH`B z`|w%M?HNz&4PDpqhtIVlvSw-A$mCx#`ro3Aqgy$epQXZk#Z{LgGN)B9BOg-Huf5_y zzk)Qx}L)>E}k|7b=`x0{S^J`$%bCPc+jQKv4;L}d{k%X zWKp6XNHhnuZU#uO?jH}j6(m^qkE2^@bkDIj2E^4wPvW>T9&C${>L&-cEz$WHId7LBueY z^BiZW!ErUasLZWD*kag~gX0N3B2WmJ!Ex-!`B3nA&mA658x2)e^Si}=C|ISKERiuh zj=}gK*gj8njZpU&lMkmx7%d?YTt~!%y(36)9TA5m)7^QVO&h5SRh13v;WyMf(gLZf zk@3LWK`wwJe-U0Wx9n> z=hNfC6Ok8vollQrjn@$9{3A7skdG{c%KpegsO*mj;e!1lO<{(*Qc_mSnPDNEac0C5 z`d^Y!29O!?+}iOr&|@3VofF4p=le^^7c=I>@ePFAz^D!N__6w`l)NMLaXh#*gG4a; zI3Ceo`~?X{A9K3nBG-n^pQ~zR%G;aHHC>8CNHo_>m>^jw?&%%|2@Z29Jx6mJs&$@P zkSSC7^DGCpX`bc4YUag*XJ&wa!#s9O0iOe?`S{Ca-!R+w-aJS>Wq|~Aempq21nCz> z<&4U_gsau@v_%-=&Ho==ZytB$wEzF_eXYH(z1@53)+UnFT@liKtGi?>WS*yE<{U$X zOrgx@e0CX12uUqOLUEL#h$Ka%fixM?U@Eg5N`xG~&)2oqa(%wP$M^T&ey#O>z1Ldr z^SbbKFzw7`+ z@2r|u&NqSRoh9GY>U(cx`!(C9b=0NdwHm)*PoP3;{0$2rl-FulY}e_?K9zV*4ZDgr zw2ls|oujPmhoU~p%3Qm=b=0$dZg4CDQ8YL7FF+K{RsW(7jy_6zo;|dV4~}^$MQP7V zDN1{uC^}}_M-5@Vy}K^jvwnU`k)ruEeoYM-DD!JrQ`7XekIAI(`^}Uh zW4|ei?l7On{$>q#n2&4|9b3DwhQ)TR2%M)9F0xOwi5jbmf+7M@v?yd3h@wTx?zRbq z$i+3ukx~8E)c?Bod|uN2iE~X5n27rE5Qv_|(xcA%JQaIM4NHn$lH=9(^tRDn4Fm+T z46r1W25HDkR2rSxJHHaYSHlV5S#6_}Yu~G3D^wp@=c_dD+xG3E4)yN`MFgVg{Tjcf z3`EiUHB6&*uI+rKvdsRgU9?~QvXr8XFH0%P_%cy+_Wyik`~&-SyQpLR2Vqzw5XuLd zA84`;gz`a30WG)Om+n}{=X78?xpK#7`z{2yS|u9t zhhe?~g#4lAD_StQfHTT9na}8zyVZ@jbjCLJfcDW&wV$eb4?yd?okq;I7}y-YMF?o&Z-sqS5_T$PN(QUnx7XPG4o` zYs~@oZTLE+C_7&Vn;-+_>oEK4D{uS8&;9^Z@i!?``o2k-a=LHA?60rTx0?O!-0*Em zk<)z}CVt3BC`|nNYT~!nPy7HRwl?@45a!x2@dLtK8zz1i@+n-C*<`QXg^Aw}H7s!+ zO?fYrvDVp7c8QLyUl+1KAd1%2__b0Xiq_SzmZCoQLKSJfJ+lLS?)sD>6Ri&gMFz@x z6;xh(p-l9neX|2z`(yB00`b}(!^aU24L{bj@07G0AR2zG>C!b>1mtuS*p58*Sf?QMdYyDMd|l zW9Tz4Oq%9K^_dzLFI3a~#V+U=b*cX)v;_j8{8Hn;(txD$i)vL9_X~9<>{r{dK5Dny zuW2ee6ZUKPrbPzIullCd7r;f8_>Y>*O(pw3_0cI?{h{y6eb97~JmF6@n|jx5`ge%7 z+-Dc}p-m(PAl9`ZAPM{#+7OTg{tRvCB30zTl0CK|>QO(i^cP1SGO*-7p%8*Iu;f3X zE|P}~vLE+|cIe7)5*w5frEgG5lq(DpQD0CO3Efb#O?Ttd_J))rf4HIKzn&0Er2N;@ zMe>ImOUc*M?f_D|vE;v=fG}??`L8D+%o|IXTZ^_ASK=Y1%xxw6(r(dyTMa4k`J{gR zV%hGN5+{6EJG?!+b&sxXz2S&KJ5kPXK(yad@~4V{XuqYz=^ibgUaW!+E!nd>MY}Z& zO*t~$&`^Ga;0#sy)qh?r!`)i4Gde{b8g4E5PkTb)+*;b&O)Y_NZY?pjJd{#g!X@ca z=5E`pb9BfScc`dGpy?77;?9!2sB?5={hc9oLeX?*$T1L2cPhu~YcEkUciAF8*XXk)KTHDwq z+I?qRa{q{~KxAx*^;sMX2)efv?bxsckE}xLefBKD>LhRd)hh z111_>52w0RMGu#@?T~b~#G>orQoZ|s(@RyXN9?-YqfXr)Nj0duek9eP1Rp7F>*gF# z(C|oUr(Kd+>!m`E+P`;;8oNK5YS7yVkCyyGGcss+wA4IkP#b+z8uV#*soLl``&PH8 zbN6wn2KCwF(mbfGjw@~J`fMm@7+2b@bJChFl}nAcd+tFg#-|!|tap5HG-S{)zT`iD zfM^(B@_%}CsY?8~9k)l+z5C;-2HjkFJk_8c{qd6juM;R}c)YaZPBj-NrASWsw%jwi zv|&QY?`vP0^ym{x+qlavKqwPR{4d>^I7mNkJC`z3?Ze%|J|B``15{QdIlT$oVu$MFz?54!o&zAg=c_5T$)op1trJpMFIlKKn(JuARr4-fRb7}EagU_k>`h@AH8k}PL z@5B1jl+ZsB2xUs>P=QdUs6%zdr^=qUYxbcm&xiiBUs7eym;7=h5X$o<7L(Ma_0u5y zg5AG6UD^x5PY5LK7fK~}K@v!!FO+t6xBr1?c%j7Ye^vTrmH4F+`_EMR8MQB!*yz*F z-es!q>9*7(>fSIt=BL&J=eB7HMbimH7^7<(@hnptwU#sMTYGi9pwXND1&*hJQkz?Z4^UvVRF zR{+dcLX84pz7j@YAk0@Z0_!XJ@=E-AiD%0`-j}cB*Clj1mbzS)nr(aR7oAx@J5(Bh zD4JdJYt=v$%`UO-tTFp?mFx{WXFong-$*Gk(Ho_$-7YUOP~IppbNWX@!9;WH_WMU? zcb^mL`SN7wniKj1AR6X`p$mwHIU2gOq;|Q`Tsv)l_6g^viON)SOMY<^83}2u()aJ> zGSxi0Wlz3;=LPE$2xVTV7a){*su%g=lj;7I`27;g9L*2ntLlBt2Q`uJ zFGDS})q|og-Is+5Adm`JRw}up2tf2MEBUv9f#_XU>fqi6?yrJ=VE=Paw0rjtQVkl! zKPZ*ldMYv!D*2~@foS-k#4CE581|PLm)o-rW?yc3Fav>5mY4huH6WDbCGH1kF5O>f zg`IkEv~&H6P<{fTtOy+}P(tcpwa(RFmRo7dhp>&iGEGG$TUqiqUyy;aQf)wICHkvM zSJ|@;VUKZDN|8IRD*62@WT33lV4?F0{nd?sXeS@Sd4&&CYiQNu!;-%pi3}P(Ecw@s zfN1zo^>hgJG@ufHTFQKBw>UI9xb{;GFd7~PsGe5a-iJm9Hm(j?ArM8YgF^#Rv|0|W zwWR?v;F{83?{jn^fbtOHX86EFz<=fdVXq0kJwTQ6ne%OaL;NfyO7myIw~2-LS@7)v zLZ5rz2EhD0WvYfg557%oB8zWp0dat8=!;VF%tluL%r8RS0%3j;d>aV!3)!p(HoLMC ze^cU-xV;XKx}Wk*i8XhvE?y~{eOpRa7f(E=|3&|6b&)8v6X#3;MEkeFkU+G5D?_T2 zx>ChmYZn~Orp?-rAp#XzD!K=_fKb+!D2hDiN?GqayZsT-j{ANW+<-vb;JeVQfN1zG zG%Fw)zEiX6Ly@kk#Oq3#L1jDeh^W^V>q@L!sh7G+Wm;ddVWM=A z`k)?&`t?CQ5cTV&UMJ74QrbV-OOK3N*Z&yIK%hcPel-OM<;N1MDQa_9sZ1N}OGnb? zHl!3O+EDUaBgjD6P-4$Q>+e?y{bXy8in`YSlv3mbKb8Cu>l%m@Ix#VvLA_L{;61M~8=vT=*H`@1(VtI38N>MZ2Sn{V2k%6+Y#KN48WL~A3 z_{BCH9qrWpm(+loFaHw8M`Y0OOUZ9~0MYP^rg(CStF!|0s~vtcPVp<>)5-jlKq$YK z{C@!gq5N9nP>c?UU!}>{Z+7+3QA7Q2!H)=p@>_{*0?lxNP=3=meoR8)R@^4rk$tDn0ns?mXpmyV&I`#q)9K>5AopXWk`RDRb)-Z?`_ zXDK#67H9ZxN-074Z|V#sDE}?-C$nm+S4Cx=r8w=_sImSJ4(a&Jm!bSo@()cQ1Lcnr ze?0E0X>*od?2E@n9lQQn^2cDWiZ+MxXK7nE_XI-uv(%xZPo)VfFXd?Wwr%SUvfG{< zwb{!VsR`9bxEr6YikhHfV0nADiVQ@@z;a{PWP9%FN_S? zMF`H|GF?-vghQ(tQnr^I&l%4lDMzY?l>H!bb<%8xlo>>H*7|BSn_J5ErQ@TP4Y!p2 zCkLT$ZYk5d$q2wiibkMIc2}$23@uv@W_E2Dnx>OOJHJn?^_Pi6K zJsNIJIchn#mi-?vA_V8wGK&q`l)73i=eDwa>x5|ghTBq(+RANZKUyOM=e9DVwfyU9 zwUyh;cI&@Itr~7mIchAom;LyI5S-h~{^RCqHI`vzd+y&@VH%cl)LMp>{dkQKoMC0g z>!av1uc^et%Nc85`CD{k?eH>lK~0~pQBB`%w>^>R^W8xafhfAW?7vNbD7w2$kFS<` zjcR9vz3fC<>WE-}0u@^JEfol5M46VVNz66s9q+Mkoya8So|Ga*_musAZX*Nbo-*@# zeOO*2G}5*^i4V(>DMhtBvRrh>Nsy6HneR6()n21o9%YA~6m@GDl~Pp6qsm1$K}H73 zs4^4elQGJ*mH7U0=3)EYNzqBQ_m}xV*D~?7GRkOs{K+g6k1qT6OCX9ymkaJ7ArM8Q zRg3x}xK?F(z&?L6Ujz??v zEHh1Wses1VzM_mtDKg5Klp>>y5k;mH5$eW>z_y9I4X3B|cg%Zk`+- zxK73#SN5+^fKU!}a|yjxNFmPqv@xe=p zg*#qe>bO|kAv?r!q^+OX=F8$DxWq&v1x~K>j z7?M?Y^kmsjWr&6PWSRe=cco?Ueu|5Zi91~vZ3Yz>s2aqdDsNVGEr)2hPnBD?@?1vo zr^|lR=(?x|F3>GL0pUI^_miUnp*~&SqT;EH=FgP<`ucTI2`Vrot5N-#(CHGZzqWj) zT-nNV8P+G2{qo;+Q5h~Ua5cP7D*LSpVxdkdGrYUfGQ3YtbG$iJV4!N4pPYK5hWW`! zj;l#4V4Qz8&2kgCz`)h;{%o3M4e!sUIj&_DEv42%1qNy@)aO!aE!5{y>K3e~Rm)L3 zZ^kX)PD#02z@1X|Q>N>pE#OWmGi7q6ZOXD*N^J@i7?N!Y_4$~Nt4|YDlkyDggP}%c1x&J(`2{e8c8{F ziz?SeTR{aDtG@7C!F{pp-*X@u?u+GCbw1fIKnJKjeD}Z5QdR^24Dlkx6Kz*g`Kd*>|`bxFTl-kwpc9q<#sin4~w7^i> z?clze8frVZuR23Tx$9YKEN9;GW0U@t_jOHETF|tv*Vr_hL85KB?%=EXTsq)?eFYPj zuQVvuWe^N?c4(zQ5}Bnv_j%}FUzG$(ZP$UvE+Zr)Kqb8U;Wqqd#qrW6fGb3+$>eKH`;RTu3j3`q0n-tEG( zqU}0s-2fDdr15B8%G7u?PfTYVWarx#&yHHw&rc~DhUTYM&@eP#R?z(Sdd+{|wApi_ zR@FCCiiV#zLqCHIls7e%)y(0aEK!y-OMLC$Pduv9f<70 z@G$~J>q32uXe#*6WJP3=edHXr?YTAJhK7G8^RY!?XaK@lq|EE9?VqZT#WsI#)Y!1N z>^Iy9q)3a){yZFzR2P?9xy>#h8WvCOb8d86$LN{qQ(wI!suVW+KB{SQXrBSc^|Sw2 z5w){_jEtsjQQ;4)`wuwhiUDU0=zB?@=G)n(pK)0Df4+~l&bH*DirHoA)KSsx?W1w! zsRz%9Zpb&=w`Pm}eR^GaMc)C}p4IQNv-)0oUccu1+Oe-i+ilh)L`;44wdmArZb7c5 z&bBU^7E`;;jvmi$UHN};n~K_84y|bxv?-Yj`doa8ORF}KudRgGV=p_5 zxT(wEh}!Ry{pf|PnUv3-XD7$zoXy&rTQEznnl0^;*lcNcDVW3aN!ZjY3g+z1N@J#& znnER?$^20q@%_ggrWTr-)0@z~11_k$l&9IwI{%7( zS6+5j@|bDeIhXc!fqi@TuRG_8K6RH}(eJ9hz5Dd;SU2E;KG!Bez4~2pZr@A$^sc+Q z+7}%?k2$FB;(q7%?NzsP-%AJZ8Y%Az@E|E?0m{rM$Xt>;bxaA$l2`h7j|_yAv)h_hd-le4#Uc!qz1gPq2#vj)yL=Ld#@?Lc)Phfe+B1FZ@`2POMRZdKB_w76 z7u!LnnC?C~ruydMznIc_F<-KdNqaRH)8MrLR}{F!Zr_@_RMU1a&Ca>xFA_bfxrEal zj>HV#T*6U_QbNjAOg|P^TonB&C=Li(zk+%%6_no8^ke*TxkT_XyW5WDkPesqB~M>! zE-Qpm(UqFZwssF&6x9MQw-4=Tx>PU!OP-F@Twc&@RQl;h&E-s|UAAzw{?YC}sz4_D zdq3d0A9VHSRH38Ev-)$W&?A)eXEn$vDOSvYsEdy(qGUkCy(uTjKByV+mlo#sX26d1 zAr37AIyEMnPMcNo*JSvg_ZA1*k9RiB?3nguk0#f6=h#fnac$xpRjCDIm}|Y^L8!gf zI|m50*Ww(?+-9oC>wO6UWbS%jLJ)bo-scS@Nnb(`O0M@M+>Acn{L_`Nib_6?fv&xP z(DKi}v?#rQ`Vta{mVZ)0mleRjB29Kx0$y|n1tqNMn}3y@dlQF}fAQp^mlUsco1~d+ zmRI6c``=$oheI}tasq!Tky}+cMdN6U(x%GE1dmWsWy*V(&Y{$>fS1kix92Se@fV-j z`*}e7&YjIw9d639H=^rJbiBEndGZ2s4#04gAf3&q(fB&p4(eid?ZR(H*TGpTLSIcl z#<{^+|1|@II5k7 zW9?8|=wNng7@DP{aTH9R8=9r3@sLD^W|??uZ@pBBhh;OPIIw8Ws2!GNO+{rWsSI}{ zW$4Opa&Si|0}yq0gfak8cZbTL#$QrecV=zfDW<*(fO%)i)V%G^tp83Y7UrE<|D9e^ z-iK%LMCB611Pkb_0A#)}Jc}3kSTqgK`ZK)5qG@;*Z&Y=ZgznBp)h=FG{|x{Rs&vlg z?o^egd3W=&LJ&^KxTI4Bbp#jkeI)KA7&K|xHzJEyx=d->HzMm_0%a3S^S%*T9MhQ; z;gMN6W_x>UM^n>dWU5Gu5+g$$my*qA{s%pzs>$HUEWWApz2!=LUzP_smUJ{H*WQ<9 zi(lHys<8WAh4CA8_Xo2B$=Cg%!hoo|KU7#*6*k&c*ggQ5qf@3TY;>qFVquO}g&j{u z`1F1#o2hGYaNR*X+hzCfYIe3eHkdZsJe1{L&ImQ5Cahm&GyGX{i<@XhJs*g+vfp$x zW&5uNb8+pXA@5C;_i--o{3ZwELJolBU|h&MkQ|H)d2gb;k9T?R0)RO_Wh(FEL*9vn zIbM0!`fL+9+hca>Zl**1V<|=Y9?SY?WRQXKSe6w(-EnOq^tf%($?VhkcuJA?Jf8L2 zBFIQ6%lhoW2?clgH{R2Bj}iacxSid#liA!p+R3!2C(!i>O_CY)zq9^}ABci~XE_h2 z)!HUnUVFlR)5+}B@I*>UmaNh=lO-#qc_JpSt;A1dGtb!LJDa~%o>EPyytOj%)7fZi zj%J!RU4gU#@MekU0x8AQ*&5f!0LjGDStk9*qH&8#{9HEkf-Nk^7adGinpWaz+04tfp^G`Fc3SYCrpn4o@}JK2F9j&iqf7Q>K_>>(^dcapN&c-ekGfE&F<0FoKX9U46AlmQQEKCd%KeMtHGWG zqUhCNPauk3l|8j5RZ-fr?22woVT-56KnuP-JH;Rwp2dmy4KSb0CR52R7U28)jl3nNi8q4)n9 ziGZjA2UQx0-cMDjFL^(VL*S@7>S5Q)3PuUHH-eHUS*j^ zA`NQI)T=D#^_8Smf*f@FsX(~PvrM1WW`R(bXPH0$oeJB!5`UP@d`yKMYn$%FN9mtA zljr=T*}wL~EXM`pkXx(9K5{k2Z<&cvN1?`mDE~+`rmr6U@_ludC;s={+x)$D zwOW|=mba0*HFm<@rhSh!!E^*-x;5F7yRHO8FHhRKT@)aC*JRm6ITyYB<@=Y}%-44F zeatzvU#i_`w$)sEzq0?@$LxF9S6RQaKp={~%KEKgAd0@qa)3dLD*Wa7x7o~hS+^ad zHMwuIT$oZWx0SZF%4OZ*{HAi&hP(pF>)Mc4AjGvHuRxMmtGwQ%A(Q_s{~?>%h=s4J zvrQj~THD*Yo3mtlL5ft#j7pH`ZMjtP4c*x?o)(n%9N)&_a&7-nRz;%=IZ# z?O}ar55&S;AKF9mKjs@kdjL^7pmRMSrP~mk7>K3~p*;Z6v>~*I7D7M$)gFMT0tZ!U z4?m@<)E<5c?E&G0?At>N<>Kei9zYHTO==H6hxR}$ntl%Lp+(e8?cry&2l*ZUW&T?> zb3{Woip_5eoJrY!sHO=@CAt3H0u=DOC@ z))X8jCj^w!07~_HcJr2L04jdx0lPGS?EIeP3Ywbdc2S1)=|8g3fiA_weSmJqfLPdn zWOvv%#KQd}+w%a=CGyW~bcm1Ci8x@Os+RxE?$9&DLj5y)(7~QcuQxD?jv$it>Fttw z1qZI`bzro^L7uCc92gyXxaWcfMNx=UJpuz&^*AW{E61wGK~c{Gp(cNcep8frAaZT0 zC6YI>Kj60RTFSOJN7^x@D*{oeK)31$MEGX5>_aSSZ;t%VT}x$ma1^4UG7V6-LEpjc;wu~a|e@n!DhH~8{eJ{SaZ?Aq=^znZ*MkJbu44RbAEs?)ANi3Rf ziC8^omS_SEjd(`0PS|(jR5g}o9^|wXL=$w7k z)!!D;Dx4Xp#9{xJ73|grnA$2~fv*+lVQJyD0zE7(JfFyS{67k>olwGq4jst2BQ3l> zrSDMLT|rn0yHj~c3zGa}UCU%ol$fAJd!l!yInkczoyv(T345Z$?aBj8%j)oyqP@`J zkw00{GT90p9&w<_8J(@ryYb-vZ_Q~>l<<(O_C)WF7^$2AwI_OaRM*z)U{7>J#1)ye z_O%j6`~sA#K@wzfz|DQ&HOwv5;zwf2;Q zOslF*DcTvek$-~;87MYtzjJcJsb$2@=)Dn3%uV@^KK_r#EiPZuk5y$~yjt7}iI4$p zmfjm}722sbOYeiS$aenCbg>^DYHAuMM*c)1QAwO%zW_p<81Y7yBQnlB8S$uR zgKcw?+1^h3%~Yfz?yQ*vG0udolbOVmk)PrL(eh-(kxi!s^pqWVnAx}fsg$Cg^r@7h zk>)8;^kh$K%^04x-yUXm>-ls_(VeNMBY%qw88kc{ZR`Ge9f*dfIpdjJHfXKB|CuQ2 z)^<00PCFh!`+B!5iy4QT=7$g(vaO2*&qO8HsX{^FGtu^)6Gs4|@R_LV?lpt6)L305 zem=@fqsFeOJF0Jg`^h1uwf*gI^N$YC%gwaXSVuSdg1lF*U8n9bL8{9-)#cQrF6~1{ zn7I4YkPBkS#ne!hKyooPR3#8KQ&pAnv^rJgi}uqa%q|TtMt;?hK!rwr)es2f#mH|^ zw5h}|M|=$Lc_dTym(}xV65K}lnPJBr$(QX6<_}4c2}IG1sNk9c5JfX0&LU}7qm9y@ z86{7apJ4m7%Qm;i9c?!6tceT3Zb1T}M9Mo95EV1!Q2Op{qtCTh?1@L2j`gnu0}u%1 zmEa0MD6hyB)F-wPdeuI4li{O z2La9t+9a>W%?e%sMAxj~1weGok{6th6SS?wZ$w<$8FREbul5bqyLN5b%9wNPQzx2w zyZ|^~kJqgN=xV zI5*g+t;{;letV4RUOz9?1c6ZIv9q7lEfC7Q(6rkM&9}vq&7NKPOKBKMw@XUAIAk0M zWwA1@2Ljp&E#aW8IktXDN>N#tq!g8Pi6}Zv-%j1oQhUr9X77XfEs$nUozc?ZfyAO` zY4AWGdX~xqogO-)ckn=aR=eyT_MsC@+yfX2s$S@w;D7CsUg(|Re?T<7BmZNEBDX^& zUKVjnXY~oDvAQfOwoAI29c29vB7dX{L~=m4YzZW5A4Gm51Bk*8B0l8ROYNXqSRVOr zY7kUlpsEg*M}8N8Sg6Y*zY9>^L2kE#8cZAv1Q+P~5+K|akzbqu!d(%uIN_27t&02( z!VbyDCD2&}h(%UKeg^@Frd5$&w*e;H##7uD!VapW4gI<#vbdRK>b z4Mgwi(5`osCDy22cduWQYLIQ$gcgkqlr{2iEl2Mt)AA3Br<QYvYf|yq|;2?xH0t6#Gr0t=%azC+Zg)jon-l6 z{_j3|%PxeHBZ6H9fr*swse!2YC3x~qs?uNO$%l6THKnM;zXl&h1`WRk9|oe~SNX6y z?wy2wQ^$QcNvmu4EqF2z;%~u|ff5bf_fD$ZP3pe)-)~czw0eY1q2opd4Vyy84MfAH z&~fjiI{rO$+=l_t2o42T9seGBZemgOd+51=sQO(!_pa2;&Xste$=qPFEw-;4bvL_f zXP;@BZZXi%zBE7FSv54s*gGH5@<3#7HolkNC8|p8&Bk~0yQppk8$Y;!-~t0z zbwAkn!G&0;gH1BHM7a)?c&N$T>2uTp$)SdCXEnSI%F(SsD+sN?L~B*C2;Umi0#SRb zQ!6f!w;8|F3!+khu2O)gy3P1acwi!2ao_zwG~H&{v~#(@Ifn(ibVx?9VH`qmAM0Sa z!;D|H0>T|;nz2a!Rb%ODU{Hdr5+2z%=T z(PV@5JF08A*F^5fF$hh-8h7LvjH-K6RZ90><6kKx7FG8eCX=o}p!NM^%{=<=2G~H*mb(fEU374yX`b6oN^Z@tU)@PfJRo<8nDl{_OpJqnA#{H%evaVj^ ze#5Gy%M7xkP2`p>IwqY4Flf>q&gfK=I*rlB&(aY_(`dt3jHW8NA?FVU2L-_eIwu3d zeK7bZ5blG)KRfDH)tKO)AgI7V)mq+|;Ge`o9b*#zlnq$R8*8Gf`!EK=1-oGp2zRXU z!y*vwSd$EkQLercKWZ}Lz1P(v`Ka;J)OvZ{I1_bGycI-!1D#!f6m?v1ZD5v$FwV5t zBS@3VIKv;`$+sIS@#7{l*{9M#DvyU$8kEYvgKvY#JJ9(y5ZQkR*9M~X-@&yTue7ixuJt6ou2u;ACNv=I1)uePM1lL9wO%rhK zYT`}}f)j&pgHQzws^r@fgKrays)@n3fe9DimSZ+37f+hV9f=1y7&OVnpG-5A)7kqc zjek)FX;eLFlIu=Vh453s$3dt9237L$r&3k&@uz~1BaEh}ypN-a0z4C390V08KV@$N z4ELGf<3PC21RrmZk539d4uT7GJ`RLBDfl=L>LlmmQEoSmN|?;^-h*~S@;SqdUuN1( z9yG;7ySt7ENa4V)a6mFVB{(V&?iAC)z4itql_`eT-sGp9D)Cg4dBvyF3CXF!Pdh1< z7lWUI$UD&aDG=G}i@{OBsC_XwY9~3&wBV>9G6-}T1fptMus$#m_I?UP)3o5Ho#dy} zgY`jBfzE$G^?`}7?_oO06K5Jf?*>5yx()^i zb*3p)-NYLVcV_5eI#=RZCiA+tX=g-dg_`Ruo4#hE{gOTdL@GdM7a$e)TBtZ6)YnXl zy@N1`yk>gro7}H&ti*G8YwIi9^E}hLGRG8alZkYr5}0dvroL%6&I|&{IM~%15S4R{ zzsmrdWy^WC+4-h@{k)W-+L>qk#|<)2<{3V2v?A1~+L>=JIG-=a`6)$; z<_Fh62FiT7hCWvth2FGF&Np4^-%Kg0j5m!x`-F^yjK7=OsLFWDcD}&uTK`r`Q6;=( z{3SnRpuA<+v)eUEg>o;jLoYD(dn`yPYUc}#zqQ<$wDSdqbx7TgZd5ye+wk5*v$|u> zxulQnd4bucvsycW!G3D&ZySH*7Y1p*ZMY|)kC;X^_Jwx$zI;zE3~ojsl!d`VflwAI zo4Y3z2C_wVR9~}4W^j@n`md&yni@`WvRLgP4h+q+)R#W z$csZ?286uWaNy68*^63Y*aS-!%-h)8AlDP%Jg_mjn773EFC`%4C5F8(M`jahsa<>_ z>*PyQing4VrW9>CEfqz}V2!$F|Bl_~BC}u5cT!3jOTQC_1Z2?gj`8c{Ks3B#IyQI> zY&pGaqCMO?d3*cYg=UNWH^(6e47uJMeear*n+-H38&U5Xzf2B9-@B%3w`763Q5#Y3 z+0GZ6UFzQp4Vpl*@SZ8SM+|^a-ZO0A>2O)2Hlp6QLoPNu*T0`qwA=K)DYzXCWT3on zxNxSM>5UP)P0Q@6i_M<(%TkJVnwFV@o7W)&WtnNyE_oHQQ9Df^*q)b|9`zp>zu7|| zln+dK=cEq+LivDZkeobgjJS!n+)liNlZVSwAJqlC=c8P_TWL?b)a+5eGA)bl+pRPOx1Zh^>Au}c!#-ihBo*%4 zt+F#NHT+{~nu_k(tup?yX=9{&cB|wm+EHnYxM%mFZQjr9R{vp2*&51+#-E}@2Fizq z|4%+Lp>VzKBRim}I>-bFJ=U`=5TML-pe{6U9S7Ylxltb=pfH0W(&6miZGf!G3wtl(%XO=bU&kgE>T2VU zXf;MHS-1-`JrGo2HE?xKVvVT{e%uo78u_tHc6%19=7H1VSs&jRrtuzYXIY5Ut<3DNt2hV%MfzO?rTVt6_C*7)g+YyVm$?%w06BerNm+ zH3%v&P^I|0Fd`ER^*h7u={^*uYb9Q1GC$el`kUTct<&sAm+iW$9P61Dv~6#fv@e{Sg{yw`7X+2MyGHw{??S{b~HU zCJS+vAc-Z}KMn77x@3_Zn2X%D@F<`g;DFe8Sgz!jCxK9h~ znt#|UuQeUJj|kb?E3xp1U}2yngN1?U86gYHTzkpF_t+1wHJ$43Nj1pA_vHLk7a1t` z;^>9=wLS>ibl(BZ7I>-vfBf8!S!Z``Ui6UO$`E}JdoSQ z4ctH|59Hdq|9#zC=s~;vKg}-H2ZLu42<5@xnLr5z&)laHkIiKs@kZDO$+0=#mG2`X zJe+e6P3J&Z80b6`h-W^WE4ev45bDFZ?Of~M$9d+%x#a(GqFnb%JT8}c%BRvD(Q!FW zn(R+8yDOFP_Q!vk1G@xe2JbMu@3$Lv;pBGscV`iWGJl6@jnSNFvB zPpG=oCwG_aCxjjZgn57=N2-Gf!4Zi~gcC;;70XV{`32!B5H8q#QUc*l41N!UJ5he` zk|m2zrpam)0fuBXiaePnt5M|1;Qu`;@iV#16kjPlkbFj+(!o;OL$xv~Gyo8(09^wB zB0MQH03d27sR3v!xQDDX*>0?w&fO=6oDhhH$-$IB2?bLE(J)!2)UrkodH%Du_du34 zo(*nHAe3iw{(qH$P@c{Ce~j!Q^qhTrAfEqRN|Du{3!aaRgo5YqTZv!DWnS{d-xtXj za=d}1((kL%PtEybhal<)=!^=)##3|taZ(`Eskzo}`mk@brK~YEw`)h<&yp%)U$nOj zGN;zR7+Nub3Jt9o2<1h!;?olf#h+$3zrmb&*tDEK?6_}I{AoG=UI`G&v>Xq6sVm#B z62F|wyy45TAIe|OarEW@wC$&|%&?PhFb8#+5o(Y?WM+i+1w`8nwXdOS68kCBujHZ~ zTAb0)FLMhG) z{;*$Cx>=!V?WeN77JM9p{edAfs^r&#j}w~+`=+&@n%3)~X>|d@1-qsNg!_7ET0pq3 zt7&P*yq~f-+wOWZGv?VTMNMjUN>P)V?OJ1$=Z3+&TxPMWhrDb&FPBd~A@dp4!~9&- zprKocNT7SgABd6WJJ-w+OXQnrWLB?yfs@Wvu?WBE`c?^p-paXWZiJ8pw)g3{SdNh4 z*u;|C1-U3$j21!`n7oi9h^7TO{(;BIV!F4TY*jgyt-wJzhw$5}Ft%ElmQF?jhSKGc zU6_`RI#`r*CvwoM=_)W7CPsEquCs3KYR5cYn#+7r^%j+*EzS8qLdeRZ?}QA2hy=QV z1JUzN&KEo@tGw%Hy?Ky>?(YqN$iAC%dl$rl-V4?SWhf*c{&M2GUNw2 z-sW?9G30XZ-1%%Zu_QQ|wIVD_F82ckkmb=8sd+Tf2PU5oibQrr&h1bFndq-fGohJ1 zFl3^L?8-C~EQqdBUs;u7b8!-3aMB$LBD^ZK1Ph=ahPvjq5VF7^%b&6Uch#I(R%5;M zqqKUp&+Ri6Oe_@>c^>Kt!V;-VjeI8CW>Xkcy%tb-n*0>V|6aSeUfG* zms*pHk}H6D5Rt$RNo4?0vnE&H;AM&YELa6EQ6mK>b91=zsn6WhJO>1Q9ts0O7U+Bx zn8bQtO*+3Xg7rbj0-g1N$bJ#5AIY`8bh0#3Aj04vEZ_Pv6~?!|^1~Xk@-3h<5)j$1 zLQN%K&|jyrYNWs*E7$rumBqEb$yNVKRlfC2Y6oA?t#8xP$+v(Z!}6_f(+uNV zYeU1~T5VAnmT>+8(KG&HGUpz%eH0$L*q>A-!9WW@~9N`~Q#jJ&| z%SFi_CBW1oI51eE39{>Q{Ktm|`28#KhFs39t*dO=l zl;FUX=8ZZ34k^)aH)^`lKxukb;!S)G+jnp0X^Blaj!8>nPZi|%Fy{o38DKHVI1q)u zhdCz@g}-ag>8M2h5f(&xCSP4ZH$woT>5nki04BozqzHc=pmP0@^G8K`sxAJR^MB!wFSU z1rDmTGk-(gFP#vLsvGi^4!#aF*|{O_IzY%Idt=`92|{QB22I+!yD`{n0us_3qG^%dS`!ftZwbeH`?>7uUr~(F6dXIB(s!Dy+;Jp8XQiRbo zIPbR)dg@W_Tk@`Hlf@bg2Ta!dtHN+^$@>=&fpBlh`xg*0PFwIy}z}JJt9BYV3E1#sNY<(CG(~ z)w_d71JQqXep|N+1|+9<=Y88aKyC1zP)ZO~perRXiS>ot8VvUyl~RY953I!Z<};7m zal_5N)qC?r_f37E@^)X|FGzwYEYNjCKs4T$_Y0Ch6yBHj9npcx%;>ydnFUcSpeq&- zO{0U^fQfMEh`^{Co%bElf$E4J$oq~6geqWArFQ&4s!HiTkoO%C!f1LR?>nLcg&qvH z2B8TUG^rzc@UM=DXjDBIIwD{~_QpO?xfl~VB9MbYl{%s^q1uQ=)0of^0ns!jbVLWL z01t(Z2&9e(98{?zdMGWQI--X{M}#!09ts`Nf$E6HhK>k?CScH{j%aMENgdJH&=Dbw zrm=r@LAP|~>L6bV7M^a5m zNAyVOh>%9rBcUTYP#w{u!NWnQ0tQv;h#pNCw=t4^&4qK6FGN3xhVi`dH|QfKVS(N3=i9?4U|KA)k5D_84jQ zJAFdlFR~t_W;QYJH$XrX3+Rdkq*xO}v4H5GnD-|tf#{!@=X*uR+7D(WE1!AZzCY3& zU416+Cq@TL|D@22K_~>eW(-8(q|l6kD4Z0U@xf|Nlk@&SGzcm%P}OcH=ly|bVxdmX zhifkftKB}Ea^>ehH!mU*?z4G69RtFBHt)|2A1w4--k%u;K?Me?8s>9(KOG}B5%wph z4pzgQl8;&(mh|pGhn+QnsG1V22}ISDJo}v*Hh`#_lIJWyN33~BC4MoVdCB&*X4fNM z%yYF~9rhuz=Coi<5DJ0LBtR5S3)TdpaGI>CTd{{$;u-nOEB0f{t=JiP=7fAX=MI&^ znf8Et%}!lr<|DViMj(o2=66U|86<*_abhb-fKE- z@mjv<{!8yLseC=J$MZUL0g%PlLl%K(em!Ini00Ro#UsefVXBtd_T>A_Q9Wh{A0!YB zvxC)u63YAj8iaMl(dw39)n&d4J#L2K6v}K-4dk`d;Md2$gh^wWCd+>Y`9m0@1K2loTkTFa`k8uqX_;N65jKRLKl*Y2IJX0-*{RRB54aX{t*8zclYJXCa($ z{UahrC>QUBF%Cp|fN|pBK&bEL3+{*#5bC@6sz0J}gqrAk!39AM2Cjyl_wofd`5+eV zd-*zdWcCP^_WdyQfS>{cRb$Qj`GVUQxJ%zm3hBi21L`!Jd2z<8Fr*>yvm+AhLd5dLgEA}H17{p z0imqQv+JSlvLjW8AKJNNxFGpqN|B-u^Zrm3GEhFubAQBT4D^xh@{l>;@Q+f8D&?cR zKU8&OQYjzhlb!V_cT^?*G@tn*@6HJvh2*E|PP9vKl#039IdE41c3T}B7>MZV;J`pq zUM&aKIlrTn$u;@pUBWH^m}^p|3cV(D&BVf7qptaogh`=4v!9ML2iTcoOFd1TP6I;uI=`Ls93aZS&L?|5QSO*Zyf&X% z@0A~eMAK-WtXiR^cIf7cC&*6;G%byI(Qj7;z! zd-@}0r~3b-6dCkCd4K*C87TkBbEf3rgn~i8w@*L9eZ22eiWGgHQe?gFML8y+fPS!T zA2r9-|BzB-%OCRoY4c+eTmB$h>dM72YTE1ULyww{hp$U1YSQcSe(xF?^sdV%>l#t+ z*h;)1pZUdG=vX8-1jjp87W&CKp51pGUhq@UNfeSl1-}EL^QYi<$EsLA+snuCOy19- z-U!71ehwWcP(q>O1ft<*b)53QW7X(3%Kr{KY-5_J^ll8UhYXaBay|LcaXe_0&;0HS zavYMs1wT4Y1=(aTA8+bU-4yaeAbzwd?{9wsp=`>x>yY$=K$LHC^X4dbd?o%PpBWUp z=6O7lf8@D;rJ6ln%Kyyk(ct~N0x0C4A;&;O{|prjMCqTZV7bxpD$c;zUig@4UmX~G z*CR9u_I?C}GcbmuQl3zWZ;Ugy_>7!@`k%%76YR7 zrkIXGGnNyQKS#Ma_OrMXlBxm*u5xs9>}PSr!o4~6v$zvfRfFTGTVgj5Rt3880|<3+ z?2ottp$?9@$>)*<4M}A6M$8G3W^rIQCII0MiG8;LOr-ton7>uxTjR{_-VlF7^48ej zI{2Fmaa$bqNOA-sM?iND0Ep~uaowIF7Ol6%)qT1r_C2u@-w|i5S9>C&cf>_^)A~fI zy)*Xr$v~(Dx>-FC**oKw?gAMQwRgtJ1+rZ3L|NgkIC3{|Kv041Kmbr{D|f})CCi%< zhI?1Md$+_$C(6FVV}HaBgpGi%YJg}S9{aZwfl!CXP2C@qoG5g6s8tYDV4%vpcl%nc zlC11|cc|7A)s>83@j5XR2re*i)uoJxy^j(Lb%gU#l@{51;>b;zK@JA0CJFb%{$x6_ zQ16MW$rJwKVw#b$pVx!n0s~jGgpslT(=cM;j*R`h{zQF{j!Lbn<61y>;FU zrt}3mDrO$9R&`RP8s8UZ9`@CK5~BCT{QZ}l^dwdL{lO3*as+fa0wQ~VFa!{__Xk6q zq{?|9R2>K^Fi_R19`IFHB^_1!1EKCtQnf!A>J9`K7`W2>U}%xVLVYk)-AO`Y(j2SW zfq|-OACu--wLT`UCjE;_OSL}~>J9`K7`UqTheF*E3-_VeSKUd<;@D7iAO{0g)jl>< z9kEcyx~hwECu9FdO2=F|SIi+E14KA4|C^958UD`7zIxEY!zRD(LYzax;>X zlV%4DRN4RW*dJjhHW9A+Ril$-|0jaWfJhb?xU&Bfp|ukW_le*!Co78+g2#Xy3{=^F zLhu-3p-u=Mb8=Lru}lmub8^z`fPt%KH!-*jv2Z5_CqG%u?#bXWAd&?Js+!%C!DEPp z`eg8!leO^kR8qBj(EkJBf&*6@UQY#=Ar|gaav8m%dP*gp9P^*()1ES?)=rN7$KEM& zmS=6<)24I7vq2GoD0()GeLxgFtFce>z*AI}&&A0kxhsGyJeM-%BhLk^5exGq>hDgi z#M9%CNisbZ|wFde9sj}e9an6n3AhZJAcP0?omt+43&!neyeBQ^`6&bE*nG zBhGbd+tpq^*|e}%Pcl39B*3jO6OEV6h&OkKi-C!FYqx*_MAwX%1q_`AI#tG<8RvFx zdzf@>V>e7P-MbSIbZMZN8T-|0q|r4qZtm7bfasbTvuUD#V>wmm6?^eyo_cvD)u3Z6Q4cIJ4B( z!s$r974sNmvM+YJs$oH>1`vq?ohg9`F9_8DMD2o53#ZFyZ--g{K?Me?YT@lr3&cWw zJM>_us}`yYgJFP_2Ivd}gu5`<1qgRxu*>N}i&Cnp0~n~PjzuX|)v-uaJ?}gepLpFOq)CLGD zFi=$+?}yqT7V7(|jl>DgP<1SebM8tN2re*irFmKGSB8j%yG(tun(-MzAH=z4iTi_~ z0s~dG@j>kW^nlnz*nd5pq1vb}Pm@(o3=CXV$MQ5;Rmbu)S!7oPCpaUqKhQY=5bBEH z1VE@Og8!T$Ut1Zd#{eA;Tn*YQQ?3T>m5v+b&aA{A#hKN*8@@ham?X*J<@fi?EHznW~$l0`zNUeb^f2ke%S^Y z3B}vFTN^+$d=j&t+%eHWJ$`C8Of?NXK20^Kz@MfXl+358236pv(x5lH|6Ykdk2Bxd zvtBf3)_xvywqFl~SbWt27m5_ba7xP(lHHZGW9+4(arDN|D!n zol@j=U#A(v>%L*SXFJU_J9PPbGX8_z2^=x^L1P;&tEJIWLjJZ&QlA?b|dt zdE2*2PRksBm+{xyHq*_a4Qo@1oNR6EZ$l#kWo^vL>7mrYKPvGLab|-ZHQgMt)ekZ2 zZn}u_57oiCm>XUlY@62EEvXJRuXg-k$KXIkJ9z zN>OdB5A)N1B(_y`p+{CH^zc+)%LJ&ot+5@n_801C{w~m3d&np7V<7)G)B%GfXI|1{VBc z5)f4b3w}aeJk$S1Fw<&Dz5z2FbDg3tg=5>+HsbGs7d&%}X5 z4l6|4wB5Y!$S(csdR=^FfBx_-83h#SVw3e0L8!wDe5kfesGvIvQS-J<>P|TFVEgkd z)2tOZ8Nm^j3*R9t?UM+T?>p@-ys*&v&Vsv#g^Uh6-dW%r1JxO4D)ERyW|O`7HPfqh zM1iR)bLu#w(u}klU*m-R$U>al-&G*Yk%i{TNoPUSk1XtSqWW?m*}m8Q^L4X-r+W)= zaso?%Q0^^MlCv~|Q0^`4c0f)4gu=1W2MW;`yY_W+#ZeEi4x=hVOvQMhux0xIVLedj zd~ksDXAc$_`gmhr!nrmcAD<{i_+dL?w)tEA!-Y8c^C5&(=!XkUlP_&S2^H%1;|oz) zN8vcz;SF;}{kTHh+$W=Rp5qGJCTneyfikYp`xxPA5wb4{1W3vu#j1~NMC z`FLTQ25!)@5_d`SlYDaWV-(oUdvG+{;pe zuqPDuJKZP9$MaJ*H`iQK|5PDP{0bQz1AVHnU9zMq2<53l&%f84kR-@Q^CbJkTytV| zQcBTj&`Bvp-^!CjVQzy4PDMOhh|cmR(7A_aQ>qS!KATc?4B}Z)k4>l?gLu9W9nqp^ z-T!_Yx_{jj{B_BH=W#>#vOUaJ_Q`psrvCXtoOmn=>I~`gg{^k>De8E{^Mx*lc{k*E z#EW*#JacN77gH z9WI?-XuYpbP$#se7Y^^MQG-}cXw9_QHyJf%rtYXCrZZD_)awf~<&Ml0pm5@Jmc8~( zbM)@B3USiuC=kl5LX+ehQ4q?k!cN_4j!G!JzA(EG9ok}FOf_nOIiRy%UYMOGSPOf0 znxGzHn5_i=mautl1(dmIL(@YHbJfsXbLOvs-Yi553Z}&&b^5=| zt!&K#)BVIZ)4FX6|IM^+^(w=gs$16}o6fsc%|-L(#sAjQm<(S zbw%nmdgx(=yv9*^=wVeM8sMpV;bB!FPCjGfY9`tm?y5rDgF-aiRfS`(@Law4kS3cv z^^hjJ4b+d)WRsU4(qwu0;gdpiwb!dBA3iC>p^Iw{^^-!o>LDSTWIrh!f2B{BCm>eS zT79G*d03q`%5CAUP8+4(d|0hU=}OC+4{Hk11)i!m9@Z4%@MR$m4Xh>9 zFALl69b%z=Sva^?O_@nEx#G=-ujzVytR8vzI`z%%;eMU^rrvz`TE2NsLgmeewYF}t z=~cfr9UEFfS(}axdg@`V#)k6~3Qs+JZznA_ee1tZDXpP=pHlS9!}p@NHeILL>LE+a zN%iXsak9!ouIr$zFEs1mvt0*eePQ<_{h-x`9auYWi8-TTLt2(LP&TAxX#-`0%5p2$ z#?aVSo2ADuHMiGqOmo&2&c-xnZQ*QG&Rn@3I{}B;~l^zY@~S zcZfI~DS`vK)n5CaIk0+b(a(1XMANNBKi>gLsF?Vp#_D)jF*CfFZ1l#-jIPMXqg*vo zQST^5e@p5OL?P}d`bh#1t#=gtBms!lJBkcnj;b3kcNTr4W?3kKzEK0=-dSwt+B6XE zokicKlUdVUMc;#gpx#yV;~o&|T}40cfuP=1OnR^=cP_KQV&+~IW@{eRKNseRB1ir- zvp-j*xyLSkpOx}^ihg2GATsw9{lp%Kx_gR#Vt=lZ9$9pMa|vLsG%{tXNF$4WVoxm0 zkwvDgl%K@N<*1@R2L)na0J;SdAXBJOMSl(oh^A3Re+~+WrcuSl5K(-kE<`Rf1 za8RX1G@Gi@Cyy=qb5IB;^HFTJ&2T;6&Qr2LYn$(W2i_>n)p(FZv4w zARGkfcI|;s#~1y50wC1!MSq{5x6ornf7Jp66_`+~{9>0cE&}#a#R3ud)(M`3Z3Uu9XCw zL|!HqH{UuHLC3`6Hf_=XvNN&Bv0s-a-S^YQ=-I#0l+B(l@^?FX@Q+@7Owx}(V=w>6 zblxXHRMs=a+-6=K(a1j|dHv&8B7y#AbRMsiQDESB!qFg|?fD42?rPyMBXQ;$UrW6l6D0%gvkLvDuTer&WP<=kMHv$z} z+{QgF0wlHPi@ee1Qo|Wu2sPR#X<$I-=|HG26gfpAPX|JMq3A30yh=Q+n0dul=y^y^ zEBbdy&f}eD{$?|H`gw_`1D&S>5q>FnIuNxl1y4UuX-*HG4x*-k&eMTZ!}Q?jz(m+P zIuK3M<><-c_j&U48Nt&*m=fqb9SC0uY#A%pH<=a)QYl0j?1y0g1#m`==79m|r~b;KcjRSIP^D{uB^Mo9|odn ziY=0ri5w8_f}%eKbiNXQyXY^YfuI7D6$)fk#B~8Gw=Hfx&X<= zMR%{Dn!7+*S`s`Lguelu=K>L45eF2rAI2QtqBBm#fh^S8j!-lYJ|-^Tbqe-M9P=h!rWfW(z-a6@j^2 zbL9e+xVkGhV%Co#Q*JacmAWf88VFH$<;t+3gw|cT6)E??7JmI7Q%O5;<#JhLHsU?{ zT|}g~;R=oh{2Q*|Xdr&W6)Xb|hqm}I>N8^Ih#^yOG(?ZpdxZxf4sG*6RB%NzXrkck z0a_q@aHe1&?4~Oi2)F49u4wRx=tp4w9T7<3i+b&&yvHo;t zCw=oed^}2CUG1n|Q!%@(d37y5&9DI=Fezm_4O48xzs?KY#+g5U`Jn%0kjD#E*+uizd0upjy{N1b5B2$ew47C=AWey99ra$yr z6CWr;)tWlFFx6*n6mGUTEOX=&#|UL)`F;)%%E`Jy4m6T(nd0snr)s>}lEBz%s&%*m7I`{kL76eEpeQ?Y%b&o&2g>~GVJErr;~y0W0e=7h delta 82542 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 BtYN64i}1Z3KzxMzf8aK&w!eF>2B*k!m~!pGWe? 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 L+=g{#lh6Ji+K?s~ From 0c89976e49e1bfcefb3589b7861ab76672bdf2fe Mon Sep 17 00:00:00 2001 From: Sandipan Panda Date: Tue, 20 Jan 2026 21:37:43 +0530 Subject: [PATCH 7/9] proto --- proto/dakr_proto_descriptor.bin | Bin 313608 -> 314111 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/proto/dakr_proto_descriptor.bin b/proto/dakr_proto_descriptor.bin index 7c597bce6590d495313978cd9a25f9ca3d0be6ba..e4ec8fc6782e85d3846485bf6a0a5d0d9476453d 100644 GIT binary patch delta 22902 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 z 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 From 15b917736b5e55baf0b38b4f52a77b7a67199a32 Mon Sep 17 00:00:00 2001 From: Sandipan Panda Date: Tue, 20 Jan 2026 22:36:21 +0530 Subject: [PATCH 8/9] proto2 --- gen/api/v1/common.pb.go | 795 +++++++++++++++++------------ gen/api/v1/k8s.pb.go | 18 +- gen/api/v1/metrics_collector.pb.go | 574 ++++++++++----------- 3 files changed, 761 insertions(+), 626 deletions(-) diff --git a/gen/api/v1/common.pb.go b/gen/api/v1/common.pb.go index f7111e61..3453edda 100644 --- a/gen/api/v1/common.pb.go +++ b/gen/api/v1/common.pb.go @@ -7,13 +7,12 @@ package apiv1 import ( - reflect "reflect" - sync "sync" - money "google.golang.org/genproto/googleapis/type/money" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" ) const ( @@ -13924,17 +13923,144 @@ var file_api_v1_common_proto_rawDesc = []byte{ 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x22, 0x46, 0x0a, 0x0a, 0x50, 0x6f, 0x64, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x12, 0x38, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x0a, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0xb0, 0x01, 0x0a, 0x10, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, - 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3e, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x65, 0x78, + 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x22, 0xe4, 0x46, 0x0a, 0x0f, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x35, 0x0a, 0x0b, 0x70, + 0x6f, 0x64, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x64, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x6f, 0x64, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x12, 0x4a, 0x0a, 0x12, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x11, 0x64, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x4e, + 0x0a, 0x14, 0x73, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, 0x53, 0x65, + 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x12, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x66, 0x75, 0x6c, 0x53, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x48, + 0x0a, 0x12, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x10, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x53, 0x65, + 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x4b, 0x0a, 0x13, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x48, 0x00, 0x52, 0x11, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, 0x74, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x35, 0x0a, 0x0b, 0x6a, 0x6f, 0x62, 0x5f, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, + 0x52, 0x0a, 0x6a, 0x6f, 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, + 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x72, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, + 0x52, 0x0e, 0x63, 0x72, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x12, 0x41, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x48, 0x00, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x12, 0x41, 0x0a, 0x0f, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0e, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x48, 0x0a, 0x0b, 0x70, 0x76, 0x63, 0x5f, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x8c, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x76, 0x63, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x12, 0x41, 0x0a, 0x0a, 0x70, 0x76, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x8d, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x09, 0x70, 0x76, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x12, 0x3d, 0x0a, 0x0a, 0x73, 0x63, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x18, 0x8e, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x09, 0x73, 0x63, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x12, 0x3a, 0x0a, 0x0a, 0x6e, 0x73, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x18, 0x8f, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x39, + 0x0a, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x90, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, + 0x6f, 0x64, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x6f, + 0x64, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x68, 0x70, 0x61, + 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x91, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x68, 0x70, 0x61, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x76, 0x70, 0x61, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x18, 0x92, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x56, 0x50, 0x41, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x76, + 0x70, 0x61, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x4c, 0x0a, 0x13, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x18, 0x93, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x48, 0x00, 0x52, 0x11, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x58, 0x0a, 0x17, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x18, 0xe8, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x15, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x12, 0x39, 0x0a, 0x0c, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x18, 0xe9, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, + 0x0b, 0x72, 0x6f, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x4f, 0x0a, 0x14, + 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x18, 0xea, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x12, 0x72, 0x6f, 0x6c, 0x65, 0x42, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x5f, 0x0a, + 0x1a, 0x6b, 0x65, 0x64, 0x61, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xeb, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x64, 0x61, + 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x17, 0x6b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, + 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x61, + 0x0a, 0x1a, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xec, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x72, + 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x18, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x12, 0x68, 0x0a, 0x1d, 0x70, 0x6f, 0x64, 0x5f, 0x64, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x18, 0xed, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, + 0x1a, 0x70, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, + 0x64, 0x67, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x55, 0x0a, 0x16, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x5f, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xee, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, + 0x6f, 0x74, 0x61, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x14, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x12, 0x4c, 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x5f, 0x6a, 0x6f, + 0x62, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xef, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x63, 0x61, 0x6e, + 0x6f, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x11, 0x76, + 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x12, 0x5e, 0x0a, 0x19, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xf2, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, + 0x61, 0x72, 0x6b, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x17, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x41, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x70, 0x6f, 0x64, 0x5f, 0x69, 0x70, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x6f, 0x64, 0x49, 0x70, 0x12, 0x17, 0x0a, + 0x07, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x68, 0x6f, 0x73, 0x74, 0x49, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x71, 0x6f, 0x73, + 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x71, 0x6f, + 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, @@ -15572,314 +15698,353 @@ var file_api_v1_common_proto_rawDesc = []byte{ 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, - 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4d, 0x6f, 0x64, - 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x61, 0x73, 0x73, - 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x13, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x43, 0x0a, 0x11, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x5f, 0x64, 0x72, 0x69, 0x76, - 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x44, 0x72, 0x69, 0x76, - 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x44, 0x72, 0x69, - 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x5f, 0x61, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x12, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x75, - 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, - 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, - 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x52, - 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, - 0x51, 0x0a, 0x12, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, - 0x63, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x11, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0xdc, 0x02, 0x0a, 0x0f, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x44, 0x72, 0x69, 0x76, - 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6f, 0x64, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x2d, 0x0a, 0x13, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, 0x5f, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, - 0x77, 0x65, 0x62, 0x55, 0x69, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x24, 0x0a, 0x0e, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x65, 0x62, 0x55, 0x69, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1e, 0x0a, 0x0b, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, - 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x77, 0x65, 0x62, - 0x55, 0x69, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2d, 0x0a, 0x13, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, - 0x5f, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x65, 0x62, 0x55, 0x69, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, 0x5f, - 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x77, 0x65, 0x62, 0x55, 0x69, 0x49, 0x6e, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, - 0x72, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x6f, 0x72, 0x65, 0x73, - 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x22, 0xa8, 0x02, 0x0a, 0x16, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x2c, 0x0a, 0x12, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x72, - 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6f, 0x6e, - 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x39, - 0x0a, 0x19, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x74, - 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x16, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x74, 0x72, - 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x41, 0x0a, 0x1d, 0x6f, 0x6e, 0x5f, - 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, - 0x72, 0x65, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x1a, 0x6f, 0x6e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x61, - 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x4e, 0x0a, 0x24, - 0x6f, 0x6e, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, - 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x76, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x20, 0x6f, 0x6e, 0x53, 0x75, - 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, - 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0xa1, 0x02, 0x0a, - 0x1a, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6c, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, - 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x10, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, - 0x72, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, - 0x6d, 0x61, 0x78, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x38, 0x0a, 0x18, - 0x73, 0x68, 0x75, 0x66, 0x66, 0x6c, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, - 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, - 0x73, 0x68, 0x75, 0x66, 0x66, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x45, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x38, 0x0a, 0x18, 0x73, 0x68, 0x75, 0x66, 0x66, 0x6c, - 0x65, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, 0x73, 0x68, 0x75, 0x66, 0x66, 0x6c, - 0x65, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x22, 0x8b, 0x08, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, - 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x1b, 0x0a, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, - 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, - 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, - 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, - 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x5f, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x12, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, - 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x13, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x12, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, - 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x69, 0x6e, 0x76, 0x6f, 0x6c, - 0x76, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x31, 0x0a, 0x14, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x13, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, - 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x11, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x2a, 0x20, + 0x12, 0x3b, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, + 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x71, 0x75, 0x65, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, + 0x65, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x56, 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x22, 0xa5, 0x01, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x4a, + 0x6f, 0x62, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, + 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x78, 0x0a, 0x0b, 0x56, + 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0xe6, 0x05, 0x0a, 0x17, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x41, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x23, 0x0a, 0x0d, + 0x73, 0x70, 0x61, 0x72, 0x6b, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, + 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, + 0x0a, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x6d, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x32, 0x0a, 0x15, + 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6d, 0x61, 0x69, + 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x43, + 0x0a, 0x11, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x0f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x5f, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x30, 0x0a, 0x14, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, + 0x70, 0x61, 0x72, 0x6b, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, + 0x64, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x75, 0x73, 0x70, 0x65, + 0x6e, 0x64, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x72, 0x65, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x51, 0x0a, 0x12, 0x64, + 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6c, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x64, 0x79, 0x6e, + 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xdc, + 0x02, 0x0a, 0x0f, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6f, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, + 0x13, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x65, 0x62, 0x55, + 0x69, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, + 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x65, 0x62, 0x55, 0x69, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x1e, 0x0a, 0x0b, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, 0x5f, 0x70, 0x6f, 0x72, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x77, 0x65, 0x62, 0x55, 0x69, 0x50, 0x6f, + 0x72, 0x74, 0x12, 0x2d, 0x0a, 0x13, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, 0x5f, 0x69, 0x6e, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x77, 0x65, 0x62, 0x55, 0x69, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x33, 0x0a, 0x16, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, 0x5f, 0x69, 0x6e, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x13, 0x77, 0x65, 0x62, 0x55, 0x69, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xa8, 0x02, + 0x0a, 0x16, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2c, 0x0a, 0x12, + 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, + 0x75, 0x72, 0x65, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x19, 0x6f, 0x6e, + 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, 0x6f, + 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x41, 0x0a, 0x1d, 0x6f, 0x6e, 0x5f, 0x73, 0x75, 0x62, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x72, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1a, 0x6f, 0x6e, + 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, + 0x65, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x4e, 0x0a, 0x24, 0x6f, 0x6e, 0x5f, 0x73, + 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, + 0x65, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x20, 0x6f, 0x6e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x74, 0x72, 0x79, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0xa1, 0x02, 0x0a, 0x1a, 0x53, 0x70, 0x61, + 0x72, 0x6b, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x6c, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x23, + 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x6f, 0x72, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x73, 0x68, 0x75, 0x66, + 0x66, 0x6c, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x73, 0x68, 0x75, 0x66, + 0x66, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x38, 0x0a, 0x18, 0x73, 0x68, 0x75, 0x66, 0x66, 0x6c, 0x65, 0x5f, 0x74, 0x72, + 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, 0x73, 0x68, 0x75, 0x66, 0x66, 0x6c, 0x65, 0x54, 0x72, 0x61, + 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x8b, 0x08, 0x0a, + 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6f, + 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x77, 0x6e, 0x65, + 0x72, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x77, + 0x6e, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x77, 0x6e, + 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x30, + 0x0a, 0x14, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x69, 0x6e, + 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, + 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, + 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x5f, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x31, + 0x0a, 0x14, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, + 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x29, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, + 0x65, 0x65, 0x6e, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, + 0x24, 0x0a, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x61, 0x67, + 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x41, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x5f, 0x61, 0x67, 0x65, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x41, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x61, 0x67, 0x65, 0x18, 0x2e, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x41, 0x67, 0x65, 0x12, + 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x6c, 0x61, - 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x53, - 0x65, 0x65, 0x6e, 0x12, 0x24, 0x0a, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, - 0x74, 0x5f, 0x61, 0x67, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x41, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x61, 0x67, 0x65, 0x18, 0x2d, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x41, 0x67, 0x65, 0x12, - 0x22, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x61, 0x67, 0x65, - 0x18, 0x2e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, - 0x41, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, - 0x74, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xc9, - 0x01, 0x0a, 0x12, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x75, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x69, 0x64, - 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x12, - 0x1d, 0x0a, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x75, 0x0a, 0x0e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, - 0x75, 0x74, 0x63, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x75, 0x74, 0x63, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, - 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2a, 0x8f, 0x0a, 0x0a, 0x0d, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, - 0x69, 0x6e, 0x64, 0x12, 0x1f, 0x0a, 0x1b, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, - 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, - 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, - 0x4e, 0x54, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, - 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x5f, - 0x53, 0x45, 0x54, 0x10, 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, - 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x46, 0x55, - 0x4c, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x03, 0x12, 0x1e, 0x0a, 0x1a, 0x4b, 0x38, 0x53, 0x5f, 0x4f, - 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x41, 0x45, 0x4d, 0x4f, - 0x4e, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x38, 0x53, 0x5f, 0x4f, - 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x05, - 0x12, 0x1c, 0x0a, 0x18, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, - 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x52, 0x4f, 0x4e, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x06, 0x12, 0x2a, - 0x0a, 0x26, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, - 0x44, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, - 0x4e, 0x54, 0x52, 0x4f, 0x4c, 0x4c, 0x45, 0x52, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x38, - 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x4f, - 0x44, 0x10, 0x08, 0x12, 0x1d, 0x0a, 0x19, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, - 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x53, 0x50, 0x41, 0x43, 0x45, - 0x10, 0x09, 0x12, 0x18, 0x0a, 0x14, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, - 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x10, 0x0a, 0x12, 0x1b, 0x0a, 0x17, - 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, - 0x49, 0x4e, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x0b, 0x12, 0x1d, 0x0a, 0x19, 0x4b, 0x38, 0x53, - 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4f, 0x4e, - 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x0c, 0x12, 0x1b, 0x0a, 0x17, 0x4b, 0x38, 0x53, 0x5f, - 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x45, 0x52, 0x56, - 0x49, 0x43, 0x45, 0x10, 0x0d, 0x12, 0x1e, 0x0a, 0x1a, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, - 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, - 0x4d, 0x41, 0x50, 0x10, 0x0e, 0x12, 0x25, 0x0a, 0x21, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, - 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x45, 0x52, 0x53, 0x49, 0x53, 0x54, - 0x45, 0x4e, 0x54, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x10, 0x0f, 0x12, 0x2b, 0x0a, 0x27, - 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, - 0x50, 0x45, 0x52, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, - 0x45, 0x5f, 0x43, 0x4c, 0x41, 0x49, 0x4d, 0x10, 0x10, 0x12, 0x21, 0x0a, 0x1d, 0x4b, 0x38, 0x53, - 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x4f, - 0x52, 0x41, 0x47, 0x45, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x10, 0x11, 0x12, 0x20, 0x0a, 0x1c, - 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, - 0x41, 0x52, 0x47, 0x4f, 0x5f, 0x52, 0x4f, 0x4c, 0x4c, 0x4f, 0x55, 0x54, 0x10, 0x12, 0x12, 0x2d, - 0x0a, 0x29, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, - 0x44, 0x5f, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x4f, 0x4e, 0x54, 0x41, 0x4c, 0x5f, 0x50, 0x4f, 0x44, - 0x5f, 0x41, 0x55, 0x54, 0x4f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x10, 0x13, 0x12, 0x2b, 0x0a, - 0x27, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, - 0x5f, 0x56, 0x45, 0x52, 0x54, 0x49, 0x43, 0x41, 0x4c, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x41, 0x55, - 0x54, 0x4f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x10, 0x14, 0x12, 0x1f, 0x0a, 0x1b, 0x4b, 0x38, - 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4c, 0x49, - 0x4d, 0x49, 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x15, 0x12, 0x23, 0x0a, 0x1f, 0x4b, - 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, - 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x16, - 0x12, 0x18, 0x0a, 0x14, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, - 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x17, 0x12, 0x20, 0x0a, 0x1c, 0x4b, 0x38, - 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x4f, - 0x4c, 0x45, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x18, 0x12, 0x26, 0x0a, 0x22, - 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, - 0x4b, 0x45, 0x44, 0x41, 0x5f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x44, 0x5f, 0x4f, 0x42, 0x4a, 0x45, - 0x43, 0x54, 0x10, 0x19, 0x12, 0x26, 0x0a, 0x22, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, - 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4b, 0x41, 0x52, 0x50, 0x45, 0x4e, 0x54, 0x45, - 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, 0x1a, 0x12, 0x29, 0x0a, 0x25, + 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xc9, 0x01, 0x0a, 0x12, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x1b, 0x0a, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, + 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x75, 0x0a, 0x0e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x44, + 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x74, 0x63, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x74, 0x63, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x06, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2a, 0x8f, 0x0a, + 0x0a, 0x0d, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x12, + 0x1f, 0x0a, 0x1b, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, + 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x1e, 0x0a, 0x1a, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, + 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x01, + 0x12, 0x1f, 0x0a, 0x1b, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, + 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x5f, 0x53, 0x45, 0x54, 0x10, + 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, + 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x46, 0x55, 0x4c, 0x5f, 0x53, 0x45, + 0x54, 0x10, 0x03, 0x12, 0x1e, 0x0a, 0x1a, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, + 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x41, 0x45, 0x4d, 0x4f, 0x4e, 0x5f, 0x53, 0x45, + 0x54, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, + 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x05, 0x12, 0x1c, 0x0a, 0x18, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, - 0x50, 0x4f, 0x44, 0x5f, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, - 0x55, 0x44, 0x47, 0x45, 0x54, 0x10, 0x1b, 0x12, 0x22, 0x0a, 0x1e, 0x4b, 0x38, 0x53, 0x5f, 0x4f, - 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, - 0x52, 0x43, 0x45, 0x5f, 0x51, 0x55, 0x4f, 0x54, 0x41, 0x10, 0x1c, 0x12, 0x25, 0x0a, 0x21, 0x4b, - 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4b, - 0x55, 0x42, 0x45, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x4e, 0x4f, 0x54, 0x45, 0x42, 0x4f, 0x4f, 0x4b, - 0x10, 0x1d, 0x12, 0x1f, 0x0a, 0x1b, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, - 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x56, 0x4f, 0x4c, 0x43, 0x41, 0x4e, 0x4f, 0x5f, 0x4a, 0x4f, - 0x42, 0x10, 0x1e, 0x12, 0x1a, 0x0a, 0x16, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, - 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x45, 0x43, 0x52, 0x45, 0x54, 0x10, 0x1f, 0x12, - 0x20, 0x0a, 0x1c, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, - 0x4e, 0x44, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, - 0x20, 0x12, 0x28, 0x0a, 0x24, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, - 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x4c, - 0x45, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x21, 0x12, 0x22, 0x0a, 0x1e, 0x4b, - 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, - 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x22, 0x12, - 0x1b, 0x0a, 0x17, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, - 0x4e, 0x44, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x10, 0x23, 0x12, 0x25, 0x0a, 0x21, + 0x43, 0x52, 0x4f, 0x4e, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x06, 0x12, 0x2a, 0x0a, 0x26, 0x4b, 0x38, + 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x45, + 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x4f, + 0x4c, 0x4c, 0x45, 0x52, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, + 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x4f, 0x44, 0x10, 0x08, 0x12, + 0x1d, 0x0a, 0x19, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, + 0x4e, 0x44, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x53, 0x50, 0x41, 0x43, 0x45, 0x10, 0x09, 0x12, 0x18, + 0x0a, 0x14, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, + 0x44, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x10, 0x0a, 0x12, 0x1b, 0x0a, 0x17, 0x4b, 0x38, 0x53, 0x5f, + 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x47, 0x52, + 0x45, 0x53, 0x53, 0x10, 0x0b, 0x12, 0x1d, 0x0a, 0x19, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, + 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, + 0x45, 0x52, 0x10, 0x0c, 0x12, 0x1b, 0x0a, 0x17, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, + 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, + 0x0d, 0x12, 0x1e, 0x0a, 0x1a, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, + 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x50, 0x10, + 0x0e, 0x12, 0x25, 0x0a, 0x21, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, + 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x45, 0x52, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x54, 0x5f, + 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x10, 0x0f, 0x12, 0x2b, 0x0a, 0x27, 0x4b, 0x38, 0x53, 0x5f, + 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x45, 0x52, 0x53, + 0x49, 0x53, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x43, 0x4c, + 0x41, 0x49, 0x4d, 0x10, 0x10, 0x12, 0x21, 0x0a, 0x1d, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, + 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, + 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x10, 0x11, 0x12, 0x20, 0x0a, 0x1c, 0x4b, 0x38, 0x53, 0x5f, + 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x41, 0x52, 0x47, 0x4f, + 0x5f, 0x52, 0x4f, 0x4c, 0x4c, 0x4f, 0x55, 0x54, 0x10, 0x12, 0x12, 0x2d, 0x0a, 0x29, 0x4b, 0x38, + 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x48, 0x4f, + 0x52, 0x49, 0x5a, 0x4f, 0x4e, 0x54, 0x41, 0x4c, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x41, 0x55, 0x54, + 0x4f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x10, 0x13, 0x12, 0x2b, 0x0a, 0x27, 0x4b, 0x38, 0x53, + 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x56, 0x45, 0x52, + 0x54, 0x49, 0x43, 0x41, 0x4c, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x41, 0x55, 0x54, 0x4f, 0x53, 0x43, + 0x41, 0x4c, 0x45, 0x52, 0x10, 0x14, 0x12, 0x1f, 0x0a, 0x1b, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, + 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, + 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x15, 0x12, 0x23, 0x0a, 0x1f, 0x4b, 0x38, 0x53, 0x5f, 0x4f, + 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, + 0x43, 0x45, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x16, 0x12, 0x18, 0x0a, 0x14, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, - 0x53, 0x50, 0x41, 0x52, 0x4b, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x10, 0x24, 0x2a, 0x48, 0x0a, 0x0b, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x45, 0x6e, - 0x75, 0x6d, 0x12, 0x22, 0x0a, 0x1e, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x42, 0x59, 0x5f, 0x45, - 0x4e, 0x55, 0x4d, 0x5f, 0x44, 0x45, 0x53, 0x43, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, - 0x42, 0x59, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x41, 0x53, 0x43, 0x10, 0x01, 0x2a, 0x94, 0x02, - 0x0a, 0x15, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x27, 0x0a, 0x23, 0x4c, 0x41, 0x42, 0x45, 0x4c, - 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, - 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x1e, 0x0a, 0x1a, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, - 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x10, 0x01, + 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x17, 0x12, 0x20, 0x0a, 0x1c, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, + 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x42, + 0x49, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x18, 0x12, 0x26, 0x0a, 0x22, 0x4b, 0x38, 0x53, 0x5f, + 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4b, 0x45, 0x44, 0x41, + 0x5f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x44, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x19, + 0x12, 0x26, 0x0a, 0x22, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, + 0x49, 0x4e, 0x44, 0x5f, 0x4b, 0x41, 0x52, 0x50, 0x45, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x52, 0x45, + 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, 0x1a, 0x12, 0x29, 0x0a, 0x25, 0x4b, 0x38, 0x53, 0x5f, + 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x4f, 0x44, 0x5f, + 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x55, 0x44, 0x47, 0x45, + 0x54, 0x10, 0x1b, 0x12, 0x22, 0x0a, 0x1e, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, + 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, + 0x51, 0x55, 0x4f, 0x54, 0x41, 0x10, 0x1c, 0x12, 0x25, 0x0a, 0x21, 0x4b, 0x38, 0x53, 0x5f, 0x4f, + 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4b, 0x55, 0x42, 0x45, 0x46, + 0x4c, 0x4f, 0x57, 0x5f, 0x4e, 0x4f, 0x54, 0x45, 0x42, 0x4f, 0x4f, 0x4b, 0x10, 0x1d, 0x12, 0x1f, + 0x0a, 0x1b, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, + 0x44, 0x5f, 0x56, 0x4f, 0x4c, 0x43, 0x41, 0x4e, 0x4f, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x1e, 0x12, + 0x1a, 0x0a, 0x16, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, + 0x4e, 0x44, 0x5f, 0x53, 0x45, 0x43, 0x52, 0x45, 0x54, 0x10, 0x1f, 0x12, 0x20, 0x0a, 0x1c, 0x4b, + 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, + 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x20, 0x12, 0x28, 0x0a, + 0x24, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, + 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x42, 0x49, + 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x21, 0x12, 0x22, 0x0a, 0x1e, 0x4b, 0x38, 0x53, 0x5f, 0x4f, + 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, + 0x52, 0x4b, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x22, 0x12, 0x1b, 0x0a, 0x17, 0x4b, + 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, + 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x10, 0x23, 0x12, 0x25, 0x0a, 0x21, 0x4b, 0x38, 0x53, 0x5f, + 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x50, 0x41, 0x52, + 0x4b, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x24, 0x2a, + 0x48, 0x0a, 0x0b, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x22, + 0x0a, 0x1e, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x42, 0x59, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, + 0x44, 0x45, 0x53, 0x43, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x42, 0x59, 0x5f, 0x45, + 0x4e, 0x55, 0x4d, 0x5f, 0x41, 0x53, 0x43, 0x10, 0x01, 0x2a, 0x94, 0x02, 0x0a, 0x15, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x12, 0x27, 0x0a, 0x23, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, + 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, + 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, + 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, + 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, + 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x22, 0x0a, 0x1e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, - 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, - 0x49, 0x4e, 0x10, 0x02, 0x12, 0x22, 0x0a, 0x1e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, - 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, - 0x45, 0x58, 0x49, 0x53, 0x54, 0x53, 0x10, 0x03, 0x12, 0x2a, 0x0a, 0x26, 0x4c, 0x41, 0x42, 0x45, - 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, - 0x54, 0x4f, 0x52, 0x5f, 0x44, 0x4f, 0x45, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x45, 0x58, 0x49, - 0x53, 0x54, 0x10, 0x04, 0x12, 0x1e, 0x0a, 0x1a, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, + 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x45, 0x58, 0x49, 0x53, + 0x54, 0x53, 0x10, 0x03, 0x12, 0x2a, 0x0a, 0x26, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, - 0x47, 0x54, 0x10, 0x05, 0x12, 0x1e, 0x0a, 0x1a, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, - 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, - 0x4c, 0x54, 0x10, 0x06, 0x2a, 0xa6, 0x01, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x26, 0x0a, - 0x22, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, - 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, - 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x57, 0x4f, 0x52, 0x4b, + 0x44, 0x4f, 0x45, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x45, 0x58, 0x49, 0x53, 0x54, 0x10, 0x04, + 0x12, 0x1e, 0x0a, 0x1a, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, + 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x47, 0x54, 0x10, 0x05, + 0x12, 0x1e, 0x0a, 0x1a, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, + 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4c, 0x54, 0x10, 0x06, + 0x2a, 0xa6, 0x01, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x22, 0x57, 0x4f, 0x52, + 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x49, 0x4c, + 0x54, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x41, 0x43, 0x54, 0x49, + 0x56, 0x45, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x44, + 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x49, 0x4c, 0x54, - 0x45, 0x52, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, - 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x42, 0x4f, 0x54, 0x48, 0x10, 0x03, 0x42, 0x84, 0x01, - 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x43, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x30, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, 0x72, 0x6f, 0x2d, - 0x69, 0x6e, 0x63, 0x2f, 0x7a, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x6e, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, - 0x41, 0x58, 0x58, 0xaa, 0x02, 0x06, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x06, 0x41, - 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x12, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, - 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x07, 0x41, 0x70, 0x69, - 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x45, 0x52, 0x5f, 0x42, 0x4f, 0x54, 0x48, 0x10, 0x03, 0x42, 0x84, 0x01, 0x0a, 0x0a, 0x63, 0x6f, + 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, 0x72, 0x6f, 0x2d, 0x69, 0x6e, 0x63, 0x2f, + 0x7a, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, + 0x02, 0x06, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x06, 0x41, 0x70, 0x69, 0x5c, 0x56, + 0x31, 0xe2, 0x02, 0x12, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x07, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/gen/api/v1/k8s.pb.go b/gen/api/v1/k8s.pb.go index 8ac3d60c..7e1b709d 100644 --- a/gen/api/v1/k8s.pb.go +++ b/gen/api/v1/k8s.pb.go @@ -7,13 +7,12 @@ package apiv1 import ( - reflect "reflect" - sync "sync" - money "google.golang.org/genproto/googleapis/type/money" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" ) const ( @@ -9635,12 +9634,13 @@ var file_api_v1_k8s_proto_rawDesc = []byte{ 0x6c, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3c, 0x0a, 0x0f, 0x7a, 0x78, 0x70, 0x5f, 0x6e, 0x65, 0x74, 0x6d, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, - 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x7a, 0x78, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x38, - 0x0a, 0x0d, 0x7a, 0x78, 0x70, 0x5f, 0x68, 0x65, 0x6c, 0x6d, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x7a, 0x78, 0x70, - 0x48, 0x65, 0x6c, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3c, 0x0a, 0x0f, 0x7a, 0x78, 0x70, 0x5f, - 0x6e, 0x65, 0x74, 0x6d, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x7a, 0x78, 0x70, 0x4e, 0x65, 0x74, 0x6d, 0x6f, 0x6e, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x45, 0x0a, 0x14, 0x7a, 0x78, 0x70, 0x5f, 0x6e, 0x65, 0x74, 0x6d, + 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x6c, 0x6d, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x7a, 0x78, 0x70, 0x4e, 0x65, 0x74, + 0x6d, 0x6f, 0x6e, 0x48, 0x65, 0x6c, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x0c, 0x64, + 0x61, 0x6b, 0x72, 0x5f, 0x6f, 0x70, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x64, 0x61, 0x6b, 0x72, 0x4f, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3f, 0x0a, 0x11, 0x64, 0x61, 0x6b, 0x72, 0x5f, 0x6f, 0x70, 0x5f, 0x68, diff --git a/gen/api/v1/metrics_collector.pb.go b/gen/api/v1/metrics_collector.pb.go index 714b6c3e..655ced1a 100644 --- a/gen/api/v1/metrics_collector.pb.go +++ b/gen/api/v1/metrics_collector.pb.go @@ -7,14 +7,13 @@ package apiv1 import ( - reflect "reflect" - sync "sync" - _go "github.com/prometheus/client_model/go" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" structpb "google.golang.org/protobuf/types/known/structpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" ) const ( @@ -3403,307 +3402,278 @@ var file_api_v1_metrics_collector_proto_rawDesc = []byte{ 0x73, 0x72, 0x63, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x72, 0x63, 0x50, 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x72, 0x63, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x72, 0x63, 0x50, 0x6f, - 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x70, 0x6f, - 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x64, 0x73, 0x74, 0x50, 0x6f, 0x72, - 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x07, 0x74, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, - 0x72, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, - 0x72, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x78, 0x5f, 0x70, 0x61, - 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x78, 0x50, - 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x78, 0x5f, 0x70, 0x61, 0x63, - 0x6b, 0x65, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x78, 0x50, 0x61, - 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x61, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x72, 0x63, 0x50, 0x6f, + 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0xfd, 0x03, 0x0a, 0x20, 0x53, + 0x65, 0x6e, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, + 0x63, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, + 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x49, 0x74, 0x65, 0x6d, 0x52, + 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x64, 0x6e, 0x73, 0x5f, 0x6c, 0x6f, + 0x6f, 0x6b, 0x75, 0x70, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6e, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x49, 0x74, + 0x65, 0x6d, 0x52, 0x0a, 0x64, 0x6e, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x73, 0x12, 0x55, + 0x0a, 0x09, 0x69, 0x70, 0x32, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x70, 0x32, 0x64, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x70, 0x32, 0x64, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x2e, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, + 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x88, 0x01, 0x01, 0x1a, 0x3c, 0x0a, 0x0e, 0x49, 0x70, 0x32, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x22, 0x4c, 0x0a, 0x21, 0x53, 0x65, + 0x6e, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xa5, 0x02, 0x0a, 0x08, 0x4c, 0x6f, 0x67, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, - 0xef, 0x01, 0x0a, 0x0d, 0x44, 0x6e, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x49, 0x74, 0x65, - 0x6d, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x70, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x70, 0x12, 0x16, - 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, - 0x65, 0x64, 0x5f, 0x69, 0x70, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, - 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x49, 0x70, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x12, 0x20, 0x0a, 0x0c, 0x73, 0x72, 0x63, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x72, 0x63, 0x50, 0x6f, - 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x72, 0x63, 0x5f, 0x70, 0x6f, 0x64, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x73, 0x72, 0x63, 0x50, 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x22, 0xfd, 0x03, 0x0a, 0x20, 0x53, 0x65, 0x6e, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, - 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x69, - 0x74, 0x65, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x72, 0x61, 0x66, 0x66, - 0x69, 0x63, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x36, 0x0a, - 0x0b, 0x64, 0x6e, 0x73, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6e, 0x73, 0x4c, - 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0a, 0x64, 0x6e, 0x73, 0x4c, 0x6f, - 0x6f, 0x6b, 0x75, 0x70, 0x73, 0x12, 0x55, 0x0a, 0x09, 0x69, 0x70, 0x32, 0x64, 0x6f, 0x6d, 0x61, - 0x69, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x72, 0x61, - 0x66, 0x66, 0x69, 0x63, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x49, 0x70, 0x32, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x09, 0x69, 0x70, 0x32, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x2e, 0x0a, 0x10, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, - 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x1a, 0x3c, 0x0a, 0x0e, 0x49, 0x70, - 0x32, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x12, 0x0a, - 0x10, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x22, 0x4c, 0x0a, 0x21, 0x53, 0x65, 0x6e, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0e, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0xa5, 0x02, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x38, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x26, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x18, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x39, 0x0a, 0x0b, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x44, 0x0a, 0x19, 0x53, 0x65, 0x6e, 0x64, 0x54, - 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, - 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x70, - 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x4d, 0x0a, - 0x13, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, - 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x22, 0xb3, 0x01, 0x0a, - 0x14, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x6f, - 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x6f, - 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x54, - 0x6f, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x4b, 0x0a, 0x0f, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x6f, 0x4d, - 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x2a, 0xa3, 0x02, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x1a, 0x0a, 0x16, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, - 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x44, 0x44, 0x10, 0x01, - 0x12, 0x15, 0x0a, 0x11, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, - 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x45, 0x56, 0x45, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x03, 0x12, 0x17, - 0x0a, 0x13, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x54, - 0x41, 0x44, 0x41, 0x54, 0x41, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x56, 0x45, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x10, 0x05, 0x12, - 0x20, 0x0a, 0x1c, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, - 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, - 0x06, 0x12, 0x20, 0x0a, 0x1c, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, - 0x44, 0x10, 0x07, 0x12, 0x22, 0x0a, 0x1e, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x54, - 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x08, 0x12, 0x1f, 0x0a, 0x1b, 0x45, 0x56, 0x45, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x53, 0x4e, - 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x10, 0x09, 0x2a, 0xa6, 0x0e, 0x0a, 0x0c, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x53, - 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x53, 0x4f, - 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x10, 0x01, - 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x50, 0x4f, 0x44, 0x10, 0x02, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x53, 0x4f, 0x55, - 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x53, 0x50, 0x41, - 0x43, 0x45, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x04, 0x12, 0x1b, 0x0a, - 0x17, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, - 0x4e, 0x44, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x53, 0x10, 0x05, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, - 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, - 0x49, 0x43, 0x45, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x06, 0x12, 0x1d, 0x0a, - 0x19, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, - 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x07, 0x12, 0x20, 0x0a, 0x1c, - 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, - 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x51, 0x55, 0x4f, 0x54, 0x41, 0x10, 0x08, 0x12, 0x1c, - 0x0a, 0x18, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x09, 0x12, 0x1e, 0x0a, 0x1a, - 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x45, 0x46, 0x55, 0x4c, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x0a, 0x12, 0x1c, 0x0a, 0x18, - 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x41, - 0x45, 0x4d, 0x4f, 0x4e, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x0b, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, - 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x50, 0x4c, - 0x49, 0x43, 0x41, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x0c, 0x12, 0x28, 0x0a, 0x24, 0x52, 0x45, 0x53, - 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x49, - 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x4f, 0x4c, 0x4c, 0x45, - 0x52, 0x10, 0x0d, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x0e, 0x12, 0x1a, 0x0a, 0x16, 0x52, 0x45, - 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x52, 0x4f, 0x4e, - 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x0f, 0x12, 0x29, 0x0a, 0x25, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x53, 0x49, 0x53, 0x54, 0x45, - 0x4e, 0x54, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x43, 0x4c, 0x41, 0x49, 0x4d, 0x10, - 0x10, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x56, 0x4f, - 0x4c, 0x55, 0x4d, 0x45, 0x10, 0x11, 0x12, 0x1f, 0x0a, 0x1b, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, - 0x43, 0x4c, 0x41, 0x53, 0x53, 0x10, 0x12, 0x12, 0x19, 0x0a, 0x15, 0x52, 0x45, 0x53, 0x4f, 0x55, - 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, - 0x10, 0x13, 0x12, 0x19, 0x0a, 0x15, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x14, 0x12, 0x1f, 0x0a, - 0x1b, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, - 0x4e, 0x47, 0x52, 0x45, 0x53, 0x53, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x10, 0x15, 0x12, 0x20, - 0x0a, 0x1c, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x16, - 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x17, 0x12, 0x1e, 0x0a, 0x1a, 0x52, 0x45, 0x53, 0x4f, - 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x42, - 0x49, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x18, 0x12, 0x1e, 0x0a, 0x1a, 0x52, 0x45, 0x53, 0x4f, - 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, - 0x52, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x19, 0x12, 0x26, 0x0a, 0x22, 0x52, 0x45, 0x53, 0x4f, - 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, - 0x52, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x1a, - 0x12, 0x2b, 0x0a, 0x27, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x4f, 0x4e, 0x54, 0x41, 0x4c, 0x5f, 0x50, 0x4f, 0x44, - 0x5f, 0x41, 0x55, 0x54, 0x4f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x10, 0x1b, 0x12, 0x29, 0x0a, - 0x25, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, - 0x45, 0x52, 0x54, 0x49, 0x43, 0x41, 0x4c, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x41, 0x55, 0x54, 0x4f, - 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x10, 0x1c, 0x12, 0x27, 0x0a, 0x23, 0x52, 0x45, 0x53, 0x4f, - 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x44, 0x49, - 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x55, 0x44, 0x47, 0x45, 0x54, 0x10, - 0x1d, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, 0x5f, - 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x1e, 0x12, 0x2c, 0x0a, 0x28, 0x52, 0x45, 0x53, 0x4f, - 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, - 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x49, - 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x1f, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x52, - 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, 0x20, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x45, 0x53, - 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, - 0x47, 0x5f, 0x4d, 0x41, 0x50, 0x10, 0x21, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x45, 0x53, 0x4f, 0x55, - 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x43, 0x52, 0x45, 0x54, 0x10, - 0x22, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x23, 0x12, 0x1f, - 0x0a, 0x1b, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, 0x24, 0x12, - 0x24, 0x0a, 0x20, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, - 0x52, 0x43, 0x45, 0x10, 0x25, 0x12, 0x19, 0x0a, 0x15, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, - 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x10, 0x26, - 0x12, 0x1a, 0x0a, 0x16, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x43, 0x53, 0x49, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x10, 0x27, 0x12, 0x1b, 0x0a, 0x17, - 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4b, 0x41, - 0x52, 0x50, 0x45, 0x4e, 0x54, 0x45, 0x52, 0x10, 0x28, 0x12, 0x19, 0x0a, 0x15, 0x52, 0x45, 0x53, - 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x44, - 0x4f, 0x47, 0x10, 0x29, 0x12, 0x1f, 0x0a, 0x1b, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x52, 0x47, 0x4f, 0x5f, 0x52, 0x4f, 0x4c, 0x4c, 0x4f, - 0x55, 0x54, 0x53, 0x10, 0x2a, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, - 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4b, 0x45, 0x44, 0x41, 0x10, 0x2b, 0x12, 0x24, 0x0a, - 0x20, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4b, - 0x45, 0x44, 0x41, 0x5f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x44, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, - 0x54, 0x10, 0x2c, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4b, 0x45, 0x44, 0x41, 0x5f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x44, - 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x2d, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x53, 0x49, 0x5f, 0x44, 0x52, 0x49, 0x56, - 0x45, 0x52, 0x10, 0x2e, 0x12, 0x26, 0x0a, 0x22, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x53, 0x49, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, - 0x45, 0x5f, 0x43, 0x41, 0x50, 0x41, 0x43, 0x49, 0x54, 0x59, 0x10, 0x2f, 0x12, 0x23, 0x0a, 0x1f, - 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x4f, - 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x48, 0x4d, 0x45, 0x4e, 0x54, 0x10, - 0x30, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x4b, 0x55, 0x42, 0x45, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x4e, 0x4f, 0x54, 0x45, - 0x42, 0x4f, 0x4f, 0x4b, 0x10, 0x31, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x4f, 0x4c, 0x43, 0x41, 0x4e, 0x4f, 0x5f, - 0x4a, 0x4f, 0x42, 0x10, 0x32, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, - 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x50, 0x41, 0x52, 0x4b, 0x5f, 0x41, 0x50, 0x50, - 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x33, 0x12, 0x2d, 0x0a, 0x29, 0x52, 0x45, - 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x43, 0x48, 0x45, - 0x44, 0x55, 0x4c, 0x45, 0x44, 0x5f, 0x53, 0x50, 0x41, 0x52, 0x4b, 0x5f, 0x41, 0x50, 0x50, 0x4c, - 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x34, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x53, - 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x52, 0x4f, 0x4e, 0x5f, - 0x56, 0x4f, 0x4c, 0x43, 0x41, 0x4e, 0x4f, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x35, 0x12, 0x22, 0x0a, - 0x1e, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, + 0x26, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x34, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x39, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x44, 0x0a, 0x19, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, + 0x79, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, + 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, + 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x4d, 0x0a, 0x13, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, + 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x22, 0xb3, 0x01, 0x0a, 0x14, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, + 0x0a, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, + 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x6f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x54, 0x6f, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x4b, + 0x0a, 0x0f, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x6f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0xa3, 0x02, 0x0a, 0x09, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x41, 0x44, 0x44, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x02, + 0x12, 0x15, 0x0a, 0x11, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, + 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54, 0x41, 0x10, 0x04, + 0x12, 0x16, 0x0a, 0x12, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, + 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x10, 0x05, 0x12, 0x20, 0x0a, 0x1c, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, + 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x06, 0x12, 0x20, 0x0a, 0x1c, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, + 0x45, 0x52, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x07, 0x12, 0x22, 0x0a, 0x1e, + 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, + 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x08, + 0x12, 0x1f, 0x0a, 0x1b, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x10, - 0x4d, 0x2a, 0x8c, 0x01, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x19, - 0x0a, 0x15, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, - 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x01, 0x12, 0x12, - 0x0a, 0x0e, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x49, 0x4e, 0x46, 0x4f, - 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, - 0x57, 0x41, 0x52, 0x4e, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, - 0x56, 0x45, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x4c, - 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x46, 0x41, 0x54, 0x41, 0x4c, 0x10, 0x05, - 0x32, 0xa0, 0x05, 0x0a, 0x17, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x0c, - 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1b, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x53, 0x65, 0x6e, 0x64, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x20, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x61, 0x0a, 0x14, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, - 0x72, 0x79, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x65, 0x6c, 0x65, - 0x6d, 0x65, 0x74, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, 0x19, 0x53, 0x65, 0x6e, 0x64, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, - 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x12, 0x58, 0x0a, 0x11, - 0x53, 0x65, 0x6e, 0x64, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x4c, 0x6f, 0x67, - 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x54, - 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, - 0x64, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x53, 0x65, 0x6e, 0x64, 0x4e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, - 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x4e, 0x6f, 0x64, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, - 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x42, 0x8e, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x42, 0x15, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x30, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, 0x72, 0x6f, 0x2d, - 0x69, 0x6e, 0x63, 0x2f, 0x7a, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x6e, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, - 0x41, 0x58, 0x58, 0xaa, 0x02, 0x06, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x06, 0x41, - 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x12, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, - 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x07, 0x41, 0x70, 0x69, - 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x09, 0x2a, 0xa6, 0x0e, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x53, + 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x4f, 0x44, 0x10, 0x02, + 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x53, 0x50, 0x41, 0x43, 0x45, 0x10, 0x03, 0x12, 0x17, 0x0a, + 0x13, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, + 0x56, 0x45, 0x4e, 0x54, 0x10, 0x04, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, + 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, 0x44, 0x50, 0x4f, 0x49, 0x4e, 0x54, + 0x53, 0x10, 0x05, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x41, 0x43, 0x43, + 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x06, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, + 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x52, 0x41, + 0x4e, 0x47, 0x45, 0x10, 0x07, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, + 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, + 0x51, 0x55, 0x4f, 0x54, 0x41, 0x10, 0x08, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x45, 0x53, 0x4f, 0x55, + 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, + 0x45, 0x4e, 0x54, 0x10, 0x09, 0x12, 0x1e, 0x0a, 0x1a, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, + 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x46, 0x55, 0x4c, 0x5f, + 0x53, 0x45, 0x54, 0x10, 0x0a, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, + 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x41, 0x45, 0x4d, 0x4f, 0x4e, 0x5f, 0x53, 0x45, + 0x54, 0x10, 0x0b, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x5f, 0x53, 0x45, 0x54, + 0x10, 0x0c, 0x12, 0x28, 0x0a, 0x24, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x4f, 0x4c, 0x4c, 0x45, 0x52, 0x10, 0x0d, 0x12, 0x15, 0x0a, 0x11, + 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4a, 0x4f, + 0x42, 0x10, 0x0e, 0x12, 0x1a, 0x0a, 0x16, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x52, 0x4f, 0x4e, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x0f, 0x12, + 0x29, 0x0a, 0x25, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x50, 0x45, 0x52, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x56, 0x4f, 0x4c, 0x55, + 0x4d, 0x45, 0x5f, 0x43, 0x4c, 0x41, 0x49, 0x4d, 0x10, 0x10, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, + 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x53, + 0x49, 0x53, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x10, 0x11, 0x12, + 0x1f, 0x0a, 0x1b, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x10, 0x12, + 0x12, 0x19, 0x0a, 0x15, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x13, 0x12, 0x19, 0x0a, 0x15, 0x52, + 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x47, + 0x52, 0x45, 0x53, 0x53, 0x10, 0x14, 0x12, 0x1f, 0x0a, 0x1b, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, + 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x47, 0x52, 0x45, 0x53, 0x53, 0x5f, + 0x43, 0x4c, 0x41, 0x53, 0x53, 0x10, 0x15, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x53, 0x4f, 0x55, + 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, + 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x16, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x53, + 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, + 0x17, 0x12, 0x1e, 0x0a, 0x1a, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, + 0x18, 0x12, 0x1e, 0x0a, 0x1a, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, + 0x19, 0x12, 0x26, 0x0a, 0x22, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, + 0x42, 0x49, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x1a, 0x12, 0x2b, 0x0a, 0x27, 0x52, 0x45, 0x53, + 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x4f, 0x52, 0x49, 0x5a, + 0x4f, 0x4e, 0x54, 0x41, 0x4c, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x41, 0x55, 0x54, 0x4f, 0x53, 0x43, + 0x41, 0x4c, 0x45, 0x52, 0x10, 0x1b, 0x12, 0x29, 0x0a, 0x25, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, + 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x45, 0x52, 0x54, 0x49, 0x43, 0x41, 0x4c, + 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x41, 0x55, 0x54, 0x4f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x10, + 0x1c, 0x12, 0x27, 0x0a, 0x23, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x42, 0x55, 0x44, 0x47, 0x45, 0x54, 0x10, 0x1d, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x45, + 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x4f, 0x44, 0x5f, + 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, + 0x1e, 0x12, 0x2c, 0x0a, 0x28, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, + 0x43, 0x45, 0x5f, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x1f, 0x12, + 0x21, 0x0a, 0x1d, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, + 0x10, 0x20, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x50, 0x10, 0x21, + 0x12, 0x18, 0x0a, 0x14, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x53, 0x45, 0x43, 0x52, 0x45, 0x54, 0x10, 0x22, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x45, + 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, + 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x23, 0x12, 0x1f, 0x0a, 0x1b, 0x52, 0x45, 0x53, 0x4f, 0x55, + 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x52, 0x45, + 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, 0x24, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x45, 0x53, 0x4f, + 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, + 0x4e, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, 0x25, 0x12, 0x19, + 0x0a, 0x15, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x10, 0x26, 0x12, 0x1a, 0x0a, 0x16, 0x52, 0x45, 0x53, + 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x53, 0x49, 0x5f, 0x4e, + 0x4f, 0x44, 0x45, 0x10, 0x27, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, + 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4b, 0x41, 0x52, 0x50, 0x45, 0x4e, 0x54, 0x45, 0x52, + 0x10, 0x28, 0x12, 0x19, 0x0a, 0x15, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x44, 0x4f, 0x47, 0x10, 0x29, 0x12, 0x1f, 0x0a, + 0x1b, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, + 0x52, 0x47, 0x4f, 0x5f, 0x52, 0x4f, 0x4c, 0x4c, 0x4f, 0x55, 0x54, 0x53, 0x10, 0x2a, 0x12, 0x16, + 0x0a, 0x12, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x4b, 0x45, 0x44, 0x41, 0x10, 0x2b, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, + 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4b, 0x45, 0x44, 0x41, 0x5f, 0x53, 0x43, 0x41, + 0x4c, 0x45, 0x44, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x2c, 0x12, 0x21, 0x0a, 0x1d, + 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4b, 0x45, + 0x44, 0x41, 0x5f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x44, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x2d, 0x12, + 0x1c, 0x0a, 0x18, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x43, 0x53, 0x49, 0x5f, 0x44, 0x52, 0x49, 0x56, 0x45, 0x52, 0x10, 0x2e, 0x12, 0x26, 0x0a, + 0x22, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, + 0x53, 0x49, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x43, 0x41, 0x50, 0x41, 0x43, + 0x49, 0x54, 0x59, 0x10, 0x2f, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, + 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x41, 0x54, + 0x54, 0x41, 0x43, 0x48, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x30, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, + 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4b, 0x55, 0x42, 0x45, + 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x4e, 0x4f, 0x54, 0x45, 0x42, 0x4f, 0x4f, 0x4b, 0x10, 0x31, 0x12, + 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x56, 0x4f, 0x4c, 0x43, 0x41, 0x4e, 0x4f, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x32, 0x12, 0x23, + 0x0a, 0x1f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x53, 0x50, 0x41, 0x52, 0x4b, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x10, 0x33, 0x12, 0x2d, 0x0a, 0x29, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x44, 0x5f, 0x53, + 0x50, 0x41, 0x52, 0x4b, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x10, 0x34, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x43, 0x52, 0x4f, 0x4e, 0x5f, 0x56, 0x4f, 0x4c, 0x43, 0x41, 0x4e, 0x4f, + 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x35, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, + 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, + 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x10, 0x4d, 0x2a, 0x8c, 0x01, 0x0a, 0x08, 0x4c, + 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, + 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, + 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, + 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4c, + 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x57, 0x41, 0x52, 0x4e, 0x10, 0x03, 0x12, + 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, + 0x4c, 0x5f, 0x46, 0x41, 0x54, 0x41, 0x4c, 0x10, 0x05, 0x32, 0xa0, 0x05, 0x0a, 0x17, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x65, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x58, 0x0a, 0x11, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x65, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x61, 0x74, + 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x14, 0x53, 0x65, + 0x6e, 0x64, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, + 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, + 0x19, 0x53, 0x65, 0x6e, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x28, 0x01, 0x12, 0x58, 0x0a, 0x11, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x65, 0x6c, + 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, + 0x79, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, + 0x74, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x70, 0x0a, 0x19, 0x53, 0x65, 0x6e, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x72, + 0x61, 0x66, 0x66, 0x69, 0x63, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x28, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x65, 0x6e, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x72, 0x61, 0x66, 0x66, + 0x69, 0x63, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x8e, 0x01, 0x0a, + 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x15, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, 0x72, 0x6f, 0x2d, 0x69, 0x6e, 0x63, 0x2f, 0x7a, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, + 0x3b, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x06, 0x41, + 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x06, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, + 0x12, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0xea, 0x02, 0x07, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( From e422dd78ff75a38a1ba975743ebdf4c07b4f3f7e Mon Sep 17 00:00:00 2001 From: Sandipan Panda Date: Tue, 20 Jan 2026 23:36:53 +0530 Subject: [PATCH 9/9] =?UTF-8?q?clean=20up=20informer=20on=20cache=E2=80=91?= =?UTF-8?q?sync=20timeout?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/collector/kubeflow_notebook_collector.go | 6 ++++++ internal/collector/scheduled_spark_application_collector.go | 6 ++++++ internal/collector/spark_application_collector.go | 6 ++++++ internal/collector/volcano_job_collector.go | 6 ++++++ 4 files changed, 24 insertions(+) diff --git a/internal/collector/kubeflow_notebook_collector.go b/internal/collector/kubeflow_notebook_collector.go index 681adc1f..2800824c 100644 --- a/internal/collector/kubeflow_notebook_collector.go +++ b/internal/collector/kubeflow_notebook_collector.go @@ -226,6 +226,12 @@ func (c *KubeflowNotebookCollector) Start(ctx context.Context) error { "timeout": "30s", }, ) + // Prevent leaked informer on startup failure. + if stopCh, ok := c.informerStopChs[notebookKey]; ok { + close(stopCh) + delete(c.informerStopChs, notebookKey) + delete(c.informers, notebookKey) + } return fmt.Errorf("timeout waiting for Kubeflow Notebooks cache to sync") } diff --git a/internal/collector/scheduled_spark_application_collector.go b/internal/collector/scheduled_spark_application_collector.go index 03a50267..bc41157b 100644 --- a/internal/collector/scheduled_spark_application_collector.go +++ b/internal/collector/scheduled_spark_application_collector.go @@ -220,6 +220,12 @@ func (c *ScheduledSparkApplicationCollector) Start(ctx context.Context) error { "timeout": "30s", }, ) + // Prevent leaked informer on startup failure. + if stopCh, ok := c.informerStopChs[appKey]; ok { + close(stopCh) + delete(c.informerStopChs, appKey) + delete(c.informers, appKey) + } return fmt.Errorf("timeout waiting for ScheduledSparkApplications cache to sync") } diff --git a/internal/collector/spark_application_collector.go b/internal/collector/spark_application_collector.go index 64108047..08efbc0c 100644 --- a/internal/collector/spark_application_collector.go +++ b/internal/collector/spark_application_collector.go @@ -220,6 +220,12 @@ func (c *SparkApplicationCollector) Start(ctx context.Context) error { "timeout": "30s", }, ) + // Prevent leaked informer on startup failure. + if stopCh, ok := c.informerStopChs[appKey]; ok { + close(stopCh) + delete(c.informerStopChs, appKey) + delete(c.informers, appKey) + } return fmt.Errorf("timeout waiting for SparkApplications cache to sync") } diff --git a/internal/collector/volcano_job_collector.go b/internal/collector/volcano_job_collector.go index ee5873cf..db8c789a 100644 --- a/internal/collector/volcano_job_collector.go +++ b/internal/collector/volcano_job_collector.go @@ -226,6 +226,12 @@ func (c *VolcanoJobCollector) Start(ctx context.Context) error { "timeout": "30s", }, ) + // Prevent leaked informer on startup failure. + if stopCh, ok := c.informerStopChs[jobKey]; ok { + close(stopCh) + delete(c.informerStopChs, jobKey) + delete(c.informers, jobKey) + } return fmt.Errorf("timeout waiting for Volcano Jobs cache to sync") }